Skip to main content

Audit and compile Python tool schemas for LLM agents before your agent uses them.

Project description

mcp-toolsmith

PyPI version Python versions CI License: MIT

mcp-toolsmith audits and compiles Python tool schemas for LLM agents, catching vague names, missing argument descriptions, oversized schemas, overlapping tools, and prompt-injection-like metadata before your agent uses them.

Pre-1.0: JSON tool files and static Python audits are safe by default. Python execution requires --execute and should only be used with trusted code. The public API may change before 1.0.0.

Tool schemas are not just documentation. In MCP, OpenAI-style tool calling, and agent frameworks, names, descriptions, and input schemas shape whether the model chooses the right tool and fills arguments correctly.

Install

pip install mcp-toolsmith

For local development:

python -m pip install -e ".[dev]"

Why?

LLM agents often fail because tool metadata is ambiguous.

Bad tool:

def run(query: str):
    """Run operation."""
    return query

Audit:

mcp-toolsmith audit tools.py --execute --all-public --fail-on warning

Output:

WARNING name.vague: Tool name is too generic for reliable tool selection.
WARNING description.too_short: Tool description is too short to guide model selection.
WARNING schema.arg_description_missing: Argument descriptions are missing for: query.

Usage

Audit JSON tool definitions

JSON tool definitions are safe by default:

mcp-toolsmith audit tools.json

Example JSON input:

{
  "tools": [
    {
      "name": "search_docs",
      "description": "Search project documentation by natural language query.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Question or topic to search for."
          },
          "limit": {
            "type": "integer",
            "description": "Maximum number of results to return.",
            "default": 5
          }
        },
        "required": ["query"]
      }
    }
  ]
}

Example audit output:

OK Audited 1 tool(s) from tools.json
Errors: 0  Warnings: 0

search_docs [mcp] ~55 schema tokens
  No findings

Compile tools

Compile to MCP-style tool definitions:

mcp-toolsmith compile tools.json --target mcp

Compile to OpenAI-style function definitions:

mcp-toolsmith compile tools.json --target openai

Audit trusted Python files

Python files are parsed statically by default:

mcp-toolsmith audit tools.py

This discovers @tool-decorated functions without executing the file:

from mcp_toolsmith import tool


@tool
def search_docs(query: str, limit: int = 5) -> list[str]:
    """Search project documentation by natural language query.

    Args:
        query: Question or topic to search for.
        limit: Maximum number of results to return.
    """
    return []

Static mode maps common annotations such as str, int, float, bool, dict, and list[str]. Use runtime execution only for trusted files when you need full Pydantic/runtime schema generation:

mcp-toolsmith audit tools.py --execute
mcp-toolsmith compile tools.py --target mcp --execute

Use --execute only for trusted files. In both static and execution modes, default Python discovery only includes functions decorated with @tool.

Use decorator arguments to override the generated tool name or description:

from mcp_toolsmith import tool


@tool(
    name="search_project_docs",
    description="Search project docs and return matching document IDs.",
)
def search_docs(query: str, limit: int = 5) -> list[str]:
    """Search project documentation by natural language query."""
    return []

Use --all-public to include every public top-level function and Pydantic model:

mcp-toolsmith audit tools.py --execute --all-public
mcp-toolsmith compile tools.py --target mcp --execute --all-public

--all-public is mainly a compatibility path for early alpha behavior. For new Python tool files, prefer @tool.

Use --fail-on to tune CI behavior:

mcp-toolsmith audit tools.py --fail-on error
mcp-toolsmith audit tools.py --fail-on warning
mcp-toolsmith audit tools.py --fail-on never

The default is error.

More copy-pasteable examples live in examples.

Python API

from mcp_toolsmith import audit_file, compile_file

report = audit_file("tools.json")
report.print()

mcp_tools = compile_file("tools.json", target="mcp")
openai_tools = compile_file("tools.json", target="openai")

For trusted Python files:

report = audit_file("tools.py")
report = audit_file("tools.py", execute=True)
mcp_tools = compile_file("tools.py", target="mcp", execute=True)

To opt into broad Python discovery:

report = audit_file("tools.py", execute=True, all_public=True)
mcp_tools = compile_file("tools.py", target="mcp", execute=True, all_public=True)

Checks

Check Why it matters
Vague tool names Agents may pick the wrong tool when names are generic
Missing descriptions Tool selection depends heavily on clear descriptions
Missing argument descriptions Models need argument-level context
Oversized schemas Large schemas cost tokens and can distract smaller models
Overlapping tools Similar tools make tool choice unstable
Tool-poisoning language Tool metadata is part of the prompt surface

Roadmap

Version Goal
0.2.0 Decorator-based Python tool discovery
0.3.0 Safe static audit for @tool-decorated Python functions
0.4.0 Provider compatibility profiles for Anthropic, Gemini, and OpenAI
0.5.0 Deterministic schema compaction and rewriting
1.0.0 Stable public API and compatibility matrix

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_toolsmith-0.3.0.tar.gz (19.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_toolsmith-0.3.0-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

Details for the file mcp_toolsmith-0.3.0.tar.gz.

File metadata

  • Download URL: mcp_toolsmith-0.3.0.tar.gz
  • Upload date:
  • Size: 19.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mcp_toolsmith-0.3.0.tar.gz
Algorithm Hash digest
SHA256 ebf9841ea253cdde8f0cfb9e29d334bb1f40d2b7ff5b8c29fec1dcd35498b644
MD5 1d05bfe63d35c48351921b17e23156a2
BLAKE2b-256 179077d08cd9ad942b4ca9b3862fc955a0624da77f45a46340b8f18d2561c27e

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_toolsmith-0.3.0.tar.gz:

Publisher: release.yml on ShAmoNiA/mcp-toolsmith

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file mcp_toolsmith-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: mcp_toolsmith-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 18.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mcp_toolsmith-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7f27a25f279520553358b5cd4333523fa3757359fef1bd71072921495e202c3a
MD5 aaa59c89900a62c7eabad669b48ed421
BLAKE2b-256 47f72896b705c622f2f3d60a39d48fe2cf459b2607ef65199327912619716399

See more details on using hashes here.

Provenance

The following attestation bundles were made for mcp_toolsmith-0.3.0-py3-none-any.whl:

Publisher: release.yml on ShAmoNiA/mcp-toolsmith

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page