mcpField
V
vdiff-mcp

vdiff-mcp

本地服务
github.com/mcurmi05开发工具016 周前更新

关于 vdiff-mcp

vdiff-mcp 为开发者和编码 Agent 提供 npm 包版本间结构化的破坏性变更对比。它分析 TypeScript 声明文件而非变更日志,报告导出项和签名变化,并附带迁移说明与置信度。

主要功能

  1. 01比较不同版本的公开导出项
  2. 02检测已移除的导出项和成员
  3. 03识别函数签名变化
  4. 04提供变更前后的签名
  5. 05附带迁移说明和置信度

适用场景

  1. 01升级前检查包的变更
  2. 02帮助 Agent 将代码适配到新版本
  3. 03审查已移除或改变的 API 成员
  4. 04评估两个 npm 版本之间的兼容性

MCP 相关

MCP 服务封装使 MCP 客户端能够向 vdiff API 请求破坏性变更对比。项目还提供用于版本解析和差异查询的 REST 接口。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"mcurmi05-vdiff": {
"command": "npx",
"args": [
"-y",
"vdiff-mcp"
],
"env": {
"VDIFF_API_URL": "<VDIFF_API_URL>"
}
}
}
}
启动命令npx -y vdiff-mcp
需要配置的环境变量
VDIFF_API_URLBase URL of the vdiff API instance to use (defaults to the hosted https://vdiff-api.onrender.com)

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmvdiff-mcp0.1.2

工具

2

收录的工具列表 · 更新于 3 周前

参数类型必填说明
packagestring是npm 包名称,例如 "zod" 或 "@scope/pkg"

详细介绍

vdiff

用于 npm 包的破坏性变更差异 API。给定一个包和两个版本,它会返回结构化、机器可读的实际破坏内容列表:已移除的导出、已更改的函数签名,以及已移除或更改的类和接口成员。每条记录都包含变更前后的签名以及简短的迁移说明。

服务地址:https://vdiff-api.onrender.com。最简便的使用方式是通过 MCP 服务 vdiff-mcp:

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

也可以直接调用 REST API:

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

为什么要创建它

大模型在训练期间学习某个包的 API,之后这个包却不断迭代。当编码 Agent 使用 zod 或 express 编写代码时,它会针对自己记忆中的版本来编写,而这个版本往往不是 lockfile 中安装的版本。结果就是,Agent 自信地调用了早在两个大版本前就已重命名或移除的函数。

现有工具只能解决部分问题。版本查询工具会告诉 Agent 当前版本是什么;文档工具会告诉它如今的文档写了什么。但两者都无法回答 Agent 在编辑过程中真正关心的问题:“我所了解的版本和这里安装的版本之间有什么变化?”

vdiff 正是为此而生。它根据包自身的类型声明计算差异,而不是依据变更日志,因此输出反映的是实际导出的 API;每个响应还会附带置信度评分,让使用方知道结果的可信程度。

端点参考:docs/api.md。

工作原理

  1. 解析。 从 npm 注册表获取包元数据、版本和 dist-tags。
  2. 提取。 对两个版本分别下载 tarball,仅保留 .d.ts 文件,并使用 TypeScript 编译器 API 构建公共导出表(包括函数、类、成员和规范化的调用签名)。优先使用包内置的声明文件;如果包未提供,则回退到对应的 DefinitelyTyped @types/* 包,并按 major.minor 匹配版本。
  3. 比较。 对两个导出表进行差异比较,生成带类型的变更条目(例如 export_removed、signature_changed、member_removed 等),每条都包含变更前后的签名以及迁移说明。
  4. 缓存和统计。 结果存储在 Postgres 中,以(包、from、to)为键,因此每个版本对只会计算一次。每个请求都会记录缓存命中状态和用户代理。
  5. 防护。 按 IP 限制请求频率、限制同时进行的差异计算数量、限制 tarball 和提取后的声明文件大小,并设置获取超时,以确保服务公开后仍然安全。

差异仅针对类型层面:如果运行时行为发生变化而类型保持不变,则无法检测到。使用包内置类型的响应置信度为 0.9;使用社区维护的 @types/* 声明的响应置信度为 0.8。

API 概览

端点用途
GET /v1/diff两个版本之间的破坏性变更差异(必需参数为 from,to 默认为最新版本)
GET /v1/resolve获取包的最新版本和 dist-tags
GET /healthz存活状态检查

有关参数、响应结构、变更类型、错误代码和频率限制,请参阅 docs/api.md。

技术栈

层选择原因
运行时Node 20+、TypeScript仅支持 npm 的 .d.ts 差异比较需要使用 TS 编译器 API,因此采用单一语言
APIFastify 5速度快、精简,TypeScript 支持良好
差异比较typescript 编译器 API从 .d.ts 文件生成结构化符号表,是产品的核心
数据库Postgres 18(本地 Docker,生产环境 Neon)使用 JSONB 存储形状可变的差异数据,使用 SQL 处理计费和分析
注册表npm 注册表 HTTP API + tar获取 Packument 并解压 tarball,仅处理声明文件
测试Vitest为比较逻辑和 @types 版本匹配编写单元测试

代码与云平台无关:只需一个普通容器和 DATABASE_URL。目前运行在 Render 上,使用 Neon Postgres。

自行运行

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

也可以通过容器运行,方式与 PaaS 相同(启动时应用数据库架构,然后开始提供服务):

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

所有配置均通过环境变量设置:

环境变量默认值用途
PORT3000监听端口
DATABASE_URL本地 Docker PostgresPostgres 连接字符串
RATE_LIMIT_DIFF_MAX30每个 IP 每分钟可发送的 /v1/diff 请求数
RATE_LIMIT_RESOLVE_MAX120每个 IP 每分钟可发送的 /v1/resolve 请求数
COMPUTE_CONCURRENCY2同时进行的差异计算上限
TRUST_PROXY未设置在 PaaS 代理之后设置为 true,使速率限制器能够获取真实客户端 IP
加固说明
  • 速率限制:按 IP 限制,存储在内存中(单实例运行时足够)。平台健康检查使用的 /healthz 不受限制。
  • 计算上限:同时编译的未缓存差异最多为 COMPUTE_CONCURRENCY 个;超出的请求会收到带有 retry-after 的 503 响应。始终提供缓存的差异。
  • 大小限制:tarball 下载上限为 50 MB(通过 content-length 检查并统计字节数),每个版本解压出的声明文件上限为 15 MB。超出大小限制的包会返回清晰的 422 错误。
  • 获取时限:Packument 为 10 秒,tarball 为 30 秒。tarball 仅通过 HTTPS 从 registry.npmjs.org 获取。

项目结构

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 schema
mcp/                vdiff-mcp, the MCP server wrapping this API (published to npm)
docs/
  api.md            endpoint reference, kept current with the code

测试

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

许可证

API 和差异引擎采用 Functional Source License, v1.1, MIT Future License(FSL-1.1-MIT)授权:可免费用于任何用途,并可阅读和修改,但不得提供竞争性服务;每个版本发布两年后会自动转为 MIT 许可证。

mcp/ 中的 MCP 服务封装采用 MIT 许可证。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。