diffgate について
DiffGateは、コーディングエージェントがコードを書き込む前に呼び出せる、決定論的な変更レビュー用ツールです。エディター、コミット前フック、CIでも使え、変更行だけを調べて注意喚起、テスト実行、ブロックの要否を段階的に示します。
主な機能
- 01変更行のみをレビュー
- 02リスク段階別の検出結果
- 03高影響の変更でテストを実行
- 04MCP、エディター、CLI、CIで同じ判定
- 05ベンチマークで誤検出を再確認
活用シーン
- 01書き込み前のエージェント生成コード確認
- 02コミット前のステージ済み変更レビュー
- 03CIで高影響のコード変更をゲート
MCP 対応
MCPサーバーを通じて、コーディングエージェントは生成コードを検査し、構造化された検出結果を受け取れます。プロンプトとリソースも公開し、MCP、エディター、CLI、CIで同じレビューエンジンを使います。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
7掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| cwd | string | いいえ | リポジトリのルートディレクトリ。デフォルトは process.cwd() です。 |
| content | string | いいえ | 分析するファイルの内容。省略するとディスクから読み込みます。 |
| filePath | string | はい | ファイルの絶対パス、またはリポジトリからの相対パス。 |
詳細
DiffGate
コーディングエージェントがコードをディスクに書き込む前に自ら実行する、決定論的なガードレールです。
ほかのチェックはどれも実行が遅すぎます。レビュー用ボットには PR が必要です。pre-commit フックはエージェントが作業を終えて次に進んだ後に実行されます。DiffGate はエージェントフックです。エージェントが MCP 経由で呼び出すと、LLM トークンを一切使わず、ミリ秒単位で構造化された検出結果を返し、エージェントはまだコンテキストを把握しているうちに問題を修正できます。その後、同じエンジン、同じ判定がエディター、pre-commit フック、CI でも実行されます。モデルが自分の宿題を採点するのではなく、同じ入力には常に同じ答えが返ります。
設計上、不要な警告は出ません。変更された行だけを評価し(🟢マージ · 🟡確認 · 🟠検証)、変更内容に応じてテストを実行し、必要な場合にのみブロックします。自分でも diffgate bench を実行して再確認できる、公開済みのバージョン管理されたコーパスでは、誤ブロックは 0 件です(BENCHMARK.md)。誰もがノイズの少なさをうたいますが、このツールはコーパスも公開しています。
スキャナーでは見つからない問題を検出できる理由 — エージェントが実際にどんな間違いをするかを測定しました
ローカルモデルと最先端モデルを対象にした測定では、ゼロから書かれたコードにおける従来型の OWASP 脆弱性(SQL インジェクション、XSS、ハードコードされたシークレット)は 0% でした。しかし、完璧な新規コードを書いた同じ最先端モデルが、編集の 13% でセキュリティ上の危険な実装を再び持ち込みました。たとえば、ガードのない再帰的マージ(プロトタイプ汚染)、制限のない cors()(すべてのオリジンを許可)、包含チェックなしでリクエストデータから構築したパスなどです。エージェントの作業の大半は既存コードの編集であり、問題の痕跡は教科書ではなく差分に残ります。diffgate marginal を実行して、自分でも再確認できます。測定結果 →
同じ傾向は、サードパーティの保守性データにも表れています。GitClear の 2026 年の分析によると、ブロックの重複は 2023 年以降 81% 増加し(変更された 100 万行あたり 40.3 → 73.0)、ファイル間の関数のつながりは 35% 減少しました。つまり、エージェントはコードを再利用するのではなく、作り直しています。これに対応するのが reinvented-helper ルールです(docs/STRUCTURAL-RULES.md)。

| Tier | Meaning | What you do | Examples |
|---|---|---|---|
| 🟢 Green | 安全/自己完結型 | 自由にマージ | コメント、ローカルログ |
| 🟡 Yellow | レビュー(ソフト依存) | 確認する | 非推奨 API、生 SQL、ネットワーク呼び出し、依存関係の編集 |
| 🟠 Orange | 影響が大きいためゲート対象 | マージ前に検証 | スキーマ/マイグレーション、ハードコードされたシークレット、認証/暗号、公開 API の変更、インジェクションのシンク |
レビューボットではなくエージェントフックを使う理由
パイプラインのチェックはすべて、コードができてから実行されます。そして、後になるほど対応が遅れます。
| 実行されるタイミング | 問題 | |
|---|---|---|
| レビューボット(CodeRabbit、Greptile) | PR が作成された後 | コードは完成していて、弁明の準備も済んでおり、誰かが対応を待っています |
| コミット前フック | 作業を終えてコミットするとき | エージェントは先に進んでおり、修正するためにコンテキストを読み直す必要があります |
| MCP 経由の DiffGate | エージェントがまだコードを書いているとき | コードが取り込まれる前に、エージェントが自分の出力を修正します |
ただし、早いことだけが重要なのではありません。エージェントが無視するようにならないためには、静かでなければなりません。レビューボットは PR の作成後にコメントし、リンターやスキャナーは見つけたものをすべて指摘します。どちらも、リスクのある行が確実に議論されるとは限りません。マージ済みの AI 支援 PR 350 件をスキャンしました。AI に起因する変更に指摘があった 109 件のうち、著者以外の人間が公開の場で議論したのはわずか 3 件でした。DiffGate は、何に注意を向けるか、何をテストするか、あるいは何をブロックするかを判断し、それ以外は静かにします。それがこの製品のすべてです。
- 差分の範囲に限定。 指摘するのは、コミット済みのベースラインに対して変更された行だけです。ファイル全体に関するノイズや、触れていないコードについての蒸し返しはありません。
- 単なる一覧ではなく、段階的なトリアージ。 3 つの段階で対応を振り分けます。緑はマージ、黄色はひと目の確認、オレンジはゲート対象です。
- ゲートはあなたのテストを選択的に実行。 オレンジの変更では、DiffGate があなたの
testCommandを実行し、実際の終了コードと出力を表示します。緑と黄色はすぐに通過します。テストは影響が本当に大きい変更に限って実行されるため、コミット前フックは高速です。 - ブロックする正当性を獲得。 広範な複数言語対応のインジェクション検出結果は、単独では助言にとどまります。オプションのコードグラフによって、信頼されていないエントリーポイント(HTTP/イベントハンドラー)からシンクに到達可能だと証明された場合に限り、ブロック対象の指摘に昇格します。ルールからの再現率と、コードグラフに基づくブロック権限の両方を備えています。
- 変更の影響を考慮。 オプションのコードグラフを使うと、指摘にはファイルをまたいだ影響範囲(呼び出し元の数、推奨レビュアー、未テストの呼び出し箇所)が含まれ、誰からも呼び出されていないエクスポート済みシンボルは重要度が引き下げられます。ファイルをまたぐコンテキストによって、レビューはうるさくなるのではなく、静かになります。
- 高速。 変更された行のレビューはミリ秒で完了します。CI だけでなく、エージェントやエディターの内部ループにも組み込める速さです。
- 低ノイズを実証可能。
diffgate benchはバージョン管理されたコーパスをオフラインで実行します。変更に問題がない場合、適合率 100%/誤ブロック 0 件です。コーパスを公開しているのは、自分で再現できるようにするためです。BENCHMARK.md をご覧ください。
再現可能な測定
0%/13%という数値は宣伝文句ではありません。ローカルからフロンティアまでの 4 つのモデル、グリーンフィールドと編集モード、ウィルソン信頼区間を用いたスクリプト実験の結果であり、diffgate marginal で再実行できます。手法、モデル別の表、注意事項については、docs/MEASUREMENT.md をご覧ください。DiffGate のセキュリティルールは、ルール数を最大化するのではなく、測定された残存リスクに合わせて調整されています。
クイックスタート
npm install -g diffgate-review
cd your-repo
diffgate init # auto-detects language + test command, writes .diffgate.json
diffgate check --since=HEAD~20 # see what it catches in your own history — no PR required
diffgate check # review your pending changes right now
まだ Git の履歴も未コミットの変更もありませんか? まずは同梱のサンプルで出力を確認してください。
diffgate init --demo # live scan, no config or git changes needed
利用方法(共通エンジン、共通の判定)
1. コーディングエージェントで使う(MCP 経由)
最も効果的な使い方です。エージェントは生成したコードをディスクに書き込む前にセルフチェックし、構造化された指摘(LLM トークン消費ゼロ)を受け取ります。また、黙って書き換えるのではなく、修正内容(元のコード+修正+理由)を提示します。信頼性が高く決定的なセルフチェックがあれば、エージェントにより大きな自律性を安全に与えられます。
# Claude Code — one command:
claude mcp add diffgate -- diffgate mcp
# One-click via Smithery (zero config):
npx @smithery/cli install diffgate-review --client claude
# Cursor — add to MCP settings:
# { "diffgate": { "command": "diffgate", "args": ["mcp"] } }
または、Claude Desktop でワンクリック。 diffgate.mcpb をダウンロードして開いてください。サーバーはプロンプトとリソースも公開します。詳しくは MCP.md をご覧ください。
2. エディター内(VS Code / Cursor)
変更行にインラインの波線、ホバーカード(理由・担当者・クイックフィックス)、Risk Review ツリー、ステータスバーの概要、そしてDeep Review(オレンジ色の検出結果を対象とした、エージェントによる影響範囲分析)を表示します。CLI で得られるものと同じ判定を、レビュー中の差分に対して確認できます。
VS Code Marketplace または Open VSX(Cursor / Windsurf / Gitpod)からインストールしてください。
3. コマンドラインで、そして CI で
diffgate check は差分をレビューし、影響の大きい検出結果がある場合はゼロ以外の終了コードを返します。ローカルではプレコミットフックとして、パイプラインでは同じゲートとして使えます。
diffgate install-hook # adds .git/hooks/pre-commit; only runs tests on 🟠 orange changes
ローカルでの確認サイクルが導入のきっかけになります。コンテキストが新鮮なうちに修正でき、同じエンジンが PR ゲートとして実行されるため、判定はチーム全体で適用される場所にも引き継がれます。GitHub Action、共有学習、組織ポリシーパックについては、docs/TEAM.md をご覧ください。CI の実行では、同じゲートを通じて外部スキャナー(Semgrep)を任意で追加し、対応言語を広げることもできます。これは助言のみで、デフォルトでは無効です(docs/CONFIG.md)。
よく使うコマンド:
diffgate check # review pending changes (the gate)
diffgate check --staged # staged-only (pre-commit)
diffgate check --since=HEAD~20 # audit recent history, per-commit (see below)
diffgate check --agent # machine verdict for coding agents
diffgate scan <path> # analyze files directly (no git needed)
diffgate watch # live review as you edit
diffgate guidelines # review diff against AGENTS.md / CLAUDE.md etc.
diffgate feedback <rule> <f> <l> --dismiss # suppress a false positive (shared via git)
diffgate mcp # start the MCP stdio server
AI が作成した最近の履歴を監査します。 check の対象にログ内のコミットを指定すると、各検出結果が特定のコミットに紐付けられるため、リポジトリ全体の成績表ではなく、経緯を把握できます。
diffgate check --since=HEAD~20 # last 20 commits, one block per commit
diffgate check --since="2 weeks ago" # by date instead of a rev
diffgate check --ai-authored # only agent commits (Claude/Copilot/Cursor/… — heuristic)
diffgate check --author="Claude" # matches author *and* Co-authored-by trailers
diffgate check <sha> # a single commit by hash
履歴モードはレポートのみを生成します(過去を監査するもので、テストコマンドの実行やコミットのブロックは行いません)。--json と --limit=<n>(デフォルトは 50)に対応しています。マージコミットはスキップされます。
すべてのコマンド一覧は diffgate --help を実行して確認してください(report、bench、stats、graph、marginal、…)。
仕組み
- 差分を認識:
git diff(CLI)またはメモリ上の LCS 差分(エディター。未保存のバッファーも正確に処理)で変更行を特定し、検出結果はその行のみを報告します。 - 重要な箇所では実際の AST を使用:
@babel/parser(JS/TS)と tree-sitter(Python、PHP、Go、Ruby、Java、C#、Kotlin。WASM 経由で、ネイティブビルドは不要)が精密なルールを支えます。非推奨の呼び出しはコメントや文字列内ではマッチせず、エクスポートされたシグネチャの変更は構造的に検出されます。また、SQL インジェクションはシンクを対象とし、パラメーターとサニタイザーを認識します。cur.execute(f"… {uid}")/$pdo->query("… $id")はブロックされますが、cur.execute("… %s", (uid,))、$pdo->prepare("… ?")、シングルクォートで囲まれた'… $id'、ログ行内のSELECTはブロックされません。 - それ以外の箇所にも決定論的な基本検出を適用: Go、Java、Ruby、およびあらゆるテキストを対象に、コメントを認識するパターンルールで、シークレット、破壊的変更/スキーマ変更、認証/暗号、動的実行/シェル呼び出し、生のクエリ、ネットワーク呼び出しを検出します。コメントアウトされたコード(
# os.system(x))は警告されませんが、コメント内にコミットされたシークレットは警告されます。ドキュメント/文章ファイル(.md、.rst、…)にも同じ基準を適用します。変更履歴にある「oauth2-provider」という単語は認証コードではありませんが、README に貼り付けられたキーは漏えいとして検出されます。 - 根拠に基づくブロック: AST を使わない言語での広範なクロスランゲージのインジェクションに関する注意情報(Ruby の
#{}、Go/Ruby のシェル呼び出し)は、任意のコードグラフによって信頼できないエントリーポイントからの到達可能性が証明された場合に限り、ブロック対象に昇格します。コミュニティ版の CodeGraph を使うため、Pro の taint エンジンは不要です。(JS/TS、Python、PHP はローカルの AST 上の証拠に基づいてブロックするため、これは不要です。) - ゲート: 影響の大きい変更では、DiffGate が
testCommandを実行し、実際の終了コードと出力を表示します。 - 学習内容:
diffgate feedbackは却下/確認の判定を記録します。却下された検出結果(同じルール+同じコード)は、どこでも抑制されます。.diffgate/learnings.jsonに保存されます。チームで共有するには、このファイルをコミットしてください。 - 任意の追加機能: プロバイダーに依存しない AI レイヤー(平易な説明+修正)と、任意のコードグラフを介したファイル横断の影響範囲分析を利用できます。どちらもデフォルトでは無効で、問題が発生しても安全に何もしない動作にフォールバックします。
エンジンの構成:src/core(共有) · src/cli.ts(CLI) · src/mcp.ts(MCP) · extension/(VS Code)。
対応範囲は言語によって異なります
DiffGate が変更をどこまで詳しく分析するかは、ファイルの言語によって異なります。クリーンな結果をどの程度信頼すべきか判断できるよう、この点を明確にしておきます。
| Tier | Languages | Depth |
|---|---|---|
| Deep (AST) | JS / TS (@babel) | すべてのインジェクション分類に加え、公開 API とシグネチャの変更、非推奨 API のクイックフィックスを検出します。プロトタイプ汚染とNoSQL インジェクションは JS/TS のみが対象です。また、JS/TS の検出結果はコードグラフによるテイント確認の対象にもなります。 |
| Deep (AST) | Python, PHP, Go, Ruby, Java, C#, Kotlin (tree-sitter) | シンクを対象に、パラメーターとサニタイザーを考慮してインジェクションを検出します。プレースホルダー、引数ベクトル、エスケーパーは安全なものとして正しく扱われます。言語ごとのシンク分類は以下をご覧ください。 |
Deep-AST 対象言語ごとのシンク分類(すべてのサニタイザーと安全な形式、およびコードグラフの境界を含む詳細は、docs/SCOPE.md をご覧ください):
- Python(7) — SQL · XSS · パストラバーサル · CORS · コマンド · コード · デシリアライズ
- PHP(8) — SQL · コマンド · コード · ファイルインクルージョン · デシリアライズ · XSS · パストラバーサル · CORS
- Go(4) — SQL · コマンド · パストラバーサル · CORS
- Ruby(6) — SQL · コマンド · コード · デシリアライズ · XSS · CORS
- Java(6) — SQL · コマンド · デシリアライズ · パストラバーサル · XXE · CORS
- C#(7) — SQL · コマンド · デシリアライズ · パストラバーサル · XSS · XXE · CORS
- Kotlin(6) — SQL · コマンド · デシリアライズ · パストラバーサル · XXE · CORS
SSRF は、8 つすべての Deep-AST 対象言語にまたがるアドバイザリーです(リクエストによって汚染された URL が外部リクエストのシンクに渡される場合を対象とします。ライブラリを特定し、テイントされた場合に限るため、静的 URL や設定 URL は検出されません)。XXE は JVM(Java、Kotlin)と .NET(C#)を対象とし、ファイルに認識済みの強化策が示されている場合は検出されません。Permissive CORS も現在は8言語すべてが対象です。ワイルドカードの Access-Control-Allow-Origin、すべてのオリジンを許可するフレームワーク設定(gin/rs-cors、Spring @CrossOrigin、ASP.NET AllowAnyOrigin()、Ktor anyHost()、rack-cors)、リクエストから反映されるオリジンを検出します。明示的な許可リストは検出されません。
| Tier | Languages | Depth |
|---|---|---|
| Floor (pattern) | C/C++, Rust, Swift, Scala, … | シークレット、破壊的変更/スキーマ変更、認証/暗号化、動的実行/シェル呼び出し、生クエリ、ネットワーク呼び出し、TODO。コードグラフによって深刻度が上がる、言語横断のインジェクションアドバイザリー。 |
| Text | YAML, Terraform, JSON, any text | シークレットと TODO/FIXME マーカー。 |
高速さを設計の一部とし、対応範囲もそれに合わせています。 レビューは変更行に対して数ミリ秒で実行されます。そのため、エージェントやエディターのインナーループに同じチェックを組み込めます。この速度は意図的なトレードオフです。DiffGate は差分に対するゲートであり、リポジトリ全体を網羅するテイント解析エンジンではありません。対応範囲は言語ごとに異なり(AST がある言語では詳細に、それ以外では基本的なパターン検出)、セキュリティルールはルール数を最大化するのではなく、エージェントが実際に出荷する残存コードに合わせて調整されています。クリーンな結果が意味するのは「この言語の対応レベルでは何も一致しなかった」ことであり、「安全性が証明された」ということではありません。多くの言語にまたがる詳細なファイル間テイント解析には、専用の SAST を併用してください。言語ごとの詳細とコードグラフの境界については、docs/SCOPE.md をご覧ください。
設定
diffgate init を実行すると、リポジトリのルートに用途に合わせた .diffgate.json が生成されます。最小限の例:
{
"testCommand": "npm test", // run for orange changes (the gate)
"gate": { "mode": "working", "failOn": "orange" },
"deprecated": [
{ "pattern": "StripeClient.charge", "replacedBy": "StripeClient.createPaymentIntent" }
]
}
組み込みルールもカスタムルールも、include/exclude の glob でパスごとに適用できます。これは、禁止されているイディオムが正当な用途で使われる特定のファイルに対する例外手段です(例:設定ローダー自体の process.env)。スキーマ全体、組み込みルール一覧、LLM プロバイダー、ルールごとの調整については、docs/CONFIG.md をご覧ください。
詳細
- PR はレビューされました。しかし、リスクのある行はレビューされませんでした。 — PR の追跡調査です。AI の支援を受けてマージされた PR 350 件のうち、AI による変更としてフラグが付けられたものは 109 件、その作成者以外の人による公開の議論があったものは 3 件でした。
- docs/SCOPE.md: 言語ごとの対応範囲の段階(詳細な AST、パターン、テキストのみ)と、コードグラフが行うこと・行わないこと。
- docs/CONFIG.md:
.diffgate.jsonの完全なスキーマ、すべての組み込みルール、LLM プロバイダー、ネイティブ精度とテスト範囲の動作。 - docs/TEAM.md: チームへの DiffGate の展開(GitHub Action/PR ゲート、学びの共有、組織全体のポリシーパック、SOC 2 の証跡、リーダー向けの指標)。
- docs/CODE-GRAPH.md: オプションのファイル横断型の影響範囲分析(呼び出し元の数、推奨レビュアー、テストの不足、到達可能性、汚染分析)。
- docs/STRUCTURAL-RULES.md:
structuralパック — 脆弱性ではなく、過剰な設計(不要な抽象化、単なる受け渡しを行うラッパー、複雑さの急増)を検出します。すべてブロックせず、言語ごとのしきい値があります。 - docs/MEASUREMENT.md: エージェントが実際にプロンプトなしで出荷するものと、その再現方法(
diffgate marginal)。 - MCP.md: MCP ツール、プロンプト、リソース、AI の設定。
試してみる
diffgate scan mock_project
緑の検出結果(ロギング)、黄色の検出結果(非推奨の呼び出し)、オレンジの検出結果(DROP COLUMN マイグレーション、公開エクスポート)が表示されます。
テスト
npm test # builds the extension, runs the full unit/integration suite + extension smoke test
プロジェクトを支援する
DiffGate が何かを検出した場合、またはエージェントのコードに対する決定論的なゲートという考え方が気に入った場合は、リポジトリにスターを付けてください ⭐。ほかの人に、試してみる価値があると伝えるための合図になります。
- 🐛 誤ってブロックされた箇所や、見逃されたシンクがありましたか? イシューを作成してください — 誤ったブロックは P0 のバグとして扱います。
- 💡 対応してほしい言語やルールがありますか? 検出してほしいイディオムを添えて、機能リクエストを送信してください。
- 🔒 セキュリティに関する報告ですか? SECURITY.md を参照し、非公開でご報告ください。
コントリビューションとライセンス
CONTRIBUTING.md を参照してください。Apache 2.0 です。LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。