A MySQL MCP server that provides access to MySQL databases using Python. It allows connecting to a MySQL database, listing tables in a database, describing table schemas, and executing read-only SQL queries.
MySQL server has complete input schemas for all 5 tools with proper types and descriptions. Tool names follow verb_noun convention (connect_db, list_databases, etc.). However, descriptions are minimal (10-50 chars), lacking context on WHEN to use each tool or what happens on error. Parameter descriptions are present but generic. No output schemas documented. No error handling guidance. Missing tool annotations (readOnlyHint). Composition is sound, each tool has one responsibility, but descriptions do not meet LLM-optimization baselines (target 50-200 chars).
Connect to a MySQL database
Show the schema for a table
Execute a read-only SQL query
List all accessible databases
List all tables in a database
Tool descriptions are too brief (10-50 chars) and lack context. 'List all accessible databases' does not explain WHEN to call this vs describe_table, or what structure is returned. LLMs cannot infer selection criteria from minimal text.
No output schemas documented. Tools return results but LLMs do not know what fields to expect (e.g., does list_tables return table_name, table_type, row_count?). This forces agents to guess and wastes tokens on trial-and-error.
No error handling guidance. If execute_query receives a write query (INSERT, UPDATE), the tool rejects it, but the error response is not documented. LLMs need actionable recovery hints like 'Only SELECT/SHOW/DESCRIBE allowed. Try rephrasing as a SELECT.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
Missing tool annotations. All tools are read-only (risk: READ_ONLY), but the schema does not declare readOnlyHint. This prevents clients from optimizing caching or safety policies based on tool semantics.
execute_query description does not mention the row limit (1000 by default, configurable via ROW_LIMIT env var). Large result sets will be truncated silently, confusing agents. Document the limit and pagination strategy in the description.