Read-only PostgreSQL MCP server with multi-database semantic routing.
Server has well-structured tool definitions with clear naming (verb_noun pattern) and comprehensive input schemas using Zod validation. All 6 tools have descriptions and typed parameters. However, parameter descriptions are sparse or missing in several tools (e.g., describe_table lacks schema/table descriptions), and output schemas are not formally documented. Error handling is present but minimal, describe_table returns a basic error object without recovery guidance. The semantic routing workflow is sophisticated but not reflected in tool composition guidance.
Return columns, primary key, and foreign-key edges (within the same database) for one table from the cached catalog.
List the logical PostgreSQL databases the server can route to, with descriptions and catalog status.
Score the configured logical databases against a natural-language intent using local embeddings over the database rollup and table summaries. Returns ranked candidates and routing evidence; the host should pick the database name to use with `query`.
Run a single read-only SQL statement against one logical database. Either pass `database` explicitly (recommended) or pass `intent` to let the server route automatically when the routing decision is unambiguous.
Rebuild the semantic catalog for one or more databases by introspecting their schemas and computing embeddings. Runs asynchronously; returns immediately with a task ID.
Find tables most semantically relevant to a query within a single logical database. Use after `match_databases` to scope embedding search.
describe_table parameters lack descriptions: 'schema' and 'table' have minLength constraints but no explanation of what they represent or expected format.
Output schemas are not formally documented. Tools return JSON text blobs without declaring field types, cardinality, or required fields. LLMs cannot plan downstream calls or extract structured data reliably.
Error handling is minimal. describe_table returns a basic error object; query and refresh_catalog have no visible error recovery guidance. Errors should tell LLMs what to do next (e.g., 'Run refresh_catalog if table should exist').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
query tool accepts both 'database' and 'intent' parameters with unclear mutual exclusivity. Description says 'Required unless intent is provided' but does not state what happens if both are passed or both are omitted.
refresh_catalog returns a task ID asynchronously but no polling mechanism or status-check tool is provided. Agents cannot determine when indexing completes.