A demo Python MCP server using FastAPI and MongoDB
Server provides 3 tools with basic structure but several definition gaps. All tools have clear verb-based names (add, subtract, get_weather) following Arcade patterns. Tool descriptions are present but minimal (10-40 chars), falling short of the 50-200 char guideline for LLM-optimized descriptions. Input schemas are properly typed (integer, string) with parameter descriptions present, meeting baseline schema requirements. However, output schemas lack documentation, get_weather returns a WeatherData object but the response structure is not explicitly documented in the tool definition. No error handling guidance, no parameter constraints (enums, ranges), and no indication of idempotency or destructiveness. Tool composition is simple and appropriate for a demo server.
Add two numbers.
Get the current weather in a given location
Subtract two numbers.
Tool descriptions are too brief (10-40 chars). Descriptions should be 50-200 chars explaining WHAT the tool does, WHEN to use it, and any prerequisites. Current descriptions lack context for LLM tool selection and fail to explain return structure or use cases.
Output schemas not documented. The get_weather tool returns a WeatherData object with fields (location, temperature, condition), but this structure is not visible in the tool definition. LLMs cannot plan downstream calls or extract fields without knowing the response structure.
No parameter constraints documented. add() and subtract() accept unbounded integers with no min/max guidance. LLMs may pass extremely large numbers causing overflow or performance issues. get_weather() location parameter has no validation or format guidance (e.g., 'city name only', 'city, country', etc.).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 66 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 25 | - | v1 |
No error handling guidance. Tools do not document what happens on invalid input, out-of-range values, or when location is not found (get_weather). Error responses should tell the LLM what to do next or suggest alternatives.
Missing tool annotations. None of the tools are marked with readOnlyHint, destructiveHint, or idempotentHint. All three tools appear to be read-only (per risk metadata), but this is not communicated via tool annotations in the schema.