Single tool 'get_crypto_price' has a clear action verb and reasonable input schema with type definitions. However, the tool lacks critical documentation and structure expected of production-grade tools. The schema is present but incomplete (no output schema documented). Parameter descriptions are minimal (coin_id and currency both have basic descriptions but lack constraints, examples, or error guidance). No error handling guidance is provided to LLMs on what to do when a coin is not found or the API fails. The tool description is 93 characters, within acceptable range but lacks context on when to use it vs. alternatives, prerequisites, or expected output structure. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. The implementation handles errors internally but does not communicate error recovery paths to the LLM in a structured way.
Fetch the current price of a cryptocurrency (e.g., bitcoin, ethereum)
No output schema documented. LLMs cannot plan downstream operations or extract structured data from results. The tool returns free-text responses, requiring LLM parsing and wasting tokens.
Parameter 'currency' lacks enum constraint. Free-form strings invite hallucinated currency codes (e.g., 'xyz', 'bitcoin'). Should declare valid values as enum or document exact format constraints.
Parameter 'coin_id' lacks format constraints. Description says 'e.g., bitcoin, ethereum, solana' but does not state format rules (lowercase required? hyphens allowed?). LLMs will guess and pass invalid values.
Tool description does not state what the output is. Description says 'Fetch the current price' but does not clarify whether response is a number, currency string, or object. LLMs need explicit output structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 50 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 45 | - | v1 |
Error handling provides no recovery guidance. When a coin is not found or API fails, the response is a text message (isError: true). LLMs need actionable error messages: 'Coin not found. Try a different coin_id or call list_supported_coins() first.'
No tool annotations (readOnlyHint, idempotentHint, destructiveHint). This tool is read-only and idempotent, but the MCP server does not declare these facts. Agents cannot infer safety properties.
Tool description contains example values ('bitcoin', 'ethereum', 'solana', 'usd', 'vnd', 'eur'). LLMs latch onto examples and may reuse them literally in inappropriate contexts. Use enum constraints instead.