@rexymayderio/postgres-mcp
v1.1.0
Published
MCP server for PostgreSQL schema introspection and query execution
Downloads
227
Maintainers
Readme
PostgreSQL MCP Server
MCP server for PostgreSQL: schema introspection, SELECT (with lock confirmation), gated writes/DDL/transactions, templates, and EXPLAIN.
Quick Start (npx)
Secrets belong in agent mcp.json env (mcpServers.*.env) — not project .env. Do not create a project .env for runtime credentials.
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@rexymayderio/postgres-mcp"],
"env": {
"PGHOST": "localhost",
"PGPORT": "5432",
"PGDATABASE": "your_database_name",
"PGUSER": "your_username",
"PGPASSWORD": "your-password"
}
}
}
}Optional: DATABASE_URL, PGSSL=true, PG_STATEMENT_TIMEOUT_MS, PG_MAX_ROWS.
Privilege scope: use a least-privilege Postgres role. Prefer a SELECT-only user for read-heavy agents; use a separate write role when writes are required.
Tools
| Tool | Notes |
|------|-------|
| list_schemas | Non-system schemas |
| list_tables | Estimated rows (reltuples); exact_counts=true for COUNT(*) |
| describe_table | Columns, PK, FKs, indexes |
| list_relationships | FK graph |
| read_query | SELECT only; LIMIT-capped; FOR UPDATE/FOR SHARE need confirmed |
| write_query | INSERT/UPDATE/DELETE — strong confirm (separate from reads/DDL) |
| schema_query | CREATE/ALTER/DROP — strong confirm (separate from DML) |
| transaction_query | Multi-statement — per-statement risk preview + strong confirm |
| list_templates / run_template | Safe parameterized helpers |
| explain_query | Plan-only by default; analyze=true needs confirmed |
Writes are separate tools from reads. Agents must not use read_query for DML/DDL.
Strong confirmation
MCP has no native UI modal. Mutating tools return an impact preview and do not execute until called again with the same sql and confirmed: true.
Client operators should require approval on write_query, schema_query, and transaction_query (destructiveHint / non-readOnly).
Safety
- Comment-aware SQL classification (
WITH … INSERTis not read-only) - Multi-statement blocked on
read_query statement_timeouton connections- Confirmation previews explain impact before mutating or locking
- Errors redacted (no password/URL dumps)
Local development
npm install
npm test
npm run build
# Smoke (pass env inline — never create a repo .env):
# PGHOST=… PGDATABASE=… PGUSER=… PGPASSWORD=… npm run test:connectionsRisks
- Row content is untrusted (prompt injection)
transaction_querycan still run privileged SQL after confirmation — use a scoped DB role- Shared bot identity across sessions
Deferred
- Aurora IAM / RDS Data API
- Splitting read vs write into separate MCP packages
