Postgres MCP server — agent-first database workbench. Exposes read-only SQL tools for AI agents to query PostgreSQL databases safely with PII redaction.
Tabulus demonstrates solid fundamentals: all 5 tools have clear verb-noun names (list_, describe_, sample_, safe_, explain), explicit input schemas with type definitions, and substantive descriptions (avg 120 chars). Parameters are typed and mostly described. However, output schemas are undocumented, LLMs cannot predict response structure. Error handling is basic (generic exception catches). No parameter constraints (enums, ranges, patterns) despite opportunities (e.g., safe_select should reject non-SELECT). Missing descriptions for some parameters (e.g., 'table' in sample_rows lacks detail on schema qualification). Security is strong (read-only enforcement, redaction support, audit logging), but composition could be tighter, describe_schema and sample_rows overlap in intent.
Describe a table: columns, types, primary key, foreign keys, indexes, and a small sample of rows. The single most useful tool for an agent trying to understand the data model.
Return the query plan for a SELECT statement (EXPLAIN FORMAT JSON).
List all tables in the database with row count estimates and sizes.
Run a read-only SELECT query. INSERT/UPDATE/DELETE/DDL are rejected. Results are capped at the server's max_rows setting (default 100).
Return a random sample of rows from a table.
Output schemas undocumented. LLMs cannot predict response structure (e.g., does list_tables return {tables: [...]} or [{name, rows, size}, ...]?). Forces agents to guess field names and types.
Parameter 'table' in sample_rows and describe_schema lacks description detail. Does it accept 'schema.table' or just 'table'? Ambiguity invites errors.
No input constraints (enums, ranges, patterns). 'limit' in sample_rows has no min/max; 'sql' in safe_select has no format hint. Agents may pass invalid values.
Error handling returns generic exception names ('UnsafeSQLError', 'Error: Exception: ...') without recovery guidance. LLM cannot determine if error is retryable or user-fixable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Functional overlap: describe_schema and sample_rows both return row samples. Unclear when to use which. Consider merging or clarifying distinct use cases in descriptions.