An MCP server that provides tools to manage a product catalog stored in a MySQL database via a FastAPI backend
The server has 6 well-structured tools with clear action verbs and mostly complete input schemas. However, there are significant gaps in error handling guidance, output schema documentation, and some parameter descriptions lack depth. Tools follow basic naming conventions (verb_noun), but descriptions could be more LLM-optimized with usage context. Parameter validation constraints are absent from descriptions (e.g., 'price must be positive' is mentioned in docstring but not formalized in schema). Error responses return generic error objects without recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite clear read/write/destructive risk classifications. Output schemas are not documented, LLMs must infer structure from response examples. Overall, this is solid foundational work (above average for community servers) but lacks production-grade polish around error guidance and output contracts.
Add a new product to the catalog.
Delete a product from the catalog.
Get all unique product categories from the database.
Retrieve a single product by its ID from the MySQL database.
List all products from the MySQL database with optional filters.
Update an existing product in the catalog.
Error responses lack recovery guidance. All tools return generic {'error': 'message'} without suggesting next steps for the LLM. E.g., delete_product returning 404 should suggest 'Try list_products() to find valid product IDs.'
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present in tool definitions, despite clear risk classifications (READ_ONLY, WRITE, DESTRUCTIVE). This prevents MCP clients from warning users before destructive operations.
Output schemas are not documented. Callers must infer the response structure. E.g., create_product returns {'id': int, 'name': str, ...} but this is never formally declared. LLMs cannot plan downstream calls without knowing what fields are available.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 53 | - | v1 |
Parameter constraints not formalized in descriptions. 'price' is documented as 'must be positive' in docstring but not in the parameter description for the tool schema. Validation happens server-side but LLM sees no constraint hint.
delete_product lacks dry-run or confirmation step. Destructive operations should support confirmation before execution to prevent accidental data loss.
update_product allows partial updates with no clear idempotency guarantee. If an LLM retries after a network failure, is the operation safe to repeat? Not documented.