Production-ready MCP server starter built with NestJS and Clean Architecture
Three tools with complete schemas and descriptions, but significant gaps in error guidance and parameter constraints. All tools have Zod schemas with descriptions (good), but descriptions are generic and lack actionable recovery guidance. No enum constraints on string parameters (directory, table, pattern). Error handling returns isError flag but lacks recovery hints. Output schemas are documented implicitly via JSON responses but not formally specified. Naming is clear and verb-based (calculate, query_database, search_files), following conventions. However, descriptions lack WHEN/WHY context and dependency hints that LLMs need for tool selection.
Perform a math operation on two numbers
Query a database table with optional filters. Returns matching rows.
Search for files matching a pattern in a directory
Error responses lack recovery guidance. Errors return isError=true with text message but do not tell LLM what to do next (e.g., 'Division by zero. Use smaller operands or different operation.' or 'Database error: table not found. Call list_tables() to see available tables.')
Parameter descriptions lack format constraints and ranges. 'directory' and 'pattern' in search_files accept free-form strings with no validation hints. 'table' in query_database has no enum of valid tables. LLMs cannot infer valid values and may pass invalid inputs.
Output schemas not formally documented. Tools return JSON text responses but do not declare expected field structure (e.g., query_database returns {table, filter, count, rows} but this is implicit, not in a schema definition). LLMs must infer structure from examples.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Descriptions are generic and lack WHEN/WHY context. 'Perform a math operation on two numbers' does not explain when to use calculate vs. other tools or what the LLM should expect. Descriptions should be 50-200 chars and include use-case hints.
No pagination support in query_database. Mock data is small, but real databases return thousands of rows. Tool lacks limit enforcement in description and no next_cursor or total_count in response structure. Large result sets will blow context windows.