Skip to main content
Like AOF? Give us a star!
If you find AOF useful, please star us on GitHub. It helps us reach more developers and grow the community.

PostgreSQL MCP Server

Query and interact with PostgreSQL databases.

Overview​

PropertyValue
Package@modelcontextprotocol/server-postgres
SourceGitHub
Transportstdio

Installation​

npx -y @modelcontextprotocol/server-postgres postgresql://user:pass@host:5432/db

Configuration​

mcp_servers:
- name: postgres
command: npx
args:
- "-y"
- "@modelcontextprotocol/server-postgres"
- "${DATABASE_URL}"

Connection String Format​

postgresql://[user[:password]@][host][:port][/database][?options]

Examples:

# Local database
postgresql://localhost/mydb

# With credentials
postgresql://user:password@localhost:5432/mydb

# With SSL
postgresql://user:password@host:5432/mydb?sslmode=require

Tools​

query​

Execute a read-only SQL query.

Parameters:

  • sql (string, required): SQL query to execute

Example:

{
"tool": "query",
"arguments": {
"sql": "SELECT * FROM users WHERE status = 'active' LIMIT 10"
}
}

Returns: Query results as JSON array

Resources​

The server exposes database schema as resources:

Schema Resource​

postgres://host/database/schema

Returns table definitions, columns, and relationships.

Use Cases​

Database Analyst Agent​

apiVersion: aof.sh/v1alpha1
kind: Agent
metadata:
name: db-analyst
spec:
model: google:gemini-2.5-flash
mcp_servers:
- name: postgres
command: npx
args: ["-y", "@modelcontextprotocol/server-postgres", "${DATABASE_URL}"]
system_prompt: |
You are a database analyst. Help users:
- Write and optimize SQL queries
- Analyze data patterns
- Find anomalies in data
- Generate reports

Always use read-only queries. Never modify data.

Schema Inspector​

apiVersion: aof.sh/v1alpha1
kind: Agent
metadata:
name: schema-inspector
spec:
model: google:gemini-2.5-flash
mcp_servers:
- name: postgres
command: npx
args: ["-y", "@modelcontextprotocol/server-postgres", "${DATABASE_URL}"]
system_prompt: |
You analyze database schemas:
- Identify missing indexes
- Find normalization issues
- Suggest performance improvements
- Document table relationships

Use queries like:
- SELECT * FROM information_schema.tables
- SELECT * FROM information_schema.columns
- SELECT * FROM pg_indexes

Metrics Collector​

apiVersion: aof.sh/v1alpha1
kind: Agent
metadata:
name: db-metrics
spec:
model: google:gemini-2.5-flash
mcp_servers:
- name: postgres
command: npx
args: ["-y", "@modelcontextprotocol/server-postgres", "${DATABASE_URL}"]
system_prompt: |
You collect database metrics for monitoring:
- Active connections
- Slow queries
- Table sizes
- Index usage
- Lock contention

Query pg_stat_* views for metrics.

Example Queries​

Table Information​

SELECT table_name, table_type
FROM information_schema.tables
WHERE table_schema = 'public';

Column Details​

SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_name = 'users';

Index Usage​

SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;

Slow Queries​

SELECT query, calls, mean_time, total_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

Table Sizes​

SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

Active Connections​

SELECT count(*), state, usename, application_name
FROM pg_stat_activity
GROUP BY state, usename, application_name;

Security​

  • Read-Only: The server only allows SELECT queries
  • No DDL: Cannot CREATE, ALTER, or DROP
  • No DML: Cannot INSERT, UPDATE, or DELETE
  • Connection Security: Use SSL for production databases
# Use a read-only database user
mcp_servers:
- name: postgres
command: npx
args:
- "-y"
- "@modelcontextprotocol/server-postgres"
- "postgresql://readonly_user:${DB_PASSWORD}@host:5432/mydb?sslmode=require"

Create a read-only user in PostgreSQL:

CREATE USER readonly_user WITH PASSWORD 'secret';
GRANT CONNECT ON DATABASE mydb TO readonly_user;
GRANT USAGE ON SCHEMA public TO readonly_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly_user;

Troubleshooting​

Connection Refused​

Check database is accessible:

psql postgresql://user:pass@host:5432/db

SSL Required​

Add SSL mode to connection string:

postgresql://user:pass@host:5432/db?sslmode=require

Permission Denied​

Ensure user has SELECT permissions:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO your_user;