🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@itunified.io/mcp-postgres

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@itunified.io/mcp-postgres

PostgreSQL MCP Server — 27 tools for schema introspection, queries, CRUD, and server management via Model Context Protocol

latest
Source
npmnpm
Version
2026.4.10-2
Version published
Weekly downloads
26
-67.09%
Maintainers
1
Weekly downloads
 
Created
Source

mcp-postgres

AGPL-3.0 npm

A comprehensive PostgreSQL MCP (Model Context Protocol) server providing 27 tools for database management and administration.

Features

  • Connection Management — connect, disconnect, pool health monitoring
  • Query Execution — parameterized queries, EXPLAIN ANALYZE, prepared statements
  • Schema Introspection — tables, indexes, constraints, views, functions, enums, extensions
  • CRUD Operations — type-safe insert, update, delete, upsert with injection protection
  • Server Management — version, settings, config reload, uptime
  • Database Sizing — database and table sizes with index/toast breakdown

Installation

npm install @itunified.io/mcp-postgres

Or run directly:

npx @itunified.io/mcp-postgres

Configuration

Set one of the following environment variables:

# Option 1: Connection string (preferred)
export POSTGRES_CONNECTION_STRING="postgresql://myuser:mypassword@your-database.example.com:5432/mydb"

# Option 2: Individual variables
export PGHOST="your-database.example.com"
export PGPORT="5432"
export PGUSER="myuser"
export PGPASSWORD="mypassword"
export PGDATABASE="mydb"
export PGSSLMODE="require"  # optional

Multi-Database Configuration

Create a config file at ~/.config/mcp-postgres/databases.yaml:

databases:
  production:
    host: db.example.com
    port: 5432
    user: admin
    password: ${DB_PROD_PASSWORD}
    database: myapp
    ssl: true
  staging:
    host: staging-db.example.com
    port: 5432
    user: admin
    password: ${DB_STAGING_PASSWORD}
    database: myapp
default: production

Environment variables in ${VAR_NAME} syntax are automatically expanded.

Config file discovery order:

  • POSTGRES_CONFIG_FILE env var (explicit path)
  • ~/.config/mcp-postgres/databases.yaml or databases.json
  • POSTGRES_CONNECTION_STRING env var (single database)
  • Individual PG* env vars (single database)

Override the config path with POSTGRES_CONFIG_FILE env var:

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["@itunified.io/mcp-postgres"],
      "env": {
        "POSTGRES_CONFIG_FILE": "/path/to/databases.yaml"
      }
    }
  }
}

Use pg_list_connections to see all configured databases, pg_switch_database to change the active one.

HashiCorp Vault Integration (Optional)

mcp-postgres supports opportunistic secret loading from HashiCorp Vault via AppRole authentication. When configured, it fetches PostgreSQL credentials from a KV v2 path — so you never need to put database passwords in environment variables or config files.

How it works:

  • On startup, the server checks for NAS_VAULT_ADDR, NAS_VAULT_ROLE_ID, and NAS_VAULT_SECRET_ID in the environment
  • If all three are set, it logs in via AppRole and reads the configured KV v2 path
  • It populates POSTGRES_CONNECTION_STRING and PG* env vars from the Vault secret — but only for vars not already set
  • If Vault is not configured or unreachable, the server silently falls back to env vars

Precedence: Explicit env vars → Vault → config file fallback → (error if nothing set)

VariableRequiredDescription
NAS_VAULT_ADDRYes*Vault server address (e.g., https://vault.example.com:8200)
NAS_VAULT_ROLE_IDYes*AppRole role ID for this server
NAS_VAULT_SECRET_IDYes*AppRole secret ID for this server
NAS_VAULT_KV_MOUNTNoKV v2 mount path (default: kv)

* Only required if using Vault. Without these, the server uses env vars / config files directly.

Vault KV v2 secret structure:

# Path: kv/your/postgres/secret
{
  "connection_string": "postgresql://myuser:mypassword@your-database.example.com:5432/mydb",
  "host": "your-database.example.com",
  "port": "5432",
  "user": "myuser",
  "password": "mypassword",
  "database": "mydb"
}

Key mapping: connection_stringPOSTGRES_CONNECTION_STRING, hostPGHOST, portPGPORT, userPGUSER, passwordPGPASSWORD, databasePGDATABASE

Tip: You can store either connection_string (for single-database setups) or individual fields (host/port/user/password/database), or both. The loader maps whatever keys are present.

Vault setup steps:

  • Write PG credentials to a KV v2 path:

    vault kv put kv/your/postgres/secret \
      connection_string="postgresql://myuser:mypassword@your-database.example.com:5432/mydb" \
      host="your-database.example.com" \
      port="5432" \
      user="myuser" \
      password="mypassword" \
      database="mydb"
    
  • Create a read-only policy:

    path "kv/data/your/postgres/secret" {
      capabilities = ["read"]
    }
    
  • Create an AppRole and get credentials:

    vault write auth/approle/role/mcp-postgres \
      token_policies="mcp-postgres" token_ttl=1h
    vault read auth/approle/role/mcp-postgres/role-id
    vault write -f auth/approle/role/mcp-postgres/secret-id
    
  • Configure the server with Vault env vars (no PG creds needed):

    {
      "mcpServers": {
        "postgres": {
          "command": "npx",
          "args": ["@itunified.io/mcp-postgres"],
          "env": {
            "NAS_VAULT_ADDR": "https://vault.example.com:8200",
            "NAS_VAULT_ROLE_ID": "your-role-id",
            "NAS_VAULT_SECRET_ID": "your-secret-id"
          }
        }
      }
    }
    

Note: Config file options (POSTGRES_CONFIG_FILE, databases.yaml) and PGSSLMODE are not loaded from Vault — set them via env vars if needed.

Claude Desktop / MCP Settings

Add to your settings.json:

{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["@itunified.io/mcp-postgres"],
      "env": {
        "POSTGRES_CONNECTION_STRING": "postgresql://myuser:mypassword@your-database.example.com:5432/mydb"
      }
    }
  }
}

Tools

Connection (5 tools)

ToolDescription
pg_connectConnect to a database (default or named)
pg_disconnectDisconnect from a database or all
pg_connection_statusPool health for active or named database
pg_list_connectionsList all configured databases and status
pg_switch_databaseSwitch the active database context

Query (3 tools)

ToolDescription
pg_queryExecute parameterized SELECT/DML query
pg_query_explainRun EXPLAIN ANALYZE on a query
pg_query_preparedManage named prepared statements (PREPARE/EXECUTE/DEALLOCATE)

Schema Introspection (9 tools)

ToolDescription
pg_schema_listList all schemas
pg_table_listList tables (with optional schema filter)
pg_table_describeDescribe table columns, types, defaults, constraints
pg_index_listList indexes for a table
pg_constraint_listList constraints (PK, FK, unique, check)
pg_view_listList views with definitions
pg_function_listList functions/procedures with signatures
pg_enum_listList enum types and values
pg_extension_listList installed extensions

CRUD (4 tools)

ToolDescription
pg_insertInsert row(s) with parameterized values
pg_updateUpdate rows (requires confirm: true)
pg_deleteDelete rows (requires confirm: true)
pg_upsertInsert or update on conflict (requires confirm: true)

Server (4 tools)

ToolDescription
pg_versionPostgreSQL version
pg_settingsShow/search server configuration
pg_reload_configReload configuration (requires confirm: true)
pg_uptimeServer uptime and start time

HA Monitoring (4 tools)

ToolDescription
pg_replication_statusStreaming replication state and lag
pg_replication_slotsList replication slots
pg_wal_statusWAL generation rate and archive status
pg_standby_statusPrimary vs standby detection

Database Management (2 tools)

ToolDescription
pg_database_sizeSize of all databases
pg_table_sizesTable sizes with index/toast breakdown

Enterprise Edition

For advanced PostgreSQL operations, mcp-postgres-enterprise extends this server with:

  • DBA Monitoring — VACUUM, ANALYZE, REINDEX, pg_stat_activity, table/index stats, locks, cache hit ratio, bloat detection
  • CloudNativePG (CNPG) — K8s cluster management, failover, switchover, backup orchestration
  • HA Operations — Replication slot management, PgBouncer pool control
  • Backup / PITR — pg_dump/pg_restore orchestration, point-in-time recovery
  • RBAC — Role management, privilege grants, row-level security policies
  • Audit — Query log analysis, connection audit, permission mapping
  • Compliance — SSL enforcement, connection limit checks

Available as a private GitHub package. Contact itunified.io for access.

Security

Query Safety Model

  • CRUD tools (pg_insert, pg_update, pg_delete, pg_upsert): All use parameterized queries ($1, $2, ...) — safe from SQL injection. Destructive operations require confirm: true.
  • pg_query: Unrestricted raw SQL runner by design — intended for power users who need full SQL flexibility. No injection protection is applied because the tool's purpose is to execute arbitrary SQL.
  • pg_query_explain: Defaults to safe plan mode (EXPLAIN only, no execution). mode=analyze always requires confirm: true because EXPLAIN ANALYZE executes the statement.
  • pg_query_prepared: Deprecated. Prepared statements are session-local in PostgreSQL and unreliable with connection pools. Statement names are validated as SQL identifiers. Use parameterized pg_query instead.

Destructive Operations

These tools require confirm: true to execute:

  • pg_update, pg_delete, pg_upsert — data modification
  • pg_reload_config — server configuration
  • pg_query_explain (analyze mode) — statement execution

Credentials

  • Connection credentials are read from environment variables or JSON/YAML config — never logged or stored
  • All identifiers (table, column, schema names) are validated against a strict regex pattern

License

This project is dual-licensed:

See COMMERCIAL_LICENSE.md for details.

Contributing

Contributions are welcome! Please open an issue first to discuss proposed changes.

Keywords

mcp

FAQs

Package last updated on 10 Apr 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts