Atlas / MCP servers / devopam / MCPg

MCPgCAUTION

mcp/devopam/mcpg

Postgres MCP Server

Verdict
CAUTION
Grade
D
Trust score
62 /100
Exposed tools
1 1r · 0w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
13
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://mcptoplist.com/server/io.github.devopam%2Fmcpg)

A production-grade [Model Context Protocol](https://modelcontextprotocol.io) server for PostgreSQL. It lets AI agents safely inspect, query, operate, and tune a Postgres database — 254 tools spanning catalog introspection, query intelligence, natural-language SQL, structural diffs, hybrid search, graph queries, data movement, live ops, and more.

[](https://pypi.org/project/mcpg/) [](https://pypi.org/project/mcpg/) [](https://github.com/devopam/MCPg/blob/main/LICENSE) [](https://github.com/devopam/MCPg/actions/workflows/ci.yml) [](https://scorecard.dev/viewer/?uri=github.com/devopam/MCPg) [](https://www.bestpractices.dev/projects/13958) [](https://github.com/devopam/MCPg) [](https://smithery.ai/servers/devopam/mcpg) [](https://glama.ai/mcp/servers/devopam/MCPg) [](https://allmcps.com/mcp/devopam-mcpg?verify=63d9d537-be6b-4e07-a720-77dd0c41411b) [](https://mcpvault.io/servers/mcpg/health?utmsource=externalbadge&utmmedium=referral&utmcampaign=mcphealthreport)

Try it live: point an MCP client — or the MCP Inspector — at the ho
Read from source at commit 7ba99b927c03OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (pypi)
claude mcp add mcpg -- uvx mcpg==0.8.2
03

Exposed tools (1)

1 read · 0 write · 0 destructive.

ToolRiskDescription
list_subscriptionsreadasync def _run() -> list[introspection.SubscriptionInfo]:
04

Trust audit

CAUTIONgrade D · trust 62/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (3 observation(s))
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
pinned
Secrets in source
found

Findings (25)

MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
benchmarks/README.md:52
export MCPG_TEST_DATABASE_URL=postgresql://postgres:postgres@localhost:5432/bench
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
benchmarks/tokens/tier_b/experiments/forced_nl2sql_comparison.py:23
--database-url postgresql://postgres:postgres@localhost:5433/demo \
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
benchmarks/tokens/tier_b/experiments/real_harness_comparison.py:51
--database-url postgresql://postgres:postgres@localhost:5433/demo \
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
docs/cookbook.md:281
MCPG_REPLICA_URLS=postgresql://reader:pw@replica-1/app,postgresql://reader:pw@replica-2/app
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
docs/installation.md:128
export MCPG_DATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/test_secrets.py:227
token="hvs.this_is_a_root_token_value",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/test_sql_kernel_driver.py:253
secret = "sup3r-sekret-token-xyz"
LOWInventory / provenance · inv.binary · CWE-1104
scratch/pr_reviews.txt
pr_reviews.txt
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scratch/pg_turboquant/benchmarks/rag/live_campaign.py:1470
module = importlib.import_module(module_name)
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/contract/test_tool_return_shapes.py:185
module = importlib.import_module(f"mcpg.{module_name}")
LOWCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
tests/unit/test_errors.py:24
module = importlib.import_module(module_name)
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scratch/pg_turboquant/benchmarks/rag/live_campaign.py:566
digest = hashlib.sha1(sanitized.encode("utf-8")).hexdigest()[:8]
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/mcpg/http_runtime.py:819
# — no RC4, no 3DES, no CBC modes, no NULL, no anonymous.
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/unit/test_http_runtime.py:1412
# AEAD only — no CBC, no RC4, no 3DES, no NULL, no anonymous.
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
tests/unit/test_http_runtime.py:1413
forbidden_substrings = ("RC4", "3DES", "DES-CBC", "NULL", "anon", "MD5", "EXPORT")
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
benchmarks/README.md:111
--e2e --e2e-http-url http://127.0.0.1:8000/mcp \
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
benchmarks/perf/runner.py:471
"http://127.0.0.1:8000/mcp). Implies the HTTP transport is already running.",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/unit/test_oidc.py:218
OIDCVerifier(issuer="http://127.0.0.1:8080", audience="mcpg")
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/mcpg/data_movement.py:404
stdin = base64.b64decode(content, validate=True)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/unit/test_data_movement.py:320
decoded = base64.b64decode(result.content)
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/unit/test_install_badges.py:34
config = json.loads(base64.b64decode(urllib.parse.unquote(next(iter(payloads.values())))))
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
tests/unit/test_sql_kernel_fuzz.py:39
"SELECT '' FROM t",  # zero-width space literal
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/feature-shortlist.md:339
| 21.2 | ✅ **Shipped — PR open.** **Fork + PR submitted:** [docker/mcp-registry#4689](https://github.com/docker/mcp-registry/pull/4689). Forked `docker/mcp-registry`, ran `go run ./cmd/validate --name
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
CHANGELOG.md:4213
unrestricted access mode.

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha 7ba99b927c03full audit observations/trust-audit/mcp-server/devopam__mcpg.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-107ba99b927c03CAUTIOND62first audit
06

Questions

What is the MCPg MCP server?

Postgres MCP Server

What tools does MCPg expose?

1 in total: 1 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is MCPg safe to connect to an agent?

With care. The audit graded it D (62/100) and found 25 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does MCPg need?

It reads ANTHROPIC_API_KEY, MCPG_AUDIT_REDACT_KEYS and MCPG_NL2SQL_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does MCPg run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as pg-turboquant.

How current is this page?

The grade is for one exact copy of the source (7ba99b927c03), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement