Thank you for your interest in contributing! This document covers everything you need to get started.
- Getting Started
- Making Changes
- Submitting a Pull Request
- Reporting Issues
- Project Architecture
- Legal
| Requirement | Version | Notes |
|---|---|---|
| Python | 3.10+ | 3.14 recommended (matches the workspace) |
| pip | recent | Or uv if you prefer |
| Git | 2.x+ | For cloning and version control |
-
Fork the repository on GitHub.
-
Clone your fork locally:
git clone https://github.com/<your-username>/toolsmith.git cd toolsmith
-
Install in editable mode with dev dependencies:
pip install -e ".[dev]" -
Verify your environment:
python -m pytest -q
All development is based on the master branch.
-
Create a feature branch from
master:git checkout -b feature/your-feature master
-
Use descriptive branch names:
feature/add-xyz,fix/tally-skip-count,refactor/simplify-module-resolution.
- Follow PEP 8.
- Add type hints to public functions; target the language level in
pyproject.toml(requires-python). - Use Google-style docstrings (
Args:/Returns:) - match the existing modules. - Keep each tool's real logic in its library module (
toolsmith.gradle,toolsmith.tally, ...);toolsmith.serverstays a thin typed veneer that forwards to it. - A new MCP tool should also be usable from the command line (a
main()/python -mentry), so its logic is testable without the MCP layer. - Name a new tool, subcommand, or skill after who can use it rather than after what it parses:
gradle_*/toolsmith gradle <cmd>for anything that needs a Gradle build,java_*/toolsmith java <cmd>for anything that acts on Java source. State that requirement in the docstring or the skilldescriptionas well - that text is what gets matched when the tool is chosen.
Write commit messages in imperative mood (e.g., "Add compile-only default to gradle_verify" not "Added ...").
- Keep the subject line under 72 characters.
- Use the body to explain why, not just what.
- Reference issue numbers where applicable (e.g.,
Fixes #12).
# Run the full suite
python -m pytest -q
# Run one test file
python -m pytest tests/test_imports.py -q
# Run one test
python -m pytest tests/test_imports.py::test_idempotent -qNew behavior needs a test. The reorderer in particular must stay idempotent and byte-faithful to the IntelliJ Default layout - add a fixture rather than loosen an assertion.
-
Push your branch to your fork:
git push origin feature/your-feature
-
Open a Pull Request against the
masterbranch of the upstream repository. -
In the PR description:
- Summarize the changes and motivation.
- Reference any related issues.
- Note any breaking changes to a tool's return shape.
-
Respond to feedback - maintainers may request changes before merging.
- Use GitHub Issues to report bugs or request features.
- For bugs, include: the tool and arguments, expected vs. actual result, and your Python / FastMCP versions.
- For a new tool request, describe the repeated operation it would replace and the ideal return shape.
This project is part of the Simplified-Dev ecosystem. Unlike its sibling Java libraries, it is a local, executable MCP server (not a JitPack-published artifact), so it uses a Python src/ layout:
src/toolsmith/ - server + one module per tool
tests/ - pytest suite
pyproject.toml - packaging + the `toolsmith` entry point
By contributing, you agree that your contributions will be licensed under the Apache License 2.0, the same license that covers this project.