An MCP server that provides tools for searching and retrieving product information from a Contoso backend service
The server defines 2 tools with basic descriptions and simple input schemas. However, definitions lack depth, output schemas are completely undocumented, and error handling returns raw error messages without recovery guidance. Naming follows verb_noun convention (search_products, get_product) which is a positive signal. Both tools are READ_ONLY, reducing risk, but definitions fall short of production-grade standards. No parameter constraints (enums, ranges), no output documentation, and error messages are generic. The average of the two per-tool scores (52.5) reflects fair naming but poor schema and error handling coverage.
Get product details by ID.
Search for products by name or description using fuzzy matching. Returns a list of potential matches with confidence scores.
Output schemas are completely undocumented. LLMs have no visibility into the structure of search results or product details, making it impossible to plan downstream tool calls or extract specific fields reliably.
Error responses are generic and provide no recovery guidance. Examples: 'Failed to search products. <exception message>' and 'An unexpected error occurred...' do not tell the LLM what to do next, whether to retry, or how to self-correct.
Parameter 'query' in search_products lacks format/constraint documentation. No indication of minimum/maximum length, required format, or examples. Description is minimal (19 chars).
Parameter 'productId' in get_product has no range constraints (min/max). LLMs may pass negative, zero, or extremely large integers without guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 46 | - | v1 |
search_products description (89 chars) does not explain when to use it vs. get_product, what 'fuzzy matching' means for LLM behavior, or what the 'confidence scores' represent.
get_product description (30 chars) is extremely brief. Does not explain prerequisites (e.g., how to obtain a product ID), return structure, or when this is preferred over search.
No composition guidance between tools. search_products returns JSON with confidence scores, but documentation doesn't specify whether results include product IDs that can be passed to get_product, or if additional lookup is required.