MCP server for secure MySQL database operations with SQL validation, security checks, and audit logging
SafeMySQLMcpServer has well-structured tool definitions with consistent naming (verb_noun pattern: query, list_databases, describe_table, etc.) and complete input schemas visible in internal/mcp/tools.go. However, descriptions are minimal (10-30 chars), parameter descriptions are absent or trivial, and output schemas are not documented. The server implements basic security (audit, auth, validation imports) but lacks error recovery guidance and tool annotations. No evidence of pagination, result limits enforcement, or idempotent operation patterns despite handling potentially large result sets.
Get table structure
Get SQL execution plan
List all available databases
List tables in specified database
Execute SQL query on specified database
Search tables by name across all databases
Get CREATE TABLE statement
Descriptions are critically short (10-30 chars). Rubric baseline is 194 chars; descriptions under 20 chars score 0-20. Examples: 'Execute SQL query on specified database' (40 chars) lacks WHEN to use, prerequisites, or state-modification warning. 'List all available databases' (29 chars) lacks discovery context.
Parameter descriptions are missing or trivial. Input structs (QueryInput, ListTablesInput, etc.) have jsonschema tags with minimal text. 'Database name' and 'SQL statement to execute' lack format constraints, examples of valid input, or error guidance. Rubric requires 72 chars average per param description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
Output schemas are not documented. QueryResult, ListDatabasesResult structs exist in code but are not exposed in tool definitions visible to LLMs. Rubric requires 100% of A+ tools to have documented return types. LLMs cannot plan downstream calls without knowing what fields to expect.
No pagination or result limits documented. query tool accepts arbitrary SQL; list_tables, search_tables lack limit/offset parameters. Code defines defaultMaxRows=10000 but this is not exposed to LLMs or enforced in tool descriptions. Large result sets blow context windows.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). query tool is marked WRITE risk but lacks destructiveHint annotation. read_only tools lack readOnlyHint. Annotations help agents reason about safety and retry logic.