MCP server for querying multiple database types (SQL, NoSQL, vector DBs, search engines) via a unified interface with schema introspection, query execution, and async task support
adb-link provides 10 well-named tools with complete input schemas and descriptions. Tool names follow the verb_noun pattern (list_, get_, execute_, explain_, submit_, get_async_). All tools have descriptions (194-288 chars, within baseline), and all input parameters are typed and described. However, there are significant gaps: (1) Output schemas are NOT documented, only input schemas are visible in the source. The handler functions return `jsonString()` without schema documentation for what fields the response will contain. (2) Parameters lack constraints, numeric limits, enum values, and format specifications are minimal or missing. (3) Error handling is generic, handlers return raw `err` without recovery guidance. (4) No pagination metadata (limit defaults to 100 but no total_count or next_cursor documented). (5) Parameters like 'sql' accept free-form input without injection prevention hints. These gaps prevent LLMs from reliably reasoning about output and planning multi-step calls. The server is functional but lacks the polish expected of a production tool.
Execute a query on a specified datasource and database, returning structured results.
Get the execution plan for a SQL statement. Supports MySQL, PostgreSQL, SQLite, ClickHouse, GaussDB, TiDB, and MSSQL.
Get the execution status of an async query.
Get the complete schema of a specified database (tables, columns, types, and comments).
Get detailed column information for a specified table.
Get detailed column information for a specified view.
Output schemas are completely undocumented. Tools return results via jsonString() but the structure of those results is invisible to the MCP client and LLM. Without documented response schemas, LLMs cannot reliably extract fields for downstream tool calls or plan multi-step sequences.
execute_query and explain_query accept free-form SQL without validation hints or injection prevention guidance. Parameters should document expected formats (SQL dialect, length limits) and recommend parameterization. LLMs may pass malicious SQL without explicit constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
List all databases in a specified datasource, returning name and comment information.
List all configured datasources, including name, type, description, dialect info, and server metadata (version, sql_mode, timezone, extensions).
Submit an async query task, returns a query_id for polling status and retrieving results.
Submit a tool for async execution, returns a query_id.
Numeric parameters (limit, timeout_seconds) lack min/max constraints. 'limit' defaults to 100 but has no documented upper bound, LLMs could request millions of rows. 'timeout_seconds' defaults to 300 with no documented maximum.
Error handling is generic. The code returns raw errors without recovery guidance. When a datasource is not found or permission is denied, the LLM receives no hint about available alternatives or how to self-correct.
Pagination not documented. execute_query accepts 'limit' but does not return total_count or next_cursor. When results are truncated, the LLM cannot determine if more rows exist or how to fetch them. list_databases and get_schema may also truncate without notification.
Async query tools (submit_async_query, submit_async_tool) lack completion time estimates, status descriptions, and result structure documentation. LLMs cannot estimate how long to wait or what fields to expect from get_async_query_status.
Parameter 'parameters' in submit_async_tool expects a JSON string, not a structured object. This is unusual, most tools accept structured params. The description says 'as JSON string' but does not detail the schema of that JSON, forcing LLMs to guess.