A mathematical calculator MCP server providing basic arithmetic and trigonometric operations
This is a simple arithmetic calculator MCP with 13 tools covering basic math operations. While tool schemas are properly defined via FastMCP decorators, the definitions have significant quality gaps: (1) Tool descriptions are extremely generic and lack decision-making context for LLMs (e.g., 'Add two numbers together' doesn't explain WHEN to use add vs other operations or differentiate it from similar tools). (2) Parameter descriptions are minimal, 'First number' and 'Second number' don't explain format, constraints, or ranges. (3) No output documentation or chaining IDs. (4) Multiple tools expose type inconsistencies: 'power', 'sqrt', 'cbrt', 'factorial', 'log', 'remainder', 'sin', 'cos', 'tan' accept 'int' parameters, but 'add', 'subtract', 'multiply', 'divide' accept 'float', this inconsistency is not explained and forces the LLM to reason about type coercion. (5) Error handling is minimal (only divide checks for zero; others lack bounds validation). (6) No tool annotations (readOnlyHint, etc.). (7) The single resource (greeting) is outside the scoring focus but shows the server can define multiple feature types. Overall, this reads like a tutorial/demo rather than a production-grade tool composition.
Add two numbers together.
Cube root of a number
cos of a number
Divide the first number by the second.
factorial of a number
log of a number
Multiply two numbers together.
Power of two numbers
Descriptions are generic and lack LLM decision-making context. Example: 'Add two numbers together' (23 chars) does not explain when to use add() vs other operations, does not mention input constraints, and provides no downstream chaining hints. Baseline for A+ tools is 50-200 chars with WHEN/WHY/HOW context.
Parameter descriptions are bare identifiers with minimal context. 'First number', 'Second number', 'Base number', 'Exponent', 'Number to find square root of' lack format, range, or constraint guidance. LLMs cannot infer whether to pass 1, 1.5, 1e10, or -1. Should include: range (e.g., '1 - 1000'), type clarity ('integer or float'), and usage hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 43 | 2026-07-28+ | v2 |
remainder of two numbers divison
sin of a number
Square root of a number
Subtract the second number from the first.
tan of a number
Type inconsistency between tools: add/subtract/multiply/divide accept float parameters; power/sqrt/cbrt/factorial/log/remainder/sin/cos/tan accept int parameters. This inconsistency is not explained in descriptions and forces the LLM to reason about type coercion, risking wrong tool selection. Example: User asks 'square root of 2.5', is sqrt() the right tool (takes int) or should they use a float-based operation?
No output schema documentation. Tools return scalars (float, int) but descriptions do not document return types, precision, or edge cases. Example: sqrt() returns float; what is the precision? Can the LLM assume IEEE 754 double precision? factorial() returns int; what happens for negative input or values > 20 (which overflow)?
Minimal error handling. Only divide() validates input (checks b==0); other tools do not validate domains or bounds. factorial() will crash on negative input. log() will crash on zero or negative input. sqrt() of negative will return NaN. sin/cos/tan are unbounded (no max angle). No error messages guide the LLM to retry or correct input.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 13 tools are read-only arithmetic operations and should declare readOnlyHint: true. This helps agents reason about retry safety and side effects.
Tool names are generic action verbs without clear domain context. Names like 'add', 'multiply', 'log' are simple but do not distinguish between math operations and potential other uses. In a larger tool set, 'log' could collide with logging/export tools. Consider prefixes like 'calc_add', 'math_power', or ensuring descriptions disambiguate in a crowded namespace.