An MCP server experiment with tools, resources, and prompts for user management
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation, error handling, and output schema clarity. create-user has 4 typed parameters but lacks individual descriptions. create-random-user has no input parameters documented. Neither tool documents return structure or error recovery paths. Tool annotations present (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) but marked incorrectly (destructiveHint=false for WRITE operations). No pagination, no per-item error reporting, no recovery guidance. Descriptions are adequate (50-60 chars) but lack WHEN/WHY context. Error handling returns generic text ('Failed to save user') without actionable guidance.
Create a random user with fake data
Create a new user in the database
create-user parameters lack individual descriptions. Schema defines name, email, address, phone as strings but provides no guidance on format, length, or validation rules. LLMs cannot infer whether email must be RFC 5322 compliant or if address has length limits.
Tool annotations are incorrect. Both tools marked destructiveHint=false despite WRITE risk classification. create-user and create-random-user modify persistent state (write to users.json) and should have destructiveHint=true to signal to agents that these calls have irreversible consequences.
Error handling provides no recovery guidance. Both tools return generic 'Failed to save user' or 'Failed to generate user data' without indicating whether the error is retryable, user-fixable, or fatal. LLM cannot determine next action.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 48 | <=2025-11-25 | v2 |
create-random-user has no input schema (empty object {}). Tool uses server-initiated sampling/createMessage (deprecated pattern) to call LLM directly, violating stateless request handling and creating circular dependency.
Output schemas not documented. Tools return {content: [{type: 'text', text: string}]} but this structure is not declared in tool definitions. LLMs cannot plan downstream operations or extract structured data from responses.