Vdiff Mcp

io.github.mcurmi05由 GitHub 帳號 mcurmi05 發布v0.1.2更新於 Oct 24, 2026

Breaking-change diffs for npm packages: removed exports, changed signatures, migration notes.

概覽

AI 產生的概覽

一個 MCP 伺服器,讓助理依據 npm 套件的型別宣告,取得兩個版本之間的破壞性變更差異。

可以做什麼
比對 npm 套件的兩個版本,列出被移除的匯出、變更的函式簽章,以及被移除或變更的類別與介面成員,每項附上變更前後簽章和遷移說明(透過 vdiff API)。查詢套件的最新版本與 dist-tags。結果來自套件自身的型別宣告,並附有信賴分數(內建型別為 0.9,改用 DefinitelyTyped 為 0.8)。
適用情境
當編碼助理依據訓練時記住的 npm 套件版本、而非鎖定檔中的版本撰寫程式碼時,可在修改或升級前先了解兩個版本之間究竟有哪些破壞性變更。
執行需求
透過 npx 以本機程序執行(需要 Node.js)。預設呼叫託管的 vdiff API;可用 VDIFF_API_URL 環境變數指向自架執行個體。未宣告身分驗證。需要能連線至該 API 與 npm registry 的網路。
安裝前請注意
預設請求會送往第三方託管 API,該 API 會記錄每次請求的快取命中狀態與 user agent,並依 IP 限流。差異僅限型別層面,型別未變的執行期行為變化無法呈現。將 VDIFF_API_URL 指向自架執行個體,代表需自行執行該 API 與 Postgres 資料庫。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Vdiff Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

vdiff

A breaking-change diff API for npm packages. Given a package and two versions, it returns a structured, machine-readable list of what actually broke: removed exports, changed function signatures, and removed or changed class and interface members. Each entry includes the before and after signatures plus a short migration note.

Live at https://vdiff-api.onrender.com. Most easily consumed through the MCP server, vdiff-mcp:

bash
claude mcp add vdiff -- npx -y vdiff-mcp

Or call the REST API directly:

bash
curl "https://vdiff-api.onrender.com/v1/diff?ecosystem=npm&package=zod&from=3.24.0&to=4.0.0"

Why this exists

LLMs learn a package's API surface during training, then the package moves on. When a coding agent writes code against zod or express, it writes for the version it remembers, which is often not the version in your lockfile. The result is confident code that calls functions that were renamed or removed two majors ago.

Existing tools only solve part of this. Version lookup tools tell the agent what the current version is. Documentation tools tell it what the docs say today. Neither answers the question the agent actually has mid-edit: "what changed between the version I know and the version installed here?"

vdiff answers exactly that. Diffs are computed from the package's own type declarations rather than changelogs, so the output reflects the real exported surface, and every response carries a confidence score so the consumer knows how much to trust it.

Endpoint reference: docs/api.md.

How it works

  1. Resolve. Fetch package metadata, versions and dist-tags from the npm registry.
  2. Extract. For each of the two versions, download the tarball, keep only the .d.ts files, and build a table of public exports (functions, classes, members, normalized call signatures) using the TypeScript compiler API. Bundled declarations are preferred; packages that ship none fall back to the matching DefinitelyTyped @types/* package, version-matched by major.minor.
  3. Compare. Diff the two export tables into typed change entries (export_removed, signature_changed, member_removed and so on), each with before/after signatures and a migration note.
  4. Cache and meter. Results are stored in Postgres keyed on (package, from, to), so each version pair is computed once, ever. Every request is logged with cache-hit status and user agent.
  5. Guard. Per-IP rate limits, a cap on simultaneous diff computations, size limits on tarballs and extracted declarations, and fetch timeouts keep the service safe to expose publicly.

Diffs are type-level: a runtime behavior change that leaves the types untouched is invisible. Responses using bundled types carry confidence 0.9; responses using community-maintained @types/* declarations carry 0.8.

API overview

EndpointPurpose
GET /v1/diffBreaking-change diff between two versions (from required, to defaults to latest)
GET /v1/resolveLatest version and dist-tags for a package
GET /healthzLiveness check

See docs/api.md for parameters, response shapes, change types, error codes and rate limits.

Stack

LayerChoiceWhy
RuntimeNode 20+, TypeScriptnpm-only .d.ts diffing needs the TS compiler API, so one language
APIFastify 5Fast, minimal, good TypeScript support
Diffingtypescript compiler APIStructured symbol tables from .d.ts files, the core of the product
DatabasePostgres 18 (Docker local, Neon prod)JSONB for variable-shape diff payloads, SQL for billing and analytics
Registrynpm registry HTTP API + tarPackuments and tarball extraction, declarations only
TestsVitestUnit tests for compare logic and @types version matching

The code is cloud-agnostic: a plain container plus a DATABASE_URL. It currently runs on Render with Neon Postgres.

Running it yourself

bash
docker compose up -d      # Postgres 18 on :5432npm installnpm run db:migrate        # apply src/db/schema.sqlnpm run dev               # API on :3000

Or containerized, the way a PaaS runs it (applies the schema on boot, then serves):

bash
docker build -t vdiff-api .docker run -p 3000:3000 -e DATABASE_URL="postgres://user:pass@host:5432/db" vdiff-api

Configuration

All configuration is via environment variables:

Env varDefaultPurpose
PORT3000Listen port
DATABASE_URLlocal Docker PostgresPostgres connection string
RATE_LIMIT_DIFF_MAX30Per-IP /v1/diff requests per minute
RATE_LIMIT_RESOLVE_MAX120Per-IP /v1/resolve requests per minute
COMPUTE_CONCURRENCY2Max simultaneous diff computations
TRUST_PROXYunsetSet true behind a PaaS proxy so the rate limiter sees real client IPs

Hardening notes

  • Rate limiting: per-IP, in-memory (fine while single-instance). /healthz is exempt for platform health checks.
  • Compute cap: at most COMPUTE_CONCURRENCY uncached diffs compile at once; excess requests get a 503 with retry-after. Cached diffs are always served.
  • Size guards: tarball downloads are capped at 50 MB (checked via content-length and counted bytes), extracted declarations at 15 MB per version. Oversized packages fail with a clear 422.
  • Fetch budgets: 10 s for packuments, 30 s for tarballs. Tarballs are only fetched from registry.npmjs.org over HTTPS.

Project layout

src/  index.ts          Fastify bootstrap, /healthz  routes.ts         /v1/resolve, /v1/diff: validation, cache, dedup, metering  registry/npm.ts   packument fetch, tarball download, .d.ts extraction  diff/    symbols.ts      .d.ts to symbol table (TS compiler API)    compare.ts      symbol table diff to breaking changes    engine.ts       orchestration, @types/* fallback, confidence  db/    schema.sql      packages, versions, diffs, diff_requests_log    migrate.ts      applies schemamcp/                vdiff-mcp, the MCP server wrapping this API (published to npm)docs/  api.md            endpoint reference, kept current with the code

Tests

bash
npm test          # unit tests (Vitest)npx tsc --noEmit  # typecheck

License

The API and diff engine are licensed under the Functional Source License, v1.1, MIT Future License (FSL-1.1-MIT): free to use, read and modify for anything except offering a competing service, and each release automatically becomes MIT two years after publication.

The MCP server wrapper in mcp/ is MIT licensed.

來源:README.md,提交 fc8f13f

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.2最新Sep 16, 2026

評分

已滿足適用檢查項的 40%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。