linkedcheck について
linkedcheck は、PR の終了宣言が本文や変更範囲によって裏付けられているかを、対象 issue のタイトルと入力されたコミットメッセージから確認します。終了キーワードの検出とファイルパス内のタイトル語の一致を組み合わせ、渡されたテキストとパスのみを処理します。
主な機能
- 01PR とコミットの終了参照を検出
- 02言及と終了宣言を区別
- 03ファイルパス内の issue タイトル語を照合
- 044種類の関連判定を返却
- 05入力をローカルで検証
活用シーン
- 01PR の issue 解決宣言を確認
- 02範囲の根拠がない終了宣言を検出
- 03変更パスと issue タイトル語の重複を確認
MCP 対応
MCP サーバーとして check_pr_issue_link ツールを提供します。クライアントは PR テキスト、issue 情報、変更ファイル、任意のコミットメッセージを渡し、判定と一致語を取得します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| pr_body | string | はい | プルリクエスト本文のテキスト |
| issue_title | string | はい | PR がクローズ対象としている問題のタイトル |
| issue_number | integer | はい | PR がクローズ対象としている問題の番号 |
| changed_files | array | はい | PR で変更されるファイルのパス |
| commit_messages | array | いいえ | PR のコミットメッセージ(任意) |
詳細
linkedcheck
説明文に「fixes #123」と記載されたプルリクエストは、主張をしているのであって、証明しているわけではありません。変更対象のファイルがイシューとまったく関係ない場合もあり、長いキューをざっと確認するレビュー担当者には、実際の関連付けなのか、単なる期待に基づくものなのかをすぐに判断する方法がありません。linkedcheck は、プルリクエスト自体の文言と差分の範囲という、独立した2つのシグナルに照らしてその主張を確認します。
1つ目のシグナルは、テキスト内の関連付けです。まずプルリクエストの本文をスキャンし、次に各コミットメッセージを順にスキャンして、クローズ参照を探します。クローズ参照とは、クローズを示すキーワード close、closes、closed、fix、fixes、fixed、resolve、resolves、resolved のいずれか(大文字と小文字を区別せず、単語全体として一致)があり、その後に任意の空白を挟んで #<issue_number> が続くものです。番号はトークン全体として一致する必要があるため、#12 はイシュー123への参照ではなく、#1234 も該当しません。キーワードの有無を問わず、裸の #<issue_number> が出現すればメンションとして数えられ、クローズ参照も常にメンションとして数えられます。
2つ目のシグナルは範囲です。イシューのタイトルは小文字に変換され、[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 が一致するのは、文言上の偶然ではなく、実際に重複する範囲があるということです。
2つのシグナルを組み合わせて、次のいずれかの判定を行います。
linked— クローズ参照があり、少なくとも1つの用語が一致します。weak— クローズ参照はありますが、一致する用語はありません。関連付けを主張しているものの、それを裏付ける範囲の証拠がありません。mentioned_only— イシューへのメンションはありますが、それを関連付けるクローズキーワードはありません。unlinked— クローズ参照もメンションもありません。
形式が不正な入力(pr_body がない、または文字列ではない、issue_number が1以上の整数ではない、issue_title がない、空、または文字列ではない、changed_files リストがない、配列ではない、または文字列以外もしくは空のエントリを含む、あるいは commit_messages の値が文字列の配列ではない)は、問題のあるパスを示す検証エラーになり、部分的な結果は返されません。計算は純粋かつローカルで行われます。ネットワークも設定も使用せず、リポジトリを読み込むこともありません。linkedcheck は渡されたテキストとパスだけを確認します。
CLI
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以上)— プルリクエストがクローズすると主張しているイシューの番号issue_title(文字列、必須、空でないこと)— プルリクエストがクローズすると主張しているイシューのタイトルchanged_files(文字列の配列、必須、空でも可)— プルリクエストが変更するファイルのパスcommit_messages(文字列の配列、省略可能、デフォルトは[])— プルリクエストのコミットメッセージ
{verdict, closing_reference, mentioned, matched_terms, term_count}を返します。term_countはイシューのタイトルに含まれる重複のない用語の数で、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 — Copyright (c) 2026 Rene Turcios
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。