原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

PgVouch

作者:Shubh-Sgr版本 0.4.4i★ –i在你的电脑上运行
注册名称io.github.Shubh-Sgr/pgvouch

安装

概览

作者提供的说明(英文原文)

Safe PostgreSQL migrations: schema drift, lock analysis, safe rewrites, data checksums. Read-only.

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: stdio
  • 分类: 数据库与数据集
  • 你需要填写:SOURCE_DATABASE_URL, TARGET_DATABASE_URL

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 需要你自己填写: SOURCE_DATABASE_URL, TARGET_DATABASE_URL, PGVOUCH_LLM

标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。

你需要

  • npm已安装 Node.js(用于 npx 命令)

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "pgvouch": {
      "command": "npx",
      "args": [
        "-y",
        "pgvouch",
        "mcp"
      ],
      "env": {
        "SOURCE_DATABASE_URL": "your-value",
        "TARGET_DATABASE_URL": "your-value",
        "PGVOUCH_LLM": "your-value"
      }
    }
  }
}

在终端中运行这条命令

claude mcp add pgvouch --env SOURCE_DATABASE_URL=your-value --env TARGET_DATABASE_URL=your-value --env PGVOUCH_LLM=your-value -- npx -y pgvouch mcp

运行前请先填写空着的值。

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "pgvouch": {
      "command": "npx",
      "args": [
        "-y",
        "pgvouch",
        "mcp"
      ],
      "env": {
        "SOURCE_DATABASE_URL": "your-value",
        "TARGET_DATABASE_URL": "your-value",
        "PGVOUCH_LLM": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "pgvouch": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "pgvouch",
        "mcp"
      ],
      "env": {
        "SOURCE_DATABASE_URL": "your-value",
        "TARGET_DATABASE_URL": "your-value",
        "PGVOUCH_LLM": "your-value"
      }
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

需要你填写的值

  • SOURCE_DATABASE_URL 机密 必填 env
    Read-only postgres:// URL of the reference database
  • TARGET_DATABASE_URL 机密 必填 env
    Read-only postgres:// URL of the database to check
  • PGVOUCH_LLM env
    Optional planner LLM: none (default), ollama or gemini

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 Shubh-Sgr 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“数据库与数据集”中的其他服务器比较i

  • 星标数多于此分类中其他 1137 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 1137 个服务器的 61% 更新
  • 基础检查结果等于或优于此分类中其他 1137 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

PgVouch 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

你需要填写:SOURCE_DATABASE_URL, TARGET_DATABASE_URL

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(0.4.4)于34天前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。

有什么可以替代它?

同一分类中有:Supabase, MongoDB MCP Server, Elasticsearch MCP Server

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

Supabase

作者:supabase

MCP server for interacting with the Supabase platform

电脑或云端★ 2,993Apache-2.0昨天更新
安装

MongoDB MCP Server

作者:mongodb-js

MongoDB Model Context Protocol Server

在你的电脑上运行★ 1,157Apache-2.03天前更新
安装

MCP server for interacting with Elasticsearch

在你的电脑上运行★ 315Apache-2.014个月前更新
安装

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

PgVouch

An MCP server + CLI that lets AI assistants safely inspect, plan and _prove_ PostgreSQL migrations. The LLM proposes; deterministic code decides.

Real output against the seeded demo databases (1M transactions, 2M ledger entries) with the target broken as in step 2 below. Typing is real-time; command run times are shortened (the verify run took 14.0 s).

The problem

Writing ALTER TABLE is the easy part of a database migration. The hard parts are:

  1. What differs? Schemas drift between environments (hotfixes, failed migrations, manual changes).
  2. What will it lock? CREATE INDEX on a busy table blocks every write until it finishes. A "1 ms" ALTER TABLE can still cause an outage by waiting in the lock queue.
  3. Is the data really the same? "Row counts match" is not proof.
  4. Which rows are wrong? When proof fails, you need the exact rows, not "something in this 2M-row table".

AI assistants now write migrations, but they hallucinate objects, ignore locks and can't prove anything. PgVouch gives them (and you) read-only tools that answer those four questions, and it wraps every AI suggestion in deterministic checks.

Results (measured, not estimated)

All numbers come from npm run eval against the seeded Docker databases. The full tables are in evals/.

WhatResult
Drift detection over 32 seeded scenarios (tables, views, functions, triggers, enums, extensions, RLS)100% precision, 100% recall (34 true positives, 0 false positives, 0 missed)
Exact differing rows found by checksum bisection100% of seeded row changes, 0 false rows
Rows fetched to find them311 rows instead of 6,079,997 (the rows in the mismatched tables, both sides)
Lock mode predicted vs lock actually taken (read from pg_locks)36/36 statements, on PostgreSQL 13, 14, 15, 16 and 17
Table rewrite predicted vs actual rewrite (pg_class.relfilenode changed)35/35 statements
Sequence left behind its data after a copy (next INSERT would hit a duplicate key)found 1/1, 0 false alarms in 10 checks
Rules-only migration plans that pass a shadow run on a real schema copy27/27
LLM plans (local llama3.2, 3B), 17 drift scenarios of the first 21-scenario suite, *validator-only acceptance (v0.1.0)*5.9% valid on first try, 17.6% after one retry, 82.4% fell back to the rules plan; 0/3 accepted LLM plans passed the shadow run

Application stall during the migration, measured on the 1M-row table with a probe query every ~10 ms (evals/results-rewrite.md):

MigrationOriginal: max stallPgVouch rewrite: max stallRewrite total time
CREATE INDEX1.58 s47 ms2.1 s
ADD FOREIGN KEY (2M rows)1.01 s49 ms1.2 s
ADD CHECK440 ms63 ms0.85 s
SET NOT NULL625 ms31 ms0.68 s
ADD COLUMN ... NOT NULL DEFAULT gen_random_uuid()10.94 s964 ms108.7 s (batched backfill)
ALTER COLUMN merchant_id TYPE bigint6.51 s93 ms28.0 s (includes re-creating its foreign key; +3 manual steps)

What the LLM numbers show: a small local model is not reliable at migration planning. That's why PgVouch never trusts it. The validator rejected 14/17 plans (unparseable SQL, hallucinated or duplicate objects, blocking DDL). The 3 it accepted were *safe but incomplete*, and only the shadow run caught that (e.g. a missing index and a sequence left out when re-creating a dropped table). Deterministic rules plans passed all 17 (27/27 with the scenarios added later). Details: evals/results-llm.md.

What changed because of it: those numbers were measured when the validator alone decided. Now an LLM plan is accepted only if it passes the validator and a shadow run whose result matches the source exactly; a shadow failure is sent back to the LLM for one retry, then PgVouch falls back to the rules plan. So the 3 incomplete plans above would now be rejected. The LLM eval has not been re-run with the new pipeline yet, so there is no new number here.

The trade-off is visible: the rewrites that need a backfill take much longer in total, but the application keeps running. These are single runs on a laptop (Apple M1, 8 cores, Docker Desktop). Expect the absolute numbers to vary; the gap is the point.

How it works

flowchart LR

A["AI assistant (Claude Code, Cursor)"] -- "MCP (JSON-RPC, stdio)" --> S U["You (terminal)"] -- CLI --> S subgraph S["PgVouch core"] I["F1 introspect pg_catalog"] --> D["F2 diff (pure function)"] D --> P["F7 planner LLM + guardrail validator"] L["F5 lock analyzer (Postgres parser)"] --> R["F6 safe rewrites"] R --> P P --> SH["F10 shadow run (throwaway container)"] V["F3 chunked checksums"] --> B["F4 bisection"] P --> RC["F12 receipt (SHA-256)"] end S -- "read-only SQL" --> SRC[("source DB")] S -- "read-only SQL" --> TGT[("target DB")] P -. "structured facts only, no rows" .-> LLM["Ollama (local) or Gemini"]

Golden rule: the LLM never touches a database and never decides pass/fail. It proposes; the parser, the rules and the shadow run decide.

#FeatureHow
F1Schema introspectionpg_catalog (not information_schema, which hides index methods, partial-index predicates and NOT VALID)
F2Drift detectionA pure diffSchemas(source, target) over tables, columns, indexes, constraints, sequences, views, functions, triggers (including disabled ones), enum types, extensions and row-level security: deterministic and sorted, with severity rules, and it never guesses renames
F3Data verificationmd5(string_agg(md5(row::text) ORDER BY pk)) per primary-key chunk, inside a REPEATABLE READ snapshot with normalized session settings. Text keys are ordered byte-wise (COLLATE "C"), so servers with different collations agree. Also checks that every identity/serial sequence on the target is ahead of its data. On a target still being replicated to, --recheck looks at the differences again after a delay and reports only those that never catch up
F4Checksum bisectionMerkle-style: split the mismatched chunk at its median key and recurse only into halves whose hashes differ
F5Lock analyzerlibpg-query (Postgres' own parser, WASM) → rule table → risk from reltuples
F6Safe rewritesCONCURRENTLY, NOT VALID + VALIDATE, UNIQUE ... USING INDEX, expand/contract, batched DO loops with COMMIT per batch
F7Guarded LLM plannerzod-checked JSON → validator (parses, allow-list, objects exist, no unsafe DDL) → shadow run (the result must match the source) → one retry with the errors → rules-only fallback
F8MCP server7 read-only tools over stdio
F9Eval suite32 drift/data scenarios, 36 lock statements with ground truth from Postgres, and a stall benchmark under load
F10Shadow runsCopies the target's *schema* into a disposable container, applies the plan, and diffs the result against the source
F11ReversibilityTags each step reversible / reversible-with-backfill / data-lossy and generates rollback SQL
F12ReceiptsJSON of drift + verification + plan + shadow, with a SHA-256 over canonical (sorted-key) JSON
F13Lock-queue preflight"Safe to run right now?": the locks each statement needs vs. live pg_locks + pg_stat_activity, using Postgres' full 8×8 lock conflict table
F14PR review actionpgvouch review --format markdown + a GitHub Action: lock analysis and safe rewrites of changed migrations as a job summary and one PR comment

Get started

There are two ways to use PgVouch:

Option A: npm packageOption B: clone the repo
Best forYour own databases, CI, or an AI assistantTrying every feature on seeded demo databases, or contributing
NeedsNode 22 (or 20.12+)Node 22 (or 20.12+) and Docker
Commands run aspgvouch (or npx pgvouch )npm run cli --
Option A: use the npm package

1. Try it now, no database needed. Point it at any migration file:

npx pgvouch locks my_migration.sql --offline     # the locks each statement takes, and the risk

npx pgvouch rewrite my_migration.sql --offline # a safe, non-blocking version of the same migration

No migration file handy? Create one: echo "CREATE INDEX idx_amount ON transactions (amount);" > my_migration.sql

2. Install it (optional: npx pgvouch works without installing):

npm install -g pgvouch

pgvouch --help

3. Point it at your databases. Create a read-only role on each database (the SQL is here), then put a .env file in the folder you run PgVouch from:

SOURCE_DATABASE_URL=postgres://pgvouch_ro:PASSWORD@staging-host:5432/your_db

TARGET_DATABASE_URL=postgres://pgvouch_ro:PASSWORD@prod-host:5432/your_db PGVOUCH_LLM=none # rules-only plans; set it to ollama to let a local LLM propose plans

Variables already set in your environment take precedence over .env. Then check that both connections are read-only:

pgvouch doctor   # must say read_only=true and write privileges: none

4. Run it:

pgvouch diff                                      # schema drift (exit code 1 if any)

pgvouch verify --rows # checksums + exact differing rows pgvouch verify --rows --recheck 3 # target still being replicated to: ignore rows in flight pgvouch locks my_migration.sql # lock impact per statement, with real table sizes pgvouch preflight my_migration.sql # would it have to wait for locks RIGHT NOW? pgvouch rewrite my_migration.sql # safe multi-step script pgvouch review --format markdown migrations/*.sql # PR-comment report (offline, used by the GitHub Action) pgvouch plan --no-llm # rules-only plan that makes target match source pgvouch plan # LLM plan (Ollama) behind guardrails pgvouch shadow # plan, then prove it on a throwaway container (needs Docker) pgvouch receipt --shadow # hashed audit record pgvouch receipt-verify pgvouch-receipt.json

locks --fail-on high exits with code 1, so it can gate a CI pipeline on risky migrations.

preflight answers a different question: not "what will this lock?" but "is anyone holding or waiting for a conflicting lock right now?". It lists the sessions it would queue behind (pid, user, application, state, transaction age; never their query text), and flags that CREATE INDEX CONCURRENTLY waits for every older transaction in the database. It exits with code 1 if the migration would wait. PgVouch never terminates sessions.

5. Also: use it from an AI assistant (npx -y pgvouch mcp), or review every migration pull request with the GitHub Action (step 4 there).

Option B: clone the repo (demo databases included)

The repo includes two seeded Postgres databases, so you can try every feature without touching a real database. Requirements: Node 22 (or 20.12+) and Docker.

git clone https://github.com/Shubh-Sgr/pgvouch.git && cd pgvouch

npm in

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx