Heimdall — Mcp Security Scanner について
Heimdallは、MCPサーバーやエージェント設定を事前に調べるローカルスキャナーです。接続やCI承認の前に評価する開発者やセキュリティチーム向けで、通常は未信頼のサーバーを実行せずにデータフローとサーバー間のリスクを追跡します。
主な機能
- 01プロンプトインジェクションとツール汚染の検出
- 02シークレットからネットワークへのデータフロー追跡
- 03サーバー間の情報流出経路の監査
- 04来歴、依存関係、CVEの確認
- 05ポリシー適用とSARIFレポート出力
活用シーン
- 01インストール前のMCPパッケージ検査
- 02CIでのMCP設定の審査
- 03サーバーのツール説明変更の確認
- 04エージェント接続前のサーバー機能確認
MCP 対応
MCPサーバーとして、接続前の評価に使う `scan_mcp_server` ツールをエージェントに提供します。エージェント向けのスキャンは静的解析のみで、対象サーバーを実行しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| target | string | はい | スキャン対象:npm パッケージ名、'pypi:<name>'、ローカルディレクトリのパス、GitHub URL、tools.json ダンプ、または MCP クライアント設定ファイルのパス(設定内のすべてのサーバーを監査します)。 |
| policy | enum | いいえ | 適用するポリシー。'strict' は重大度の高い CVE でも失敗とし、exec/eval/secret の機能を禁止します。default | strict |
| online | boolean | いいえ | OSV.dev で依存関係に既知の CVE がないかも確認します(ネットワーク呼び出しが発生します)。 |
詳細
Heimdall
エージェントの門を守る見張り番。
Model Context Protocol(MCP)サーバー向けのローカルで実行する事前セキュリティスキャナーです。サーバー単体、またはエージェントの設定全体を検査してから、エージェントに信頼させられます。アカウントもバックエンドも不要で、デフォルトではサーバーを実行しません。
MCP サーバーは未検証のコードであり、自然言語を介した攻撃対象になり得ます。ツールの説明はモデルにそのまま渡され、サーバーはあなたのマシンのアクセス権限で実行されるためです。Heimdall はサーバーの主張ではなく、実際にできることを評価し、正確な証拠を示します。すべてマシン上で実行され、アカウントは不要で、デフォルトではサーバーを実行しないため、パッケージをインストールする前に検査し、CI でゲートできます。
クイックスタート
npx mcp-heimdall-scan firecrawl-mcp # scan a published server
npx mcp-heimdall-scan ./claude_desktop_config.json # audit your whole agent config
npx mcp-heimdall-scan firecrawl-mcp --online # + check its deps for known CVEs (OSV.dev)
npx mcp-heimdall-scan ./my-server --policy strict # gate it in CI
インストール不要で、ローカルで実行され、マシンの外にデータが出ることもありません。
またはブラウザーでお試しください: caglarbozkurt.github.io/mcp-heimdall
— スキャナー全体が100%クライアントサイドで実行されます(npm パッケージは jsDelivr 経由で取得するか、
tools.json / MCP 設定を貼り付けてください)。バックエンドはなく、アップロードもありません。ローカルパスと --handshake には CLI が必要です。
検査項目
| 検査 | 検出する内容 |
|---|---|
| 🧬 インジェクション | ツール、リソース、プロンプトをまたぐツールポイズニング — 上書き、隠蔽、不可視文字、偽の <IMPORTANT> タグ |
| 🔓 機能 | ファイルシステム、ネットワーク、シェル、eval、特定の認証情報へのアクセス(SSH / AWS / キーチェーン / .env) |
| 🎯 実証済みの流出経路 | secret → network や fetch → eval を立証するデータフロー。file:line → file:line で示します |
| 📦 来歴と依存関係 | インストール時スクリプト、リポジトリ/ライセンスの欠落、依存関係から継承した機能 |
| 🛡️ 既知の CVE (オプトイン) | 宣言された依存関係を OSV.dev のアドバイザリデータベースで照合 — 実際の CVE ID を重大度順に表示します(--online) |
| 🕸️ 構成 | 設定全体を監査:サーバー間の流出チェーンとツール名の衝突 |
| 🔁 ドリフト | サーフェスのフィンガープリントを記録 — ツールの説明がひそかに変更される(ラグプル)と、重大な失敗として扱います |
各検出結果には file:line または tool:name が示されます。機能 ≠ リスク: 生の能力は参考情報としてプロファイルに表示され、スキャンが失敗することはありません。失敗の原因となるのは、明確なゲートと実際の異常だけです。
特長
- ローカルで動作し、サーバーを実行しません。 すべて静的解析で、デフォルトではオフラインです。アカウントもバックエンドも不要で、データがアップロードされることもありません。また、使い捨て VM でのみ使用するよう記載されている
--handshakeを有効にしない限り、信頼できないコードを実行することはありません。インストールする前に、パッケージを確認できます。 - データの流れを明らかにします。 汚染解析/データフロー解析により、「ファイルを読み取り、かつネットワークを使うなら失敗」という判定を、場所を特定した具体的なデータの流れに置き換えます。そのため、設定ファイルの読み取りと無関係な API 呼び出しを誤検知しません。
- ゲート全体を把握します。 設定済みのサーバーの集合を横断して分析するため、各サーバー単独では見えない、サーバー間の情報流出経路も検出できます。ほとんどのスキャナーは、一度に 1 つのサーバーしか確認しません。
- 制御できるゲートです。 検出器は事実を出力し、ユーザーが定義したポリシーが、それを合格/警告/失敗に判定します。機能を拒否し、出所情報を必須にし、監査可能な例外を追加し、CI にゲートを設定できます。
使い方
heimdall <target> [options]
| 対象 | 例 |
|---|---|
| ローカルディレクトリ | heimdall ./servers/my-mcp |
| npm パッケージ | heimdall some-mcp-package |
| PyPI パッケージ | heimdall pypi:some-mcp-server |
| git リポジトリ | heimdall https://github.com/user/repo |
| tools/list のダンプ | heimdall tools.json |
| MCP クライアントの設定 | heimdall ./claude_desktop_config.json |
オプション
--tools <file> supplement analysis with a tools/list (or {tools,resources,prompts}) dump
--policy <p> "default", "strict", or a JSON policy file
--baseline <file> diff against a prior --json report (drift / rug-pull detection)
--handshake RUN the server(s) for the live tool list (untrusted code — VM/container only)
--online check declared deps against OSV.dev for known CVEs (sends dep names, not source)
--json machine-readable report
--sarif SARIF 2.1.0 (GitHub code-scanning / CI)
--no-fail always exit 0
Exit codes: 0 pass/warn · 1 fail · 2 error
ポリシー
検出器は事実を出力し、ポリシーがそれを判定に変換します。デフォルトのポリシーを使用するか、strict を選ぶか、調達・セキュリティの基準を独自に記述してください。
ポリシーの例(policy.example.json)
{
"name": "acme-procurement",
"denyCapabilities": ["exec", "dynamic-eval", "secret-access"],
"require": ["has_repository", "has_license"],
"failOnSeverity": "high",
"warnOnSeverity": "low",
"allow": [{ "id": "capability/scope-mismatch", "reason": "reviewed", "expires": "2026-12-31" }]
}
例外には理由と任意の有効期限が設定されます。有効期限が切れると例外は失効し、再び検出対象になります。
ライブラリ
import { scan } from "mcp-heimdall-scan";
const report = await scan("some-mcp-server", { policy: "strict" });
if (report.verdict === "fail") throw new Error(report.reasons.join("; "));
Claude Code スキル(skill/)としても提供されます。インストール前に、会話中にサーバーを確認できます。
MCP サーバーとして使う
エージェントに scan_mcp_server ツールを追加すると、接続する前にサーバーを確認できます。「追加する前にスキャンしてください」。Heimdall を MCP クライアントの設定に追加してください。
{
"mcpServers": {
"heimdall": {
"command": "npx",
"args": ["-y", "--package", "mcp-heimdall-scan", "heimdall-mcp"]
}
}
}
このツールは target(npm パッケージ、pypi:<name>、パス、GitHub URL、tools.json、またはクライアント設定)と、任意の policy および online を受け取ります。これは静的解析専用です。サーバーをダウンロードしますが、実行することはありません。また、コード実行モード(--handshake、validate)は意図的にエージェントに公開していません。
CI で使う(GitHub Action)
すべてのプルリクエストをゲートし、MCP 設定(またはサーバー)をスキャンして、リスクがある場合はビルドを失敗させます。.github/workflows/ に次の内容を追加してください。
- uses: caglarbozkurt/mcp-heimdall@v1
with:
target: ./claude_desktop_config.json # a path, npm/pypi package, github URL, or tools.json
policy: strict # "default", "strict", or a JSON policy file
online: true # also check deps for known CVEs (OSV.dev)
sarif: heimdall.sarif # optional: emit SARIF for code scanning
| 入力 | デフォルト | 説明 |
|---|---|---|
target | — | スキャン対象(必須) |
policy | default | default、strict、または JSON ポリシーのパス |
online | false | OSV.dev を使って、依存関係に既知の CVE がないか確認します |
sarif | — | SARIF をこのパスに出力します(github/codeql-action/upload-sarif 用) |
fail-on-findings | true | FAIL 判定でジョブを失敗させます(報告のみの場合は false に設定) |
version | latest | 再現性のある CI 実行のために、mcp-heimdall-scan のバージョンを固定します |
すべて独自の CI ランナー上で実行されます。バックエンドは不要で、パブリックリポジトリでは無料です。
検証(動作のクロスチェック)
静的解析では、サーバーが「何をできるか」が分かります。heimdall validate は、それがサーバーの「実際の動作」と一致するかをチェックします。機能の記録機能を事前に読み込ませた状態でサーバーを実行し(fs / net / http(s) / child_process / vm / fetch / process.env をフックします)、各ツールを動作させて、観測された実行時の動作と静的フラグを比較します。
heimdall validate ./my-server # one server: confirmed / missed / not-exercised
heimdall validate --list servers.txt # batch: a recall number over observed behavior
- 確認済み — フラグが付いており、実際にも観測されました(静的な判定が裏付けられています)。
- 未実行 — フラグは付いていますが、単純な引数では動作しませんでした(「下限」を示すものであり、フラグが誤りだという証明ではありません)。
- 検出漏れ — 観測されたものの、フラグが付いていませんでした → 静的解析に実際の見落としがあるため、確認が必要です(または、ライブラリの偶発的な副作用です)。
そのため、偽陰性(静的解析の見落とし)の発見には信頼できますが、フラグが誤りだと証明するものではありません。
各サーバーは、継承したシークレットがない使い捨ての HOME と作業ディレクトリで実行されますが、それでも「サーバーを実行し、ツールを呼び出し」ます(ネットワーク/実行の副作用があります)。使い捨ての VM/コンテナで使用してください。
実際のパッケージ 200 件を対象にした動作実行(benchmarks/validate-run.md):
55 件が起動し、34 件で観測可能な機能が実行されました。サーバーが実行時に「実際に使った」機能のうち、静的スキャンでフラグが付いたのは 80.9%(55/68)でした。初回実行での見落としを修正リストに加えた後の 75.8% から向上しています(依存関係に基づくネットワーク検出を拡張し、ネットワークの見落としをおよそ半減させました)。残る見落としは「構造上のもの」です。静的解析では根本的に検出できない、依存関係の内部またはサブプロセス内で実行される機能です。まさにそのために、バックストップとして validate があります。再現率を正直に公開し、実行ごとに改善しています。
大規模なテスト
npm レジストリから取得した実際の MCP パッケージ 2,500 件(benchmarks/)を対象に実行:1,726 件をスキャンし、約 5 分で完了、0.7% にフラグが付きました。雑多な実環境のコードに対して堅牢に動作します。これとは別に、小規模なラベル付きフィクスチャコーパス(npm run eval、Damn Vulnerable MCP プロジェクトを含む、良性/悪性のフィクスチャ約 10 件)では 100% を達成しています。これは較正チェックであり、幅広い実環境での精度を示す数字ではありません。上記の実環境スキャンにはラベルがなく、堅牢性の確認にのみ使用しています。ログ全文:
benchmarks/field-run.md。
このスキャンから分かる、エージェントが信頼するエコシステムの実態:
| 実際の MCP サーバー 1,726 件のうち… | 割合 |
|---|---|
| シェルコマンドを実行できる | 45% |
| ネットワーク呼び出しを行う | 67% |
実行時にコードを eval できる | 9% |
| 実行とネットワークの両方が可能 | 34% |
| 認証情報ファイルにアクセスする | 5% |
フラグが付いた 0.7% は、インストール時のコード実行とプロンプトインジェクションによるものでした。ツールの説明に不可視のゼロ幅文字が埋め込まれた実際のサーバーも含まれています。こうしたステルス型のツールポイズニングは、キーワードスキャナーでは見逃されます。
堅牢性と分布の確認を目的とした実行は、精度ベンチマークではありません。2,500 件のサーバーにはラベルが付いていません。フラグが付いた場合は「要確認」を意味し、悪意が証明されたわけではありません。
セキュリティと制限事項
Heimdall はヒューリスティックによる事前チェックであり、安全を保証するものではありません。PASS は安全の証明ではありません。機能、来歴、CVE の分析は JS/TS と Python に対応し、インジェクション検出は言語を問いません。実証済みの汚染追跡/データフロー解析は JS/TS のみです。Python では、機能の併存チェック(実証済みのフローではなく、保守的な判定)にフォールバックします。
デフォルトではすべてオフラインで実行されます。ネットワークに接続するのは --online の場合のみです(依存関係名とバージョンを OSV.dev に送信します。ソースコードは送信しません)。また、CVE の照合対象は宣言された範囲であり、ロックファイルではありません。--handshake は信頼できないコードを実行するため、実際のサンドボックスではありません。脅威モデルの詳細と脆弱性の報告方法については、SECURITY.md を参照してください。
貢献
検出ルールの追加は、最も価値の高い貢献です。詳しくは CONTRIBUTING.md を参照してください。参加することで、行動規範に同意したものとみなされます。
ライセンス
MIT · Çağlar Bozkurt が制作
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。