A teaching MCP server demonstrating core protocol concepts across 12 modules: JSON-RPC, stdio transport, lifecycle handshake, tools, resources, prompts, error handling, notifications, sampling, and agent loops.
This is an educational MCP server demonstrating core concepts across 13 modules. Tool definitions are present with schemas and descriptions, but quality is inconsistent. Many descriptions are minimal (10-30 chars), several tools lack parameter descriptions, and output schemas are undocumented. No tool annotations (readOnlyHint/destructiveHint). Error handling exists (divide, validate_email, unstable) but lacks recovery guidance. The server is pedagogically sound but falls short of production quality, typical for a teaching codebase.
Adds two numbers and returns the sum.
Registers a new demo://note/N resource and notifies list_changed.
Divides a by b. Returns a tool error when b is zero.
Returns the message you send, unchanged.
Returns the server clock as an ISO-8601 timestamp.
Returns a short greeting (registered dynamically).
Returns the MCP prompt templates on this server. In Claude Desktop use + → Add from this server.
Minimal descriptions on 6+ tools (10-30 chars). 'Returns the server clock as an ISO-8601 timestamp' (ping, get_time) and 'Registers a new demo://note/N resource and notifies list_changed' (add_note) lack context for LLM selection. Baseline: 194 chars average for A+ tools.
No output schemas documented. Tools return results (e.g., add returns sum, divide returns quotient, list_prompt_templates returns template list) but LLMs cannot see expected fields. Agents cannot plan downstream calls or extract data reliably.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | <=2025-11-25 | v2 |
Returns the server clock as an ISO-8601 timestamp.
Updates demo://status and notifies subscribers.
Adds the greet tool at runtime and notifies tools/list_changed.
Classifies a support message via sampling/createMessage, then routes it using server-side rules.
Throws on purpose to demonstrate handler exceptions → isError.
Checks a simple email format. Returns isError when invalid.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools like publish_status, add_note, register_extra_tool are clearly destructive/state-modifying but lack hints. Agents cannot distinguish safe-to-retry from irreversible operations.
Error handling lacks recovery guidance. divide() returns 'tool error when b is zero' but does not suggest next steps. validate_email() returns isError but does not explain what makes an email valid. unstable() throws but provides no actionable message.
Tool 'unstable' has vague name and description. 'Throws on purpose to demonstrate handler exceptions → isError' is pedagogical, not production-ready. Name does not convey intent; description is meta-commentary rather than functional guidance.