# mcp-postgres-server

MCP server for PostgreSQL: local, Docker, RDS, Neon, Supabase, or behind an SSH bastion.

- **Type:** MCP server
- **Trust:** 60/100 (B), scored on the package rubric
- **Verification:** community-indexed — nobody has claimed this listing
- **Version:** 0.3.1
- **Author:** io.github.antonorlov
- **License:** Unknown
- **npm:** mcp-postgres-server
- **Source:** https://github.com/antonorlov/mcp-postgres-server
- **Compatible clients:** claude-code, cursor, copilot, gemini (basis: transport)

## Trust

60/100 (B), scored on the package rubric
- Publisher verified: no
- Install scripts: nothing suspicious found
- Prompt-injection scan: not run
- Obfuscation scan: not run
- Evidence age: 20 days

## Security scan

- **Status:** clean
- **Scanned:** 2026-09-15T13:30:05.776Z
- **Version scanned:** 0.3.1
- **CVEs:** none found by OSV at scan time

## Tools

6 declared. Statically extracted from the shipped source — a floor on the surface, not a census.
- `query`
- `execute`
- `list_schemas` — List every schema in the connected database. Start here when exploring an unfamiliar database, then call list_tables for the schema you care about.
- `list_tables` — List all tables in a schema (default: 'public'). Use this before querying tables you have not seen yet, then call describe_table for column details.
- `describe_table` — Show the structure of one table: column names, data types, nullability, defaults, and primary-key membership. Call this before writing non-trivial queries again
- `connect_db` — Switch the server to a different PostgreSQL database at runtime, replacing the current connection.

## Install

**Verdict: review** — Installable, but 1 thing to check first: No publisher has proved control of this listing; it is indexed, not vouched for.
**Cautions** (coverage gaps and advisories — never blocking)
- No publisher has proved control of this listing; it is indexed, not vouched for.
**Config** (claude-code):
```json
"{\n  \"mcpServers\": {\n    \"mcp-postgres-server\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"-y\",\n        \"mcp-postgres-server\"\n      ],\n      \"env\": {\n        \"DATABASE_URL\": \"<YOUR_DATABASE_URL>\",\n        \"PG_PASSWORD\": \"<YOUR_PG_PASSWORD>\",\n        \"PG_SSH_PRIVATE_KEY\": \"<YOUR_PG_SSH_PRIVATE_KEY>\",\n        \"PG_SSH_PASSPHRASE\": \"<YOUR_PG_SSH_PASSPHRASE>\",\n        \"PG_SSH_PASSWORD\": \"<YOUR_PG_SSH_PASSWORD>\"\n      }\n    }\n  }\n}"
```
**Credentials it will ask for** (names only — Forge never holds a value):
- `DATABASE_URL` — Database URL (optional)
- `PG_PASSWORD` — Pg Password (optional)
- `PG_SSH_PRIVATE_KEY` — Pg SSH Private Key (optional)
- `PG_SSH_PASSPHRASE` — Pg SSH Passphrase (optional)
- `PG_SSH_PASSWORD` — Pg SSH Password (optional)
Placeholders only. Forge never holds, brokers, or transmits a credential value — replace each <YOUR_NAME> in your own config file. Do not send a value back to Forge; no Forge endpoint accepts one.
- This entry needs 5 credentials (0 required). The generated config carries placeholders, so it will fail in the editor rather than at runtime if they are left unset.

## Blast radius

Moderate blast radius — holds an api key; runs on your machine.
- Floor 26, ceiling 26 (tier: moderate)
- This is impact, not likelihood. A high radius is not a defect: a filesystem server is supposed to write files. It is never part of the trust score.

## Machine-readable views of this entry

- Signed JSON: https://forgeregistry.com/api/v1/packages/mcp-postgres-server
- Install plan: https://forgeregistry.com/api/v1/packages/mcp-postgres-server/install-plan
- Alternatives: https://forgeregistry.com/api/v1/alternatives/mcp-postgres-server
- HTML page: https://forgeregistry.com/registry/mcp-postgres-server
- MCP: POST https://forgeregistry.com/api/mcp → `forge_get_package` / `forge_install_plan`

## About this document

Generated by Forge (https://forgeregistry.com) — a compact rendering of the same record served, signed, at the JSON URL above. Trust and scan facts are the registry's own measurements; anything Forge did not measure is named as unmeasured rather than omitted.
