mcpField
L
linkedcheck

linkedcheck

本地服务
github.com/CloudCorpRecords版本控制01 周前更新

关于 linkedcheck

linkedcheck 根据 PR 文本、提交信息、目标 issue 标题和变更文件,检查 PR 是否确实支持其关闭声明。它结合关闭关键词与文件路径中的标题词匹配,给出关联强度判断,且仅处理提供的文本和路径。

主要功能

  1. 01扫描 PR 与提交中的关闭引用
  2. 02区分提及与关闭声明
  3. 03匹配 issue 标题词和文件路径
  4. 04输出四类关联判断
  5. 05纯本地校验输入

适用场景

  1. 01审核 PR 是否真正解决目标 issue
  2. 02发现有关闭声明但缺少范围证据的 PR
  3. 03从变更文件检查标题词重合

MCP 相关

作为 MCP 服务,提供 check_pr_issue_link 工具;客户端提交 PR 文本、issue 信息、变更文件及可选提交信息,以获取关联判断和匹配词。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"cloudcorprecords-linkedcheck": {
"command": "npx",
"args": [
"-y",
"@reneturcios/linkedcheck"
]
}
}
}
启动命令npx -y @reneturcios/linkedcheck

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

安装包
npm@reneturcios/linkedcheck0.1.0
ocighcr.io/cloudcorprecords/linkedcheck:0.1.0

工具

1

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

参数类型必填说明
pr_bodystring是拉取请求正文文本
issue_titlestring是PR 声称要关闭的问题的标题
issue_numberinteger是PR 声称要关闭的问题编号
changed_filesarray是PR 变更的文件路径
commit_messagesarray否PR 的提交消息(可选)

详细介绍

linkedcheck

描述中写着“fixes #123”的拉取请求 提出的是一个主张,而不是证明。它修改的文件可能 与该问题毫无关系,而在一长串待审请求中快速浏览的审阅者 也没有简单的方法判断这是真正的关联,还是一厢情愿。linkedcheck 会根据两项独立信号核验 这一主张:PR 本身的文字,以及其差异的范围。

第一项信号是文本中的关联。首先扫描 PR 正文, 然后按顺序扫描每条提交消息,查找关闭引用:以下关闭关键词之一:close、 closes、closed、fix、fixes、fixed、resolve、 resolves 或 resolved(不区分大小写,且必须是完整 单词),后面可以有空白字符,再接 #<issue_number>。 编号必须是完整标记,因此 #12 不会被视为对 issue 123 的引用,而 #1234 也不会。任何单独出现的 #<issue_number>,无论是否带关键词,都算作提及;关闭引用也始终算作提及。

第二项信号是范围。issue 标题会转换为小写, 并按 [a-z0-9] 以外字符组成的连续片段拆分;长度不足 3 个字符的标记和固定停用词列表 (the、a、an、in、on、of、for、to、when、 with、and、or、is、are、be、by、at、as、 it、this、that)会被删除。剩余部分即为标题中的词项。每个变更文件路径也会用相同方式进行标记化,而 matched_terms 是同时出现在文件标记中的词项排序列表——因此,关于登录重定向的问题与 src/login/redirect.ts 匹配,是实际的重叠,而非文字上的巧合。

这两项信号合并为一个判定:

  • linked — 存在关闭引用,且至少有 一个词项匹配。
  • weak — 存在关闭引用,但没有词项 匹配:提出了主张,却没有范围证据支持。
  • mentioned_only — 提及了该 issue,但没有 关闭关键词声称要解决它。
  • unlinked — 既没有关闭引用,也没有 提及。

格式错误的输入——缺少 pr_body 或其值不是字符串、issue_number 不是大于或等于 1 的整数、缺少 issue_title,或其值为空或不是字符串、缺少 changed_files 列表,或其值不是数组,或其中包含非字符串或空条目,或者 commit_messages 的值不是字符串数组——会导致验证错误,并指出出错路径;不会返回部分结果。计算是纯本地的:不访问网络、不需要配置,也不会读取仓库——linkedcheck 只检查你提供的文本和路径。

命令行界面

npx @reneturcios/linkedcheck check --input args.json
npx @reneturcios/linkedcheck --version

args.json 包含完整的参数对象:

{
  "pr_body": "Fixes #123",
  "issue_number": 123,
  "issue_title": "Fix login redirect loop",
  "changed_files": ["src/login/redirect.ts"],
  "commit_messages": []
}

结果以 JSON 格式打印:

{
  "verdict": "linked",
  "closing_reference": true,
  "mentioned": true,
  "matched_terms": ["login", "redirect"],
  "term_count": 4
}

退出代码:成功时为 0,发生运行时错误(包括输入文件无法读取或无效,或输入无效)时为 1,用法错误时为 2。

MCP 服务

npx -y @reneturcios/linkedcheck mcp

MCP 客户端配置:

{
  "mcpServers": {
    "linkedcheck": {
      "command": "npx",
      "args": ["-y", "@reneturcios/linkedcheck", "mcp"]
    }
  }
}
工具
  • check_pr_issue_link — 验证拉取请求是否确实解决了它声称要关闭的问题。

    • pr_body(字符串,必填,可为空)— 拉取 请求正文文本
    • issue_number(整数,必填,至少为 1)— PR 声称要关闭的 issue 编号
    • issue_title(字符串,必填,不可为空)— PR 声称要关闭的 issue 标题
    • changed_files(字符串数组,必填,可为空)— PR 修改的文件路径
    • commit_messages(字符串数组,可选, 默认值为 [])— PR 的提交消息

    返回 {verdict, closing_reference, mentioned, matched_terms, term_count},其中 term_count 是 issue 标题中不同词项的数量,而 matched_terms 是其中在变更文件中找到的词项子集,按排序排列。

Docker

docker run -i ghcr.io/cloudcorprecords/linkedcheck
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/linkedcheck check --input /w/args.json

开发

npm install
npm run build   # tsc -> dist/
npm test        # tsx --test test/*.test.ts (pure local, no network)
npm run dev     # run the CLI from source

许可证

MIT — 版权所有 (c) 2026 Rene Turcios

评论

支持 Markdown

第一次接触 MCP?

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

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