A Model Context Protocol server for querying and managing databases with support for PostgreSQL and SQL Server connections, schema exploration, script management, and notes.
This is a well-constructed database query MCP server with 27 tools covering connection management, schema introspection, queries, scripts, and metadata annotation. Strengths: all tools have clear, descriptive names following verb_noun conventions (db_*, scripts_*, notes_*); all input schemas are properly typed with descriptions; output structures are well-defined with pagination support; the server implements sophisticated features like confirmation elicitation, write-access guards, and result caching. Weaknesses: descriptions are sometimes verbose (many exceed 200 chars, approaching the upper bound); some enum parameters lack explicit value lists in schemas (e.g., 'provider' accepts 'Postgres' or 'SqlServer' but schema doesn't declare these as enum); output schemas are not formally documented in the code (inferred from implementation); error recovery guidance is limited in descriptions. The server demonstrates strong adherence to patterns:tool, pattern:paginated-result, pattern:command-tool, and pattern:permission-gate, but falls short of A+ (90+) grade due to incomplete enum constraints and lack of explicit output schema documentation.
Opens a database connection. Provide a pre-defined 'name' or an ad-hoc descriptor. Passwords must be set out-of-band via db_predefined_create. Opening a connection that is not read-only asks for confirmation first.
Lists databases/catalogs visible from the connection.
Describes multiple tables in one call. Targets: '*' for all, 'schema.*' for all in a schema, 'schema.table' for a specific table.
Closes an open connection by id.
Lists currently open connections and their redacted metadata.
Lists configured (pre-defined) databases. Credentials are never returned.
Provider parameter lacks enum constraint in schema. db_connect and db_predefined_create accept 'Postgres' or 'SqlServer' but schema defines provider as freeform string, inviting invalid values. LLM may hallucinate 'MySQL' or 'Oracle'.
Output schemas not formally documented in source code. Tool descriptions mention structured results (e.g., 'returns columns, indexes, foreign keys') but JSON Schema definitions for response bodies are not visible in the provided code. Inferred from implementation but not explicitly registered.
db_query description exceeds 250 characters and omits error recovery guidance. States WHAT it does but not guidance on parameterized vs inlined SQL, timeout behavior, or how to handle 'result set too large' scenarios. Multi-parameter tool (sql, parameters, limit, output, csvPath, timeoutSeconds) lacks parameter relationship documentation.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | A | 80 | 2025-06-18+ | v2 |
Runs SELECT 1 against an open connection.
Registers a new pre-defined database. The password is stored encrypted; it never leaves the server in any response. Registering an entry that is not read-only asks for confirmation first.
Deletes a pre-defined database entry. Elicits a confirmation from the user.
Fetches redacted metadata for a pre-defined database.
Updates metadata of an existing pre-defined database. Credentials are never rotated through this tool. Turning read-only off asks for confirmation first.
Runs a parameterised SELECT query. Results above the default row limit are paged and cached as a result set resource.
Fetches the next page from a previously cached result set.
Lists database roles/logins. Credentials are never returned.
Lists schemas/namespaces available on the connection.
Returns columns, indexes, foreign keys, and any attached notes for a table.
Lists tables/views on the connection. Supports schema filtering and cursor-based pagination.
Deletes a note from a database object.
Gets the note attached to a specific database object.
Lists notes, optionally filtered by target type and/or path prefix.
Attaches or updates a note on a database object (database, schema, table, column, or connection).
Creates a new saved SQL script. Rejects if the name already exists.
Deletes a saved SQL script. Elicits a confirmation unless confirm=true.
Fetches a saved SQL script.
Lists saved SQL scripts.
Executes a saved SQL script against a connection. Scripts that change the database require confirmation.
Updates an existing saved SQL script.
Several database descriptor parameters use ambiguous naming. 'sslMode', 'trustServerCertificate' are SSL-related but not grouped; no description clarifies their interaction (can both be true? what if SSL is disabled?). Undocumented parameter relationships invite misconfiguration.
confirm parameter used across mutation tools (db_predefined_delete, notes_delete, scripts_delete, scripts_run) but documented inconsistently. Some say 'Skip confirmation' (db_predefined_delete), others 'Skip server-side confirmation' (notes_delete). Inconsistent phrasing may confuse LLM about semantics, does it bypass client-side checks, server-side checks, or both?
Pagination via cursor is used (db_list_predefined, db_tables_list, notes_list, scripts_list) but cursor structure and encoding scheme are not documented. LLM cannot construct a cursor manually and has no guidance on when to stop pagination (no documented 'nextCursor == null' or 'total == offset+limit' semantics).
defaultSchema, tags parameters appear in connection tools but lack description clarity. What format do tags use? Can they contain spaces or special characters? Is defaultSchema per-statement or per-session? Missing constraints invite invalid inputs.