An opinionated framework for building MCP servers with HTTP/stdio transport and OAuth/Basic auth
mcp-framework is a Rust MCP server framework with 11 tools across multiple examples. The codebase shows solid foundational structure with tool macros, parameter schemas via schemars, and type-safe descriptions. However, there are significant quality gaps: (1) duplicate tool names exist (greet appears twice with identical signatures in with_tools.rs, ping and admin_reset appear in multiple files), suggesting either poor deduplication or test artifacts not cleaned from the count; (2) tool descriptions are present but uniformly very short (8-35 chars), below the production baseline of 194 chars; (3) parameter descriptions exist but are minimal ('The name to greet', 'First number'); (4) no evidence of structured output schemas, pagination guidance, or error recovery patterns in the tool implementations; (5) security-critical tool (admin_reset) lacks any permission-checking examples or audit guidance. The framework itself is well-engineered (rmcp 3.1, Streamable HTTP, async/await), but the tool examples do not demonstrate production-grade patterns. Most tools are simple examples rather than production tools, this is appropriate for a framework, but scores reflect actual tool quality, not framework quality.
Add two numbers together
Reset the server (admin only)
Reset the server (admin only)
Return a friendly greeting
Return a short greeting
Return a large JSON payload to test SSE streaming
Returns pong
Return pong
Duplicate tool definitions across files (greet, ping, admin_reset appear 2-3 times). This inflates the tool count and suggests test artifacts or poor example isolation. Production servers must have unique tool names or clearly document which file is canonical.
All tool descriptions are extremely short (8-40 chars). Production baseline is 194 chars (p10=34, p90=392). Current descriptions lack WHAT the tool does, WHEN to use it, and any edge cases or prerequisites. Examples: 'Returns pong' (12 chars), 'Return a friendly greeting' (26 chars). These do not meet the 10-1024 char guideline.
admin_reset is a DESTRUCTIVE tool with no visible permission checks, role validation, or dry-run/confirmation pattern in the examples. Framework code mentions 'admin only' but the provided code snippet (examples/dynamic_capabilities.rs) does not show the actual authorization implementation. Destructive tools MUST gate access and require explicit confirmation.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 49 | - | v1 |
Returns pong
Show how many times you've called tools in this session
Returns info about the current authenticated session
No tool descriptions include error recovery guidance (e.g., 'If user not found, call search_users() first'). Error responses are not documented as actionable (retryable vs. user-fixable vs. fatal). The LLM will not know what to do when a tool fails.
large_response tool accepts a 'size' parameter (approx response size in bytes, default 5000) but no maximum is specified. Unbounded numeric parameters invite LLMs to pass absurd values. Should specify 1-10000 or similar constraint.
stats tool returns session-specific metrics but no output schema documentation is visible. LLMs cannot plan downstream calls without knowing what fields are returned.
whoami tool is called in OAuth context but no output schema documents what user/session fields are returned. The test file (oauth_resource_server.rs) does not show the return type, leaving ambiguity about available fields.