MCP server providing SQL database connectivity through JDBC, exposing tools to retrieve tables, columns, and execute SQL queries
The server defines 3 tools with verb-noun naming and basic descriptions. However, critical gaps exist: (1) Parameter descriptions are minimal or missing context. The 'table' parameter in get_columns lacks any hint about how to discover available tables. (2) Output schemas are entirely undocumented, tools return CSV format per description, but no schema defines the structure of returned fields. (3) Error handling is weak: exceptions are wrapped in generic RuntimeException with minimal recovery guidance. (4) The 'run_query' tool lacks essential constraints: no SQL dialect validation, no query complexity limits, and no guidance on which clauses are safe. (5) No input validation beyond basic type checking. Parameters like 'sql' accept free-form strings with no sanitization against SQL injection or malicious queries. (6) Descriptions lack discovery hints, users don't know when to call get_tables vs get_columns, or how query output relates to column metadata.
Retrieves a list of fields, dimensions, or measures (as columns) for an object, entity or collection (table). Use the `{prefix}_get_tables` tool to get a list of available tables. The output of the tool will be returned in CSV format, with the first line containing column headers.
Retrieves a list of objects, entities, collections, etc. (as tables) available in the data source. Use the `{prefix}_get_columns` tool to list available columns on a table. Both `catalog` and `schema` are optional parameters. The output of the tool will be returned in CSV format, with the first line containing column headers.
Execute a SQL SELECT statement.
Output schemas completely undocumented. Tools return CSV format but do not specify field names, types, or structure. LLMs cannot parse results or plan downstream tool calls without explicit schema.
run_query tool accepts unbounded SQL strings with no validation, injection protection, or complexity limits. Description mentions 'mostly SQL-92' but does not enforce dialect, blacklist dangerous clauses (DROP, DELETE, INSERT, UPDATE), or explain query timeout behavior.
Parameter descriptions lack actionable context. 'table' param in get_columns has description 'The table name' but does not explain: (1) How to discover available tables (call get_tables first), (2) Whether quotes are required, (3) Whether it is case-sensitive. LLMs cannot infer prerequisites.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 43 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 38 | - | v1 |
Error handling is minimal. Exceptions are wrapped in generic RuntimeException('ERROR: ' + message) with no recovery guidance. When a table is not found, the LLM receives 'ERROR: ...' and cannot determine whether to retry, call get_tables first, or ask the user for a valid table name.
No pagination support documented. If a database has thousands of tables or columns, results may exceed context limits. No mention of limit parameters, pagination tokens, or result caps in tool descriptions.
Tool descriptions reference placeholder variables like {prefix}, {quotes}, {FORMAT_DESC} and Constants.FORMAT_DESC. These are not expanded in the descriptions the LLM sees, creating confusion about what the tool actually does.