A multi-database MCP server supporting multiple remote databases
Server has 4 tools with clear verb-noun naming (list_*, execute_*, describe_*). All tools have descriptions and input schemas with types. However, descriptions lack depth on WHEN to use each tool and dependencies between them. Parameter descriptions are minimal (e.g., 'Name of the database connection' repeated 3 times). Output schemas are documented via Pydantic models but not explicitly described in tool docstrings. Error handling returns structured ErrorResponse but lacks recovery guidance. Security concern: execute_query accepts raw SQL with only a user-confirmation pattern for large updates, no SQL injection prevention visible in tool definition.
Get detailed information about a table structure Returns: SuccessResponse with TableInfo or ErrorResponse on error
Execute a SQL query on the specified database WARNING: This tool executes raw SQL. Only use with trusted queries. Returns: SuccessResponse with SelectResult or UpdateResult, or ErrorResponse on error
List all configured database connections, or details of a specific connection
List all tables in the specified database Returns: SuccessResponse with TablesResult or ErrorResponse on error
execute_query lacks SQL injection prevention and sanitization in tool definition. Tool accepts raw SQL strings with only post-execution confirmation for large updates. No input validation or parameterized query guidance visible.
Parameter descriptions are generic and repeated. 'Name of the database connection defined in config file' appears identically in 3 tools. Descriptions lack guidance on when to use each tool or dependencies (e.g., 'Call list_tables first to discover table names before calling describe_table').
Output schemas documented via Pydantic models (SelectResult, UpdateResult, TableInfo, TablesResult) but not described in tool docstrings. LLMs cannot see what fields to expect without reading source code.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Error responses lack recovery guidance. ErrorResponse returns only {success: false, error: string}. No actionable next steps (e.g., 'Connection not found. Available connections: [...]' or 'Invalid table name. Call list_tables() first.').
execute_query uses ctx.elicit() for user confirmation, but elicit is deprecated in MCP 2026-07-28. Should migrate to Multi Round-Trip Requests (result with 'input_required' action) for confirmation flow.