Queries and inspects PostgreSQL databases, including ones reached through an SSH bastion, from VS Code, Cursor, Claude Code and similar clients.
Setup
Choose your client, copy the config, then fill in any required environment variables.
claude mcp add postgres --env DATABASE_URL='<DATABASE_URL>' --env PG_PASSWORD='<PG_PASSWORD>' --env PG_SSH_PASSPHRASE='<PG_SSH_PASSPHRASE>' --env PG_SSH_PASSWORD='<PG_SSH_PASSWORD>' --env PG_HOST='<PG_HOST>' --env PG_PORT='<PG_PORT>' --env PG_USER='<PG_USER>' --env PG_DATABASE='<PG_DATABASE>' --env PG_ALLOW_WRITE='<PG_ALLOW_WRITE>' -- npx -y mcp-postgres-server~/.codex/config.toml
[mcp_servers.postgres]
command = "npx"
args = ["-y", "mcp-postgres-server"]
env = { DATABASE_URL = "<DATABASE_URL>", PG_PASSWORD = "<PG_PASSWORD>", PG_SSH_PASSPHRASE = "<PG_SSH_PASSPHRASE>", PG_SSH_PASSWORD = "<PG_SSH_PASSWORD>", PG_HOST = "<PG_HOST>", PG_PORT = "<PG_PORT>", PG_USER = "<PG_USER>", PG_DATABASE = "<PG_DATABASE>", PG_ALLOW_WRITE = "<PG_ALLOW_WRITE>" }
# codex mcp add postgres --env DATABASE_URL='<DATABASE_URL>' --env PG_PASSWORD='<PG_PASSWORD>' --env PG_SSH_PASSPHRASE='<PG_SSH_PASSPHRASE>' --env PG_SSH_PASSWORD='<PG_SSH_PASSWORD>' --env PG_HOST='<PG_HOST>' --env PG_PORT='<PG_PORT>' --env PG_USER='<PG_USER>' --env PG_DATABASE='<PG_DATABASE>' --env PG_ALLOW_WRITE='<PG_ALLOW_WRITE>' -- npx -y mcp-postgres-server~/.cursor/mcp.json
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"mcp-postgres-server"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"PG_PASSWORD": "<PG_PASSWORD>",
"PG_SSH_PASSPHRASE": "<PG_SSH_PASSPHRASE>",
"PG_SSH_PASSWORD": "<PG_SSH_PASSWORD>",
"PG_HOST": "<PG_HOST>",
"PG_PORT": "<PG_PORT>",
"PG_USER": "<PG_USER>",
"PG_DATABASE": "<PG_DATABASE>",
"PG_ALLOW_WRITE": "<PG_ALLOW_WRITE>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"postgres": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-postgres-server"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"PG_PASSWORD": "<PG_PASSWORD>",
"PG_SSH_PASSPHRASE": "<PG_SSH_PASSPHRASE>",
"PG_SSH_PASSWORD": "<PG_SSH_PASSWORD>",
"PG_HOST": "<PG_HOST>",
"PG_PORT": "<PG_PORT>",
"PG_USER": "<PG_USER>",
"PG_DATABASE": "<PG_DATABASE>",
"PG_ALLOW_WRITE": "<PG_ALLOW_WRITE>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"mcp-postgres-server"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"PG_PASSWORD": "<PG_PASSWORD>",
"PG_SSH_PASSPHRASE": "<PG_SSH_PASSPHRASE>",
"PG_SSH_PASSWORD": "<PG_SSH_PASSWORD>",
"PG_HOST": "<PG_HOST>",
"PG_PORT": "<PG_PORT>",
"PG_USER": "<PG_USER>",
"PG_DATABASE": "<PG_DATABASE>",
"PG_ALLOW_WRITE": "<PG_ALLOW_WRITE>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"mcp-postgres-server"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"PG_PASSWORD": "<PG_PASSWORD>",
"PG_SSH_PASSPHRASE": "<PG_SSH_PASSPHRASE>",
"PG_SSH_PASSWORD": "<PG_SSH_PASSWORD>",
"PG_HOST": "<PG_HOST>",
"PG_PORT": "<PG_PORT>",
"PG_USER": "<PG_USER>",
"PG_DATABASE": "<PG_DATABASE>",
"PG_ALLOW_WRITE": "<PG_ALLOW_WRITE>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"mcp-postgres-server"
],
"env": {
"DATABASE_URL": "<DATABASE_URL>",
"PG_PASSWORD": "<PG_PASSWORD>",
"PG_SSH_PASSPHRASE": "<PG_SSH_PASSPHRASE>",
"PG_SSH_PASSWORD": "<PG_SSH_PASSWORD>",
"PG_HOST": "<PG_HOST>",
"PG_PORT": "<PG_PORT>",
"PG_USER": "<PG_USER>",
"PG_DATABASE": "<PG_DATABASE>",
"PG_ALLOW_WRITE": "<PG_ALLOW_WRITE>"
}
}
}
}Environment variables
DATABASE_URLPG_PASSWORDPG_SSH_PASSPHRASEPG_SSH_PASSWORDPG_HOSTPG_PORTPG_USERPG_DATABASEPG_ALLOW_WRITE
Replace the placeholders with your own credentials and keep them out of version control.