Proof of concept MCP server demonstrating token-based authentication patterns for remote MCP servers with user context injection into tool calls
This MCP Auth PoC server demonstrates a foundational proof-of-concept with clear separation of concerns and basic patterns established. All three tools are explicitly defined in tools.py with verb-based names and descriptions. However, the implementation has significant gaps: no input schema validation visible in the actual tool registrations, parameter types are inferred from function signatures rather than declared in JSON Schema, output schemas are undocumented, and error handling is minimal. The code contains useful patterns and comments, but these do not compensate for missing schema rigor in the registration layer. Tool descriptions are adequate (100-150 chars) but lack the structured guidance on when to use each tool and what downstream operations are possible. No tool annotations (readOnly/destructive/idempotent hints) are present. The tools are simple and single-purpose (good composition), but lack the production-grade schema completeness expected for a 70+ score.
Echo back a message with metadata. This tool demonstrates accepting parameters from MCP clients and returning structured information.
Get a personalized greeting for the authenticated user. This tool demonstrates basic MCP tool functionality.
Get statistics for the current session. This demonstrates how to retrieve session data.
Input schemas not visible in tool registration code. While tools.py contains Python type hints, no explicit JSON Schema definitions are shown for parameter validation or LLM-facing schema declaration. Cannot verify if FastMCP is auto-generating schemas or if they are incomplete.
Output schemas are not documented. Tools return strings (JSON-encoded or plain) but the response structure and fields are not formally declared. LLMs cannot infer what fields to extract or how to chain these tool results to downstream operations.
No tool annotations present. Tools do not declare readOnlyHint, destructiveHint, or idempotentHint. All three are READ_ONLY (safe), but this safety property is not communicated to the MCP protocol layer, only noted in comments.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Error handling is minimal. While tools.py contains example error patterns in docstrings, the actual tool implementations do not validate input, handle missing context gracefully, or return structured error responses with recovery guidance. For example, tool_get_greeting assumes context.request.state.user exists without defensive checks.
Parameter descriptions lack constraints. tool_get_greeting's 'name' parameter is described as 'Optional name to greet (default: "there")' but provides no format, length limits, or invalid input handling guidance. LLMs cannot infer safe bounds.