A database query and schema inspection tool for SQL databases via MCP
MCP Alchemy has 4 tools with basic schemas and descriptions, but significant quality gaps. All tools have descriptions (positive), but they are verbose and include dynamic database connection info that clutters the core purpose. Parameter descriptions are minimal or absent. The execute_query tool accepts arbitrary SQL with only a 'query' string parameter, no validation, no enum constraints, no guidance on safe vs. unsafe operations. Schema definitions are present but sparse (only type and description for most params). No error handling guidance, no recovery hints, and no tool annotations (readOnlyHint/destructiveHint). The server uses FastMCP (good) but STDIO transport caps protocol readiness at 50.
Return all table names in the database separated by comma. Connected to {dialect} version {version} database '{database}' on {host} as user '{username}'
Execute a SQL query and return results in a readable format. Results will be truncated after {EXECUTE_QUERY_MAX_CHARS} characters. Claude Desktop may fetch the full result set via an url for analysis and artifacts. Connected to {dialect} version {version} database '{database}' on {host} as user '{username}'
Return all table names in the database containing the substring 'q' separated by comma. Connected to {dialect} version {version} database '{database}' on {host} as user '{username}'
Returns schema and relation information for the given tables. Connected to {dialect} version {version} database '{database}' on {host} as user '{username}'
execute_query accepts arbitrary SQL with no validation, enum constraints, or guidance on destructive operations. Parameter 'query' lacks description; 'params' description is generic. No error handling tells LLM how to recover from SQL errors.
All tool descriptions embed dynamic database connection metadata (dialect, version, database, host, username) inline. This clutters the core purpose and wastes tokens. Descriptions should focus on WHAT the tool does and WHEN to use it, not connection details.
Parameter 'q' in filter_table_names has a description, but 'table_names' in schema_definitions and 'params' in execute_query lack meaningful descriptions. LLM cannot infer what 'params' object structure should be.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). execute_query is marked WRITE risk but tool definition does not signal this to the MCP client. LLM cannot distinguish safe reads from destructive writes.
Error handling returns raw exception strings ('Error: {str(e)}') with no recovery guidance. LLM receives 'Error: syntax error at position 42' and has no actionable next step. Should categorize errors (retryable, user-fixable, fatal) and suggest recovery.