A FastMCP server demonstrating tool integration with FastAPI, including ML model predictions and basic arithmetic operations
This MCP server has critical structural and definition quality issues across all 4 tools. Two tools are named 'add' (duplicate naming), creating ambiguity for LLM tool selection. Tool descriptions are extremely brief (10-34 chars), below the rubric baseline of 194 chars minimum. Input parameters completely lack descriptions, the rubric requires 100% of A+ tool params to have descriptions, and this server has 0%. Parameter types are present (int, float) but descriptions are null across all parameters. There is no documented output schema. The server demonstrates no error handling guidance, no recovery patterns, and no indication of how parameters map to actual behavior. For example, 'add' returns '(a + b) * 3823', a non-obvious transformation that contradicts the description 'Add two numbers'. This creates a semantic contract violation that would confuse LLMs. The tool 'call_predict' lacks clarity on what the ML model does, what inputs are valid, and what the output represents. No per-tool validation, no enums for constrained inputs, and no pagination support despite the server potentially returning lists (though tools shown are scalar only).
Add two numbers
Add two numbers
predict the results of a number
Multiply two numbers
Duplicate tool names: 'add' appears twice (src/main.py and src/mcp01.py). LLM cannot distinguish between them; tool selection becomes ambiguous. Violates single-responsibility and naming clarity principles.
All input parameters lack descriptions. Rubric requires 100% of parameters to have non-empty descriptions explaining what they control. None of the 4 tools document parameter meaning, valid ranges, or constraints. Parameters are null across all tools.
Tool descriptions are extremely brief (10-34 chars) and lack actionable context. Baseline is 194 chars. 'Add two numbers' and 'predict the results of a number' do not explain when to use the tool, what the output represents, or prerequisites. Descriptions do not answer: What does it do? When to call it? What does it return?
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 40 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 19 | - | v1 |
No output schema documented. Rubric requires 100% of A+ tools to document return types. Tools return int or float but without field names, structure, or explanation of what the numeric result represents.
Semantic mismatch between description and implementation. 'add' tool claims 'Add two numbers' but actually returns (a + b) * 3823, a non-linear transformation. This violates the contract an LLM would infer from the description and causes incorrect tool selection or misplaced trust.
call_predict lacks specification of what the ML model does, valid input ranges for x, and what the output semantics are. Description 'predict the results of a number' is vague, predict what? Using what model? LLM cannot reason about appropriateness.
No error handling guidance. Tools do not specify what happens on invalid input (negative numbers, extreme values, missing model state). No recovery patterns documented. If call_predict fails because ml_models['ml_model'] is uninitialized, LLM receives raw KeyError with no guidance.
No input validation or constraints. Parameters accept unbounded integers and floats with no min/max, no enums, no pattern validation. LLM can pass absurd values (a=999999999, b=-999999999) that cause overflow or nonsensical results.