-
Notifications
You must be signed in to change notification settings - Fork 0
Installation and Configuration
Temp edited this page Oct 3, 2025
·
1 revision
Complete installation guide for PostgreSQL MCP Server across all platforms and deployment methods.
- Version: 13, 14, 15, 16, or 17
- Access: Network connectivity to database
- Credentials: Valid username and password
- Extensions: See Extension Setup
- Python: 3.10 or later (for Python installation)
- Docker: 20.10+ (for Docker installation)
- Memory: 512 MB minimum, 1 GB recommended
- Storage: 100 MB for server files
Fastest and most reliable installation method.
docker pull neverinfamous/postgres-mcp:latest
docker run -i --rm \
-e DATABASE_URI="postgresql://username:password@localhost:5432/dbname" \
neverinfamous/postgres-mcp:latest \
--access-mode=restricted
version: '3.8'
services:
postgres-mcp:
image: neverinfamous/postgres-mcp:latest
stdin_open: true
environment:
- DATABASE_URI=postgresql://user:pass@postgres:5432/db
command: ["--access-mode=restricted"]
depends_on:
- postgres
postgres:
image: postgres:16
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Start services:
docker-compose up -d
For Python environments and development.
pip install postgres-mcp
postgres-mcp --version
export DATABASE_URI="postgresql://user:pass@localhost:5432/db"
postgres-mcp --access-mode=restricted
For development and customization.
git clone https://github.com/neverinfamous/postgres-mcp.git
cd postgres-mcp
# Install uv if not installed
curl -LsSf https://astral.sh/uv/install.sh | sh
# Sync dependencies
uv sync
uv run pytest -v
export DATABASE_URI="postgresql://user:pass@localhost:5432/db"
uv run python -m postgres_mcp.server --access-mode=restricted
# Basic format
export DATABASE_URI="postgresql://username:password@hostname:port/database"
# With SSL
export DATABASE_URI="postgresql://user:pass@host:5432/db?sslmode=require"
# With connection pooling
export DATABASE_URI="postgresql://user:pass@host:5432/db?pool_size=20"
# Cloud providers
# AWS RDS
export DATABASE_URI="postgresql://admin:pass@mydb.region.rds.amazonaws.com:5432/db"
# Google Cloud SQL
export DATABASE_URI="postgresql://user:pass@/db?host=/cloudsql/project:region:instance"
# Azure Database
export DATABASE_URI="postgresql://user@server:pass@server.postgres.database.azure.com:5432/db"
# Restricted mode (production) - read-only
--access-mode=restricted
# Unrestricted mode (development) - full access
--access-mode=unrestricted
See MCP Configuration for detailed client setup.
{
"mcpServers": {
"postgres-mcp": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "DATABASE_URI=postgresql://user:pass@host:5432/db",
"neverinfamous/postgres-mcp:latest",
"--access-mode=restricted"
]
}
}
}
{
"mcpServers": {
"postgres-mcp": {
"command": "postgres-mcp",
"args": ["--access-mode=restricted"],
"env": {
"DATABASE_URI": "postgresql://user:pass@host:5432/db"
}
}
}
}
-- Create user
CREATE USER mcp_readonly WITH PASSWORD 'secure_password';
-- Grant connection
GRANT CONNECT ON DATABASE mydb TO mcp_readonly;
-- Grant schema usage
GRANT USAGE ON SCHEMA public TO mcp_readonly;
-- Grant SELECT on all tables
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
-- Grant SELECT on future tables
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO mcp_readonly;
-- Grant EXECUTE on functions (for extensions)
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO mcp_readonly;
-- Create user
CREATE USER mcp_admin WITH PASSWORD 'secure_password';
-- Grant full privileges
GRANT ALL PRIVILEGES ON DATABASE mydb TO mcp_admin;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO mcp_admin;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO mcp_admin;
Edit postgresql.conf
:
ssl = on
ssl_cert_file = '/path/to/server.crt'
ssl_key_file = '/path/to/server.key'
ssl_ca_file = '/path/to/root.crt'
export DATABASE_URI="postgresql://user:pass@host:5432/db?sslmode=require"
# With certificate verification
export DATABASE_URI="postgresql://user:pass@host:5432/db?sslmode=verify-full&sslrootcert=/path/to/root.crt"
Install these extensions for core functionality:
-- Query tracking (required for performance tools)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Text similarity (required for text tools)
CREATE EXTENSION IF NOT EXISTS pg_trgm;
-- Fuzzy matching (required for text tools)
CREATE EXTENSION IF NOT EXISTS fuzzystrmatch;
Note: pg_stat_statements
requires PostgreSQL restart after enabling in postgresql.conf
:
shared_preload_libraries = 'pg_stat_statements'
-- Hypothetical indexes (for performance testing)
CREATE EXTENSION IF NOT EXISTS hypopg;
-- Vector similarity (for AI/ML applications)
CREATE EXTENSION IF NOT EXISTS vector;
-- Geospatial operations
CREATE EXTENSION IF NOT EXISTS postgis;
See Extension Setup for detailed installation instructions.
# Using MCP client
list_schemas()
# Expected: List of database schemas
analyze_db_health(health_type="all")
# Expected: Comprehensive health report
get_top_queries(sort_by="total_time", limit=5)
# Expected: Top 5 queries (requires pg_stat_statements)
# In restricted mode, this should fail:
execute_sql(sql="DROP TABLE test")
# Expected: "Operation not allowed in restricted mode"
# Create network
docker network create postgres-mcp-net
# Run PostgreSQL
docker run -d \
--name postgres \
--network postgres-mcp-net \
-e POSTGRES_PASSWORD=password \
postgres:16
# Run MCP server
docker run -i --rm \
--network postgres-mcp-net \
-e DATABASE_URI="postgresql://postgres:password@postgres:5432/postgres" \
neverinfamous/postgres-mcp:latest
# Mount configuration files
docker run -i --rm \
-v $(pwd)/config:/app/config \
-e DATABASE_URI="postgresql://user:pass@host:5432/db" \
neverinfamous/postgres-mcp:latest
version: '3.8'
services:
postgres-mcp:
image: neverinfamous/postgres-mcp:latest
healthcheck:
test: ["CMD", "pg_isready", "-h", "postgres", "-U", "user"]
interval: 30s
timeout: 10s
retries: 3
# Check logs
docker logs <container_id>
# Ensure -i flag is used
docker run -i --rm ...
# Verify DATABASE_URI is set
docker exec <container_id> env | grep DATABASE_URI
# From host
docker run -i --rm \
-e DATABASE_URI="postgresql://user:pass@host.docker.internal:5432/db" \
neverinfamous/postgres-mcp:latest
# Or use host networking
docker run -i --rm --network=host \
-e DATABASE_URI="postgresql://user:pass@localhost:5432/db" \
neverinfamous/postgres-mcp:latest
# Ensure correct Python version
python --version # Should be 3.10+
# Install in virtual environment
python -m venv venv
source venv/bin/activate # Linux/Mac
# or
venv\Scripts\activate # Windows
pip install postgres-mcp
# Use --user flag
pip install --user postgres-mcp
# Or use virtual environment (recommended)
-- Check pg_hba.conf
# Allow password authentication
host all all 0.0.0.0/0 scram-sha-256
# List databases
psql -h localhost -U postgres -l
# Create database if needed
createdb -h localhost -U postgres mydb
Optimize for MCP server workload:
# postgresql.conf
# Memory
shared_buffers = 4GB # 25% of RAM
work_mem = 64MB # Per query operation
maintenance_work_mem = 1GB # For maintenance operations
# Connections
max_connections = 100 # Adjust based on workload
# Query Performance
effective_cache_size = 12GB # 75% of RAM
random_page_cost = 1.1 # For SSDs
# Logging (for pg_stat_statements)
shared_preload_libraries = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
Add to DATABASE_URI:
export DATABASE_URI="postgresql://user:pass@host:5432/db?pool_size=20&max_overflow=10"
After installation:
- Extension Setup - Install PostgreSQL extensions
- MCP Configuration - Configure your MCP client
- Quick Start - Start using the tools
- Security Best Practices - Secure your deployment
See Home for more tool categories.