Collection of MCP server implementations demonstrating various features including elicitation, HTTP context access, logging, progress tracking, weather data, resources, and structured output
This is a teaching/demonstration server with 10 tools showing MCP patterns rather than production functionality. Most tools have basic descriptions (10-50 chars, below the 34-392 baseline), lack parameter constraints, and expose no input validation. Four tools (get_http_headers, get_request_info, get_user_claims, logging_tool) have ZERO parameters but empty schemas, which is correct but trivial. Two tools (get_alerts, get_products) have minimally-described parameters. The server demonstrates several patterns (elicitation, progress reporting, structured output) but does not follow the 54 Agentic Tool Patterns for production readiness. Schema quality is inconsistent: some tools use structured output flags, others rely on implicit JSON. No tool includes error recovery guidance or actionable error messages. Naming is adequate (verb_noun style: get_*, make_*, guess_) but descriptions are generic ('Demonstrates...', 'Retrieves...' without explaining WHEN to use them). Output schemas are undocumented in the code. This is a teaching server, not a production-ready toolkit.
Get weather alerts for a US state.
Get weather forecast for a location.
Retrieves the HTTP headers from the current request and returns them as a JSON object.
Gets a list of structured product data with detailed information.
Retrieves the request information from the current HTTP context and returns it as structured content.
Retrieves the user claims from the current HTTP context and returns them as a JSON object.
A simple game where the user has to guess a number between 1 and 10.
Demonstrates a tool that produces log messages
Output schemas are undocumented across all tools. Code shows structured output is enabled for some tools, but the response schema (fields, types) is never declared in tool metadata. LLMs cannot predict what data they will receive or plan downstream tool calls.
Parameter constraints are missing. Tools like get_alerts (state parameter) accept free-form strings with no enum validation. get_forecast (latitude, longitude) has no range constraints. LLMs will pass invalid values, causing runtime errors.
Descriptions are too short and generic. Many tool descriptions use template language ('Demonstrates...', 'Retrieves...') without explaining WHEN to use each tool or what the LLM should do with the output. Baseline is 34-392 chars; most here are 35-99 chars with minimal actionable context.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 45 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Demonstrates a long running tool with progress updates
Creates a resource with a random value and returns a link to this resource.
No error recovery guidance. Tools that can fail (e.g., get_http_headers with 'No HTTP context available', get_alerts with invalid state) return bare strings or objects without telling the LLM what to do next or how to self-correct.
Naming inconsistencies. Some tools use vague names ('logging_tool', 'long_running_tool', 'make_a_resource') that don't follow verb_noun conventions or clearly convey the action. LLMs struggle to disambiguate similar tools when names are generic.
No pagination or limits. get_products accepts a 'count' parameter but does not validate min/max or explain the limit. No pagination metadata (total count, next_cursor) is documented. Large result sets could exhaust LLM context.
Confirmation pattern missing for WRITE operations. make_a_resource is marked WRITE but has no dry-run or confirmation step. Agents making mistakes have no safety gate.