add-mcp-tool — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited add-mcp-tool (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Add a new tool to mcp_server/server.py following the established FastMCP pattern.
Add to mcp_server/server.py. The docstring becomes the tool description for AI hosts.
@mcp.tool()
async def new_tool(
required_param: str,
optional_param: Optional[str] = None,
limit: int = 50,
) -> ToolResult:
"""One-line description of what this tool does.
Args:
required_param: UK postcode (e.g. "SW1A 1AA")
optional_param: Optional filter description
limit: Maximum results (default 50)
"""
from property_core import SomeService # Step 2: lazy import
# Step 3: call property_core (sync → thread)
result = await anyio.to_thread.run_sync(
partial(
SomeService().method,
param=required_param,
limit=limit,
)
)
# Step 4: build and return ToolResult
data = result.model_dump(mode="json")
summary = f"Found {result.count} items for {required_param}"
return ToolResult(content=_content(summary, data), structured_content=data)from property_core import X inside the function body, never at module top levelanyio.to_thread.run_sync(partial(...)) for sync property_core calls. For already-async functions, just await them directly.content = human-readable summary + slimmed JSON (via _content() helper)structured_content = full data dict for programmatic consumersis_configured() and return early with an explanatory message if not configured. See property_epc() for the pattern._slim(obj) — strips raw, images, floorplans from dicts recursively_content(summary, data) — builds content string: summary + "\n\n" + slimmed JSONmcp_server/server.py with @mcp.tool()asyncToolResult with both content and structured_contentArgs: section for all parameters~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.