Local-first FastMCP v3 builder scaffold for designing and reviewing MCP servers.
FastMCP Builder is a meta-tool server for reviewing and scaffolding MCP servers. 16 tools with mostly complete schemas and descriptions. Naming is clear and verb-forward (classify_, review_, extract_, check_, suggest_, generate_). Descriptions range 50 - 250 chars, meeting the 10 - 1024 baseline. However, parameter descriptions are sparse or generic ('use_case', 'actor', 'expected_control_pattern' lack specificity). Output schemas are inferred from Pydantic models but not explicitly documented in tool definitions. Error handling is minimal, tools return structured objects but lack recovery guidance. Tool annotations are declared in the server but not consistently applied across all tools.
Classify tool failure modes into practical error-response categories.
AST-scan a FastMCP server source for `@mcp.prompt` arguments that lack descriptions. Descriptions can live in `Annotated[X, Field(description=...)]` or in the docstring's `Args:` block. Spec source: MCP — `PromptArgument.description` SHOULD be set. Severity MEDIUM (SHOULD, not MUST).
Check whether a proposed FastMCP prompt name follows naming conventions.
AST-scan a FastMCP server source for `@mcp.resource` decorators that don't declare a `mime_type=` kwarg. Spec source: FastMCP — `servers/resources.md`. Severity MEDIUM (FastMCP-recommended, not MCP-mandatory). Without `mime_type`, FastMCP infers from the return type — fine for plain strings, brittle otherwise. Findings carry `spec_source="FastMCP"` and `spec_section="servers/resources.md#mime_type"`.
Scan a FastMCP server's Python source for the silent-failure-conversion anti-pattern: an @mcp.tool function that returns an error-shaped sentinel (a dict with an "error" key, or a string starting with "Error") instead of raising a structured error. Catches both direct patterns (`return {"error": ...}` in the tool body) and one level of indirection (`return _handle_error(e)` where the helper itself returns error sentinels — the bailii-mcp pattern). Does not execute the source. Returns a SilentErrorReport whose `findings` are ReviewFinding objects (severity=HIGH, code="tool.silent_error_return"). Same shape as review_fastmcp_manifest so the design-review skill can merge findings uniformly by severity.
Parameter descriptions are generic or missing context. 'use_case', 'actor', 'expected_control_pattern', 'manifest', 'path', 'name', 'uri_pattern' lack specificity about expected format, constraints, or examples. LLMs cannot infer whether 'path' is a file path, module path, or URI.
Output schemas are not explicitly documented in tool definitions. Tools return Pydantic models (PrimitiveClassification, ManifestReview, SilentErrorReport, etc.) but the schema structure is inferred from imports, not visible in the tool registration. LLMs cannot see what fields to expect.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
AST-scan a FastMCP server source for `@mcp.tool` decorators that don't declare the four standard ToolAnnotations hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint). Spec source: MCP — `ToolAnnotations` on Tool. Severity MEDIUM (MCP-recommended).
Check whether a tool description is specific enough for model-controlled use.
Check whether a proposed FastMCP tool name follows naming conventions.
Check a resource URI pattern for stability issues that would break client integrations.
Classify a capability as an MCP tool, resource, or prompt.
Parse a FastMCP server's Python source and emit a manifest dict ready to feed into review_fastmcp_manifest. Use this instead of asking the user to hand-construct a manifest — point this at the server module path and the manifest comes back deterministically. Walks decorators (@mcp.tool / @mcp.resource / @mcp.prompt) via Python's ast module. Detects the server name from the FastMCP("…") constructor. Does not execute the source.
Generate a minimal local FastMCP server implementation plan.
Review a FastMCP capability manifest for deterministic design issues.
Suggest a reusable MCP prompt contract for a workflow.
Suggest a local resource URI and read contract.
Suggest a narrow FastMCP tool contract from a capability description.
No error handling or recovery guidance. Tools do not document failure modes, retryability, or what the LLM should do if a check fails or a path is invalid. E.g., extract_manifest_from_source does not explain what happens if the path does not exist or is not a valid Python module.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) are declared in examples/notes_server.py but not applied to the FastMCP Builder tools themselves. All 16 tools are read-only and idempotent, these should be explicitly annotated.
STDIO-only transport. Server uses FastMCP with STDIO, not HTTP or SSE. This caps protocol readiness at 50 and prevents remote/hosted client access.