A secure, self-hostable Model Context Protocol server for PostgreSQL.
Four read-only tools with clear naming (verb_noun pattern) and complete JSON schemas. Descriptions are present and adequate (100-150 chars each), explaining WHAT each tool does. However, parameter descriptions lack depth, they state the obvious ('Name of the table') without explaining WHEN to use the tool or dependencies between tools. No output schemas documented. Error handling exists but lacks recovery guidance. Security filtering is implemented (column-level blocking) but not surfaced in tool descriptions. Overall: solid foundation, but descriptions could be more LLM-optimized and output structure needs documentation.
Describe the columns of a PostgreSQL table: names, data types, nullability, and default values.
List all non-system schemas in the connected PostgreSQL database.
List all tables in a PostgreSQL schema. Defaults to the 'public' schema.
Execute a read-only SQL SELECT query against the connected PostgreSQL database. Only SELECT statements are permitted. Results are automatically limited to MAX_ROWS rows.
Output schemas not documented. Tool descriptions do not specify what fields are returned (e.g., query returns rows with column names; list_tables returns table names and metadata). LLMs cannot plan downstream tool calls without knowing response structure.
Parameter descriptions are minimal and generic. 'Name of the table to describe' does not explain WHEN to call describe_table vs list_tables, or that it must be called after list_tables to discover available tables. Dependency hints missing.
Column-level filtering (BLOCKED_COLUMNS) is implemented but not documented in tool descriptions. Users/LLMs are unaware that sensitive columns (password, token, api_key, etc.) are automatically stripped from results. This hidden behavior can cause confusion.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | 2026-07-28+ | v2 |
Error handling returns generic messages ('Error: <message>') without recovery guidance. When a query fails, the LLM is not told whether to retry, adjust the SQL, or call a discovery tool first.
No pagination or result limits documented. The query tool description mentions 'MAX_ROWS' but does not state the actual limit or advise on pagination strategy for large result sets.