mcpm について
mcpm は、MCP サーバーの検索、インストール、管理、監査を行うローカル CLI で、信頼性評価と実行時チェックを備えています。複数の AI クライアントの MCP 構成を管理する人向けに、パッケージ管理とローカルのセキュリティ制御を組み合わせています。
主な機能
- 01レジストリのサーバー検索とインストール
- 02信頼性評価とインストール監査
- 03ローカルリレーによるツール呼び出し検査
- 04ツール定義の固定と変更検知
- 05サーバースタックとロックの管理
- 06クライアント構成の健全性確認
活用シーン
- 01インストール前の MCP サーバーリスク確認
- 02複数クライアントにあるサーバーの監査
- 03プロジェクトで固定したサーバー構成の再現
- 04構成上の問題や平文の秘密情報の検出
MCP 対応
mcpm は MCP サーバーのインストールとクライアント構成を管理します。ローカル stdio リレーが AI クライアントとサーバーの間に入り、ツール呼び出しを検査してツール定義の変更を検知します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
mcpm — MCP セキュリティガード兼パッケージマネージャー
Model Context Protocol(MCP)サーバーにおけるプロンプトインジェクション、ツールポイズニング、ラグプル、認証情報の窃取を、実行時にお使いのマシン上で阻止します。 AI エージェントは通信するすべての MCP サーバーを信頼します。mcpm はインストールごとにスコアを付け、Sigstore でサプライチェーンを検証し、各ツールの定義を固定して、ローカルリレーを介してすべてのツール呼び出しを検査します。macOS ではオプトインで OS サンドボックスも利用できます。強制処理経路にクラウド、アカウント、LLM はありません。
すべてお使いのマシン上で動作します。 アカウントも mcpm バックエンドもテレメトリーもありません。ガードはローカルの stdio リレーであり、信頼スコアはモデルやリモートの判定を使わずローカルで算出されます(40 ポイントの静的スキャン枠は、ご自身で確認できる決定論的な正規表現/構造チェックです。残りはローカルのヘルスチェック、レジストリのメタデータ、および指定した場合に限り外部スキャナーを使用します)。サーバーの解決、監査、再検証を行うコマンドは、公開 MCP レジストリと npm に接続しますが、mcpm サーバーには何も送信されません。
MCP サーバーの危険性はインストール時ではなく、エージェントの実行中に現れます。ツールの出力に隠されたプロンプトインジェクション、承認後にひそかにツールを書き換えるサーバー、モデルに指示を紛れ込ませるサンプリングリクエストなどです。レジストリに掲載されていることは安全の証しではありません。2026 年には、概念実証の悪意あるサーバーが11 の公開レジストリおよびマーケットプレイスのうち 9 つに受け入れられました。そこで mcpm は、ハードコードされた秘密情報、プロンプトインジェクション、タイポスクワッティングについてすべてのインストールにスコアを付けます。そのうえで、AI クライアントと各サーバーの間に実行時ガードを置き、ツール定義を固定してラグプルを防ぎ、インジェクションがモデルに届く前に阻止します。
これらすべてを、こちらの言葉だけで信じる必要はありません。 ガードは主張するのは簡単でも、検証するのは困難です。そこで、評価基準を公開しています。mcp-guardbench は特定のガードに依存しないベンチマークです。バージョン管理された攻撃ケースと無害なケース、オープンスキーマ、さらに独自の公開 CLI を通じて あらゆる MCP ガードを評価するランナーを備えています。mcpm も他と同じ方法で評価されます。mcpm guard inspect をシェルから呼び出して評価し、自身のエンジンをインポートすることはありません。
コーパスは、もはや mcpm 独自のテスト用フィクスチャではありません。コーパス v5(57 ケース:攻撃 33、無害 20、警告して転送 4)には、サードパーティ製 MCP サーバーで実際に公開された CVE をもとに再構築した 7 ケースに加え、実環境で進行中の MCP サプライチェーン攻撃「Deadbugz」を再現した 3 ケースが含まれています。そのうち 3 つ目は、 @vguillaume8 による外部からの提供です(詳細は下記)。公開されている上位の結果は、@getmcpm/[email protected] が再現率 86.5%/誤検出率 0.0%/適合率 100% というものです。mcpm の各結果はすべて、その正確なバージョンの公開 CLI を通じて測定されています。これは自慢ではなく、基準値です。mcpm が見逃したケースも、成功したケースと同じページで公開されています。下記の Deadbugz 由来 3 ケースもすべて含まれています。
異なる点。 Microsoft APM は最も近い類似ツールです。MCP サーバー(およびスキル/プロンプト/プラグイン)を9つ以上のクライアントにインストールする、npm スタイルのインストーラーとロックファイルを提供します。ただし、同プロジェクトのドキュメントによると、インストール/監査ゲートに対する署名付きアテステーションは生成されません。Sigstore 検証はv0.2まで対象外とされ、ポリシースキーマにはランタイム権限やエージェントのサンドボックス化に関するフィールドがありません。Smithery はArcade.devに買収されました(2026-08-05)が、ローカル CLI ではなく、ホスト型実行環境を提供します。McpVanguard や MCP Firewall などの OSS ランタイムプロキシは、ポリシーを実行時に検査して適用します。MCP Firewall は封じ込め機能も提供しますが、どちらもインストール時の信頼スコアリングや Sigstore で検証されたサプライチェーンチェックには対応していません。(mcp-guardbench には McpVanguard の行がありますが、同プロジェクトの README では、その行は mcpm の行と比較できず、直接対決の結果として引用すべきではないと説明されています。McpVanguard の実際のプロキシ構成ではなく、オフラインハーネスの1層を動作させ、コーパスのおよそ半分で判定を保留するためです。)mcpm は、信頼スコア、オフラインでの Sigstore 来歴検証、ピン留め/ドリフト検出機能と OS による隔離を備えたランタイムリレーを、ローカルでアカウント不要の1つのツールに統合しています。
クイックスタート
普段お使いのパッケージマネージャーでインストールできます。
| 方法 | コマンド |
|---|---|
| npm(グローバル) | npm install -g @getmcpm/cli |
| npx(インストール不要) | npx @getmcpm/cli <command> |
| pnpm | pnpm add -g @getmcpm/cli |
| mise | mise use -g npm:@getmcpm/cli |
Node ^22.22.2 || ^24.15.0 || >=26.0.0 が必要です — これは、すべてのランタイム依存関係がそれぞれサポートする範囲の重なりである 22.22.2以上、24.15.0以上、または26以上を意味します。それ以外はすべて対象外で、23.x と25.xも含まれます。npm は EBADENGINE の警告を出し、--engine-strict を指定すると即座に失敗します。pnpm は警告なしでインストールし、engine-strict=true を設定しない限り終了コード0を返すため、サポート対象外の Node はインストールエラーではなくランタイムエラーとして表面化します。
バイナリ名は mcpm です。ご注意ください: Homebrew の mcpm formula は、これとは別の無関係なプロジェクト(mcpm.sh)です。こちらの mcpm は、上記の npm/npx/pnpm/mise からインストールしてください(いずれもスコープ付きの @getmcpm/cli パッケージを参照するため、名前が衝突することはありません)。専用の Homebrew tap は後回しにしています。詳しくは docs/DISTRIBUTION.md をご覧ください。
mcpm search filesystem
mcpm info io.github.domdomegg/filesystem-mcp
mcpm install io.github.domdomegg/filesystem-mcp
機能
MCP レジストリを検索
公式 MCP Registry を検索し、信頼性の指標とともに結果を確認できます。
$ mcpm search filesystem
Name Description Version Transport Status
io.github.domdomegg/filesystem-mcp File system access via MCP 1.4.0 stdio active
io.github.Digital-Defiance/mcp-filesystem Read-only filesystem server 0.9.2 stdio active
...
検索で表示されるのはレジストリのライフサイクル状態であり、信頼スコアではありません。これは素早く見つけるための一覧で、結果ごとにスキャナーを実行することはありません。算出された信頼度は mcpm why、info、install、audit で確認できます。
信頼性を評価してインストール
すべてのインストールで、設定を書き込む前にメタデータに基づく信頼性評価を実行します。
$ mcpm install io.github.domdomegg/filesystem-mcp
███████████████░░░░░ 57/80 CAUTION
├─ Health check: not yet run
├─ Tool descriptions: score 32/40
├─ Package: publisher verification passed
└─ External scan: not available (set MCPM_EXTERNAL_SCANNER for deeper analysis)
Install to Claude Desktop? (Y/n)
インストール済みサーバーを監査する
インストール済みのものをすべてスキャンし、信頼レポートを取得します。
$ mcpm audit
┌─────────────────────────────────────────────┬─────────────────────────┬─────────────────┬──────────┐
│ Server │ Score │ Level │ Findings │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ servers-filesystem │ ████████░░ 62/80 │ clean · not run │ 0 │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ servers-github │ ████████░░ 60/80 │ caution │ 1 │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ servers-fetch │ ███████░░░ 52/80 │ caution │ 2 │
├─────────────────────────────────────────────┼─────────────────────────┼─────────────────┼──────────┤
│ some-sketchy-server │ ██░░░░░░░░ 16/80 │ risky │ 5 │
└─────────────────────────────────────────────┴─────────────────────────┴─────────────────┴──────────┘
4 servers scanned, 0 safe, 1 clean · not run, 2 caution, 1 risky
audit はサーバーを実行しないため、30ポイントのヘルスチェック枠は一律で15点となり、62/80が上限です。この場合、どのサーバーも safe と評価されることはありません。実際に実行されたすべてのチェックに合格したサーバーは、代わりに clean · not run と表示されます。servers-github は60点です。npx -y ランチャーによって low のインストールスクリプトに関する検出事項が1件あるためです。このため、表示は clean · not run ではなく caution になります。このラベルが付くのは、スキャンで高得点だった場合ではなく、何も検出されなかった場合に限られます。
audit は、why、install、up、lock が適用する リリース経過時間のクールダウンに関する検出事項も適用しません(src/scanner/cooldown.ts はインストールゲートのシグナルです。install --min-release-age / policy.minReleaseAgeHours を有効にするためのものであり、すでにインストール済みのサーバーが新しいことを理由に再び減点する判断を audit は行いません)。リリースから24時間未満の場合、これは medium となるため、同じサーバーを同じ時点で確認しても、mcpm audit は mcpm why より 5点高い場合があります。どちらの数値も間違いではなく、それぞれ異なる問いに答えています。
IDE をまたいだサポート
すべての AI クライアントに使える1つのツールです。mcpm は各クライアントに適した設定形式を読み書きします。
$ mcpm list
Client Server Name Status Command/URL
Claude Desktop servers-filesystem active npx -y servers-filesystem
Claude Desktop servers-github active npx -y servers-github
Cursor servers-fetch disabled npx -y servers-fetch
Doctor:MCP のセットアップ状態を確認する
設定ミス、不足しているランタイム、壊れたサーバー、クライアント設定に貼り付けられた平文のシークレットを検出します。
$ mcpm doctor
mcpm doctor
✓ Claude Desktop — config found, 3 servers
✗ Claude Code — config not found
✓ Cursor — config found, 1 server
✗ VS Code — config not found
✗ Windsurf — config not found
✗ Gemini CLI — config not found
Runtimes:
✓ npx available
✓ uvx available
✓ docker available
Cross-client (advisory):
⚠ servers-filesystem — in claude-desktop; missing in cursor
⚠ servers-github — in claude-desktop; missing in cursor
Run `mcpm sync --check` for the full matrix (advisory, not a failure).
Plaintext secrets (advisory):
⚠ claude-desktop · servers-github · env 'GITHUB_TOKEN' — GitHub token
Move env secrets to the encrypted store: `mcpm secrets set <server> <KEY>` or re-install with `--secrets keychain`.
No critical issues found.
平文シークレットのスキャンで報告されるのはキー名とラベルだけで、値は決して表示されません。また、すでに mcpm:keychain: プレースホルダーとして保存されている値はスキップされます。これは助言を目的とするものであり、doctor が失敗することはありません。
スタックファイル:MCP 用の docker-compose
プロジェクトの MCP サーバーを mcpm.yaml で宣言し、信頼スナップショットでバージョンをロックすれば、すべてのチームメンバーが1つのコマンドで同じセットアップを再現できます。
mcpm export > mcpm.yaml # dump current setup
mcpm lock # resolve versions + trust snapshot
mcpm up # install everything from mcpm.yaml
mcpm diff # compare installed vs declared state
スタックファイルには信頼ポリシーが含まれます。サーバーの信頼スコアがしきい値を下回ると、mcpm up はそのサーバーをブロックします。
ロックには、MCP の公開バージョンと実際のパッケージバージョンが別々に記録されます。up はクライアント設定を書き込む前にロックされたパッケージの組み合わせを検証し、その後、その npm/PyPI バージョンまたは明示的に指定された OCI タグ/ダイジェストを起動します。パッケージバージョンの証拠がない古いロックには、再度 mcpm lock を実行する必要があります。OCI タグは引き続き変更可能で、整合性チェックではレジストリの記録を比較します。mcpm は起動時にパッケージマネージャーがダウンロードするバイト列を傍受しません。
version: "1"
policy:
minTrustScore: 60
blockOnScoreDrop: true
servers:
io.github.domdomegg/filesystem-mcp:
version: "^1.0.0"
io.github.modelcontextprotocol/servers-github:
version: "1.2.3"
env:
GITHUB_TOKEN: { required: true, secret: true }
スタックファイルを作成する
1つのコマンドで、新しいプロジェクトの MCP セットアップを開始できます。mcpm init はひな形の mcpm.yaml を作成します。ここに mcpm search で見つけたサーバーを追加してください。
$ mcpm init
Created mcpm.yaml.
Next steps:
mcpm search <query> find MCP servers in the registry
edit mcpm.yaml add them under `servers:`
mcpm lock resolve and lock versions
mcpm up install from the stack file
既存の mcpm.yaml を上書きすることはありません(上書きするには --force を指定します)。mcpm は厳選したパックを意図的に同梱していません。特定のコミュニティサーバーを推奨することは信頼に関わる判断であり、セキュリティツールがあらかじめ組み込むべきではないためです。
信頼スコア
信頼スコアは、公開されているメタデータに基づく0~100の評価です。ソースコードの監査ではありません。
チェック項目:
| コンポーネント | ポイント | 測定内容 |
|---|---|---|
| ヘルスチェック | 0~30 | サーバーを起動して list_tools に応答できるか |
| 静的スキャン | 0~40 | ハードコードされたシークレット、ツールの説明に含まれるプロンプトインジェクションのパターン、パッケージ名のタイポスクワッティング、不審な引数スキーマを正規表現で検出 |
| 外部スキャナー | 0~20 | インストール済みのサードパーティ製スキャナーの結果。MCPM_EXTERNAL_SCANNER で有効化するオプトイン機能(デフォルトでは無効) |
| レジストリのメタデータ | 0~10 | 検証済みの発行者、公開日、ダウンロード数(重大な検出事項がある場合は0点に制限) |
レベルは絶対的な点数ではなく、獲得可能な点数に対する割合です。maxPossible の80%以上が safe、50~79%が caution、50%未満が risky です。外部スキャナーがない場合(maxPossible は80)、safe の基準は80点ではなく64点になります。
mcpm audit が clean · not run と表示するのは、サーバーの実行されたチェックがすべてクリアされ、測定されていない唯一のコンポーネントがヘルスチェックである場合です。audit はサーバーを実行しないため、この項目は一律 15/30 となり、そうでなければ非の打ちどころのないサーバーもすべて caution になってしまいます。これは mcpm が行ったこと(何も見つけず、何も実行しなかった)を示すものであり、ヘルスチェックが実際に実行されたサーバーにのみ与えられる safe より、意図的に弱い判定です。
外部スキャナーがない場合、最大スコアは 80/100 となり、この項目は失敗として数えられるのではなく、合計から除外されます。静的スキャンでは一般的なパターンを検出しますが、すべての脆弱性を検出できるわけではありません。このスコアは保証ではなく、目安として扱ってください。
外部スキャンはオプトインであり、mcpm がスキャナーをダウンロードすることはありません。 すでにインストール済みのスキャナーのパスまたは名前を MCPM_EXTERNAL_SCANNER に設定してください。mcpm は <scanner> --version で動作を確認し、終了コードが 0 の場合は、各サーバーを <scanner> --json <server-name> でスキャンして、標準出力に {"findings": [...]} が出力されることを期待します。出力を読み取れないスキャナーは、クリーンな結果ではなく未設定として扱われます。そのため、この項目は合計から除外され、ひそかに 20/20 を獲得することはありません。そうでなければ、終了コードが 0 のバイナリなら何でも信頼スコアを引き上げてしまうためです。
パッケージランナー(npx、uvx、pipx、docker、シェルなど)は、シンボリックリンク経由やランナーの -cli.js エントリーポイント経由も含めて拒否されます。これがどの程度の対策なのかは、明確に認識しておいてください。これは危険な誤操作を防ぐためのガードであり、セキュリティ境界ではありません。この変数を設定できる人なら、通常は PATH を設定したり、ファイルを配置したりすることもできます。この対策によって防げるのは、貼り付けられた npx … の手順や、将来 mcpm のデフォルトが再びそちらに傾くことによって、取り除くために再構築したこの部分に、ダウンロードして実行する脆弱性がひそかに再び持ち込まれることです。
ここではスキャナーを推奨していません。これまで評価したものの中に、要件に合うものがないためです。snyk/agent-scan(Invariant Labs の mcp-scan を引き継いだ、現在も活発にメンテナンスされている後継ツール)は、単独のレジストリ座標を入力として受け取りますが、その座標を npx/uvx/docker run の呼び出しに変換し、サーバーを起動してライブで検査します。これは、インストールに踏み切る前に実行される mcpm の 2 つの呼び出し箇所(install、lock)における、インストール後に検証するという設計と相反します。また、Snyk アカウントと SNYK_TOKEN が必要で、オフラインモードもありません。評価の全容については、src/scanner/tier2.ts のヘッダーコメントをご覧ください。
この 20 ポイントはスコアに反映されますが、安全性の最低基準をクリアすることはできません。 MCP サーバーのインターフェース(mcpm_install、mcpm_up、mcpm_setup)では、呼び出し元が指定した値で引き下げることのできない、25 という信頼スコアのハード下限が適用されます。また、MCPM_EXTERNAL_SCANNER には任意の実行ファイルを指定できるため、{"findings": []} を出力する 2 行のスクリプトも、呼び出し元が指定した入力にすぎません。そのため、この下限との比較には mcpm 独自の証拠のみが使われます。つまり、ヘルスチェック、静的スキャン、レジストリメタデータの合計 80 点です。この除外は一方向です。スキャナーが重大な検出結果を報告した場合、レジストリメタデータの上限を通じてサーバーの評価は下がりますが、この下限を通じて評価が上がることはありません。独自の --min-trust しきい値、スタックファイルの policy.minTrustScore、mcpm audit --fix には影響しません。これらの場合は、しきい値とスキャナーの両方を同じ人が選ぶためです。また、audit --fix はサーバーを拒否するのではなく削除する唯一のスコアゲートです。したがって、そこでこの項目を差し引くと、削除されるサーバーは減るのではなく増えます。
コマンド
| コマンド | 説明 |
|---|---|
mcpm search <query> | MCP レジストリでサーバーを検索します |
mcpm install <name> | MCP レジストリから MCP サーバーをインストールします |
mcpm info <name> | MCP サーバーの詳細をすべて表示します |
mcpm list | 検出された AI クライアント全体で、インストール済みの MCP サーバーを一覧表示します |
mcpm remove <name> | クライアントの設定から MCP サーバーを削除します |
mcpm audit | インストール済みの全サーバーをスキャンし、信頼レポートを生成します(--json、GitHub のコードスキャン用に --sarif) |
mcpm update | 新しいバージョンを確認し、インストール済みのサーバーを更新します |
mcpm outdated | インストール済みのサーバーのバージョン差異を表示します(現在のセキュリティ上の検出結果を確認するには mcpm audit を使用してください) |
mcpm secrets | MCP サーバーの認証情報を管理します(保存時は AES-GCM で暗号化され、キーは OS のキーチェーン(macOS Keychain/libsecret/Windows DPAPI)に保存されるため、コピーされたストアを別のマシンで復号することはできません。キーチェーンを利用できない場合は、マシン固有のキーにフォールバックします)。mcpm secrets migrate は古いエントリーをアップグレードします |
mcpm publish scaffold | 対話形式で .mcpm-publish.yaml マニフェストを作成します |
mcpm publish check | ドライランを実行し、信頼スコアと送信される内容を表示します(--json は正確なリクエスト本文を出力します) |
mcpm publish | 公式 MCP レジストリに送信します(GITHUB_TOKEN/MCPM_TOKEN、または GitHub Actions で id-token: write を指定した --github-oidc が必要です) |
mcpm doctor | MCP セットアップの健全性を確認し、問題を報告します(--json は構造化モデル、--report はバグ報告に貼り付けられるよう機密情報を除去したスナップショットを出力します) |
mcpm init | 現在のディレクトリに、スターター用の mcpm.yaml スタックファイルを作成します |
mcpm disable <name> | 設定から削除せずに MCP サーバーを無効化します |
mcpm enable <name> | 以前に無効化した MCP サーバーを再び有効にします |
mcpm import | クライアント設定ファイルから既存の MCP サーバーをインポートします |
mcpm alias | 長い MCP サーバー名の短いエイリアスを作成します |
mcpm export | インストール済みのサーバーを mcpm.yaml スタックファイルとしてエクスポートします |
mcpm lock | バージョンを解決し、信頼スナップショット付きの mcpm-lock.yaml を作成します(npm の来歴情報も含み、差異がある場合は WARN を出力します) |
mcpm up | 信頼性を検証しながら、mcpm.yaml の全サーバーをインストールします |
mcpm verify | リポジトリ専用の CI ゲートです。ロックファイルの整合性を検証し、Sigstore の来歴情報を npm の公開記録と照合して再検証します(--json) |
mcpm diff | インストール済みのサーバーを mcpm.yaml およびロックファイルと比較します |
mcpm sync | 検出されたすべてのクライアント間で設定の差異を表示します(--check は終了コード 2 で CI のゲートになり、--json にも対応します) |
mcpm completions <shell> | シェル補完スクリプトを生成します(bash、zsh、fish) |
mcpm why <name> | サーバーの信頼スコアの内訳を説明します(すべての構成要素を表示します) |
mcpm serve | mcpm を MCP サーバーとして起動します(stdio トランスポート) |
mcpm guard enable | 検出されたクライアント設定を検査リレーでラップします |
mcpm guard disable | クライアント設定を元の状態に戻します |
mcpm guard status | ラップされている対象と、サーバーごとのピン留め状態を表示します |
mcpm guard demo | 合成プロンプトインジェクションのシナリオを実行します(ブロックを表示) |
mcpm guard accept-drift <server> | 正当なアップグレード後に、ツールのスキーマを再度ピン留めします |
mcpm guard mute <signature-id> | オプションの --for <duration> を指定して、シグネチャを無効にします |
mcpm guard unmute <signature-id> | ミュートしたシグネチャを再び有効にします |
mcpm guard pause | すべての guard 検査を一時停止します(デバッグ時の緊急手段) |
mcpm guard cleanup | アンインストール済みサーバーのピン留めエントリーを整理します |
mcpm guard inspect [file] | MCP JSON-RPC フレームに対して、オフラインでシグネチャカタログを実行します。リレーもサーバーも必要ありません |
mcpm guard list-signatures | 同梱されている OWASP MCP Top 10 シグネチャカタログを表示します |
mcpm guard doctor-confine | サンドボックスバックエンドの利用可否と、隔離対象に登録されているサーバーを報告します(--json) |
mcpm guard reset-integrity | pins.json または guard-policy.yaml の整合性サイドカーを再生成します |
オプションやフラグについては、mcpm <command> --help を実行してください。
CI:ロックファイルを検証する
mcpm verify はリポジトリ専用のクライアント不要なゲートです。コミット済みの
mcpm-lock.yaml を npm の公開済み dist.integrity レコードと照合し、整合性の差異、検証不能なレコード、形式の不一致、またはベースラインが不審に欠落している場合に、ゼロ以外の終了コードを返します。AI クライアントをインストールする必要がないため、ホスト型 CI ランナーで実行できます(mcpm up は実行できません)。
また、ロックファイルが mcpm.yaml の宣言内容を網羅しているかも確認します。他のゲートはロックファイルのみを読み取るため、サーバーが欠落しているロックファイルでも通過します。網羅性チェックにより、要求した内容より少ない状態で、切り詰められたロックファイルが検証に合格するのを防ぎます。サーバーがまったく含まれていないロックファイルは、隣接する mcpm.yaml で宣言がないことを確認できない限り、合格しません。同様に、mcpm lock はすべて成功するか、すべて失敗するかのいずれかです。いずれかのサーバーの解決に失敗すると、すべての失敗を報告して何も書き込まず、以前のロックファイルをそのまま残します。
さらに、ロックファイルに暗号学的に verified なベースラインが記録されたすべての npm サーバーについて、Sigstore のプロベナンスを再検証します。npm の現在のレコードに対してオフラインの暗号検証を再実行し、アテステーションに後退があればフェイルクローズします。具体的には、署名者の ID が変更された場合、検証に合格しなくなった場合、または再検証できない場合です。これは証拠に基づくチェックなので、verified なベースラインがない(一般的なケース)ロックファイルには影響しません。mcpm up --frozen はインストール前に同じ整合性とプロベナンスの凍結チェックを実行します。
mcpm lock は各 npm サーバーの公開済みプロベナンス ID(ソースリポジトリと、ビルド元となった不変の GitHub リポジトリ/オーナー ID)も記録し、バージョン間で変化した場合に警告します。これは、リポジトリ/オーナーの変更や、署名付きから署名なしへの移行といった、乗っ取られた公開(Postmark)攻撃の兆候です。
mcpm lock と mcpm why は、プロベナンスをさらにオフラインで暗号学的に検証します。アテステーションの Sigstore バンドルを同梱の信頼ルートと照合し(検証時のネットワーク接続は不要)、アテステーション対象のダイジェストをパッケージの dist.integrity に紐付けるため、別の tarball に対する有効なアテステーションは合格しません。検証に成功すると、レコードは verified になります。それ以外は、未検証のレジストリレコードである attested、または中立的な unsigned になります。これはレポートのみを目的とし、その適用範囲を正確に示します。verified は、ビルド ID が CI の OIDC トークンによって暗号学的にアテストされていることを意味します。コードが安全であることを意味するものではありません(同じリポジトリの CI が侵害されれば、有効なアテステーションを発行できます)。
# .github/workflows/mcpm.yml
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: getmcpm/cli/.github/actions/[email protected] # or: run: npx @getmcpm/cli verify
この Action は --json からジョブのステップサマリーを書き出します。同じ動詞はコミット前フックとしても使用できます。.github/actions/mcpm-verify を参照してください。
コードスキャン: mcpm audit --sarif は、SARIF 2.1.0 レポート(検出タイプごとに 1 つのルールを定義し、各検出を mcpm.yaml のファイルレベルに紐付け)を出力します。GitHub はこれをコードスキャンアラートとして取り込みます。
- run: npx @getmcpm/cli audit --sarif > mcpm.sarif
continue-on-error: true # audit exits 1 when a server is risky
- uses: github/codeql-action/upload-sarif@v3
if: always() # upload even if the audit flagged a risk
with:
sarif_file: mcpm.sarif
mcpm audit は、サーバーにリスクがある場合は 1、呼び出し自体を実行できない場合は 2 を返します。後者には、実現不可能な --min-trust や、mcpm が拒否するフラグの組み合わせ(--sarif はレポート専用のため、--fix と併用できません)が該当します。ゼロ以外の終了コードをすべて「サーバーにリスクがある」と扱うスクリプトでは、後者を誤って解釈します。
正直さの境界:失敗は、npm の公開済みレコードがロックファイルと異なっていたことを意味します。mcpm が悪意のあるバイト列を検出したことを意味するものではありません。npx/uvx はサーバー起動時にアーティファクトを独自に取得します。
ランタイム防御(mcpm-guard)
v0.47.0 のガード互換性アップデートでは、最新の MCP ディスカバリーと、埋め込み型のサンプリング/エリシテーションリクエストを検査します。未知の埋め込みリクエスト形式が見つかった場合は、カバレッジ警告を出します。正確な stdio の境界と残るギャップについては、プロトコルカバレッジマトリクスを参照してください。
v0.47.1 では、固定された公開済み v0.47.0 ベースラインと公式 SDK v1/v2 ピアを対象にした、再現可能なサンドボックス互換性ハーネスを追加しました。名前付き stdio マトリクスは Linux/arm64 と Linux/amd64 で合格しますが、このマトリクスではインストール済みのネイティブクライアントやプロトコルへの完全な準拠は検証しません。ランタイムの動作に変更はありません。
v0.47.2 では、使い捨ての macOS VM 内で固定された VS Code と Claude Code のビルドを対象にした、リポジトリのネイティブクライアントスモークテストスイートを追加しました。公開済みの mcpm ベースラインは引き続き 0.47.1 です。このスイートでは、実際のグローバル設定と合成入力による MCP 呼び出しを検証します。ライブモデル、対話型チャット、その他のクライアント/プラットフォームの組み合わせについては、別途テストが必要です。
v0.47.4 では、依存関係のロックファイルと固定されたビルド/セキュリティ Actions を更新し、9 件すべてのセキュリティオーバーライドを維持しています。アプリケーションのソースと互換性に関する主張に変更はありません。ネイティブ/リファレンステストのベースラインも引き続き明示的に固定されています。
v0.47.3 では、VS Code のユーザーグローバル JSONC 設定の編集を修正し、MCP のライフサイクルを通じて無関係なコメントや設定、および未加工のバックアップが保持されるようにしました。また、ネイティブ環境での承認/拒否を検証するテストも個別に追加しました。固定された VS Code と Claude Code のビルドで、それぞれ合成モデル応答を使用した 4 件ずつのケースを実行します。ネイティブの macOS ダイアログ、ワークスペース/サーバーの信頼、インラインチャット/Agent Host、ライブプロバイダーは未検証です。
インストール時の信頼スコアリングにより、悪意のあるサーバーのほとんどは配布前に検出できます。しかし、ラグプル、つまり承認後にツール定義を変更するサーバーはどうでしょうか? また、ツール応答に埋め込まれたプロンプトインジェクションはどうでしょうか? エージェントが信頼済み MCP サーバーを通じて読み取る Slack メッセージ、ウェブページ、カレンダーの招待状に、敵対的なテキストが埋め込まれている場合です。
mcpm guard はランタイム検査レイヤーを追加します。インストール済みの各 MCP サーバーを stdio リレーでラップし、ツールの説明/応答/引数を OWASP MCP Top 10 の攻撃パターンと照合します。また、インストール時に各ツールのスキーマを固定し、実際の応答がその固定内容から逸脱した場合には呼び出しをブロックします(ラグプル防御)。
すべてのツール呼び出しで行われること
ガードは AI クライアントと各 MCP サーバー間の stdio チャネルにインラインで配置されるため、すべてのツール呼び出しの両方の側を確認し、通過する際に検査します。
- エージェントが送信するリクエスト — ツール名と引数を検査し、機密パスの持ち出しや、呼び出しパラメーターに紛れ込ませたインジェクションがないか確認します。
- サーバーが返す応答 — ツールの出力(エージェントがこれから読み取ろうとしている Slack メッセージ、ウェブページ、カレンダーの招待状)に隠された命令インジェクションがないか確認します。
- ツール自体の定義 —
tools/listの説明、スキーマ、アノテーションを検査し、承認時に固定されたスキーマと照合します。これにより、サーバーがすでに信頼されているツールを密かに書き換えることを防ぎます。
フレームがシグネチャ、逸脱チェック、またはポリシールールに抵触すると、ガードはそのフレームを破棄し、代わりに JSON-RPC エラーをエージェントに返します。エラーにはシグネチャ ID と remediation 文字列が含まれるため、汚染されたコンテンツがモデルに届くことはありません。問題のない呼び出しはそのまま通過します(小さなフレームで p99 約 0.065 ミリ秒)。サーバー起点の sampling/elicitation リクエストも同様に検査され、エラーはエージェントではなくサーバーに返されます。
クイックスタート
npm install -g @getmcpm/cli@latest
mcpm guard enable # wrap detected client configs (Claude Desktop / Claude Code / Cursor / VS Code / Windsurf / Gemini CLI)
# → restart your IDE so it re-spawns the wrapped server processes
mcpm guard demo # synthetic prompt-injection scenario — see a live block in your terminal
mcpm guard status # what's protected, what's still in first-session-pin mode
demo コマンドは、定型のプロンプトインジェクションペイロードを返す、プロセス内の合成悪意サーバーを起動します。リレーがそのペイロードをブロックします。npm install からスクリーンショットに残せるブロックが表示されるまでの合計時間は約 5 分です(その大半は IDE の再起動です)。
検出できるもの
カテゴリーは、src/guard/owasp.ts に記載された OWASP MCP Top 10 (beta) の mcpm ピン ID です。固定された仕様のコミットと各割り当ての根拠については、docs/owasp-mcp-mapping.md を参照してください。「unclassified」は、シグネチャを評価した結果、そのコミット時点ではどのカテゴリーにも明確に当てはまらないことを意味し、未レビューであることを意味するものではありません。
| カテゴリー | 攻撃クラス | アクション |
|---|---|---|
| MCP03 Tool Poisoning | ツールの説明へのインジェクション(ポイズニング) | ブロック |
| MCP03 Tool Poisoning | ツールのアノテーション(タイトルまたはカスタムアノテーションフィールド)に含まれる指示のようなテキスト | ブロック |
| MCP03 Tool Poisoning | インストール後のスキーマ/アノテーションの変更(ラグプル) | ブロック |
| MCP03 Tool Poisoning | 説明のみの変更(軽微なレベル) | 警告 |
| MCP03 Tool Poisoning | ツール応答への指示のインジェクション | ブロック |
| MCP03 Tool Poisoning | ツールの入力スキーマに含まれる、情報流出を示す名前のパラメーター(_system_prompt_、…) | ブロック(リスト取得時) |
| MCP03 Tool Poisoning | ツールのメタデータに含まれる不可視文字(Default_Ignorable_Code_Point)または制御文字 — ゼロ幅文字、双方向制御文字、結合書記素接合子、フィラー、異体字セレクター、Unicode TAG ブロック。ただし、絵文字の直後にある単一の VS15/VS16、キーキャップ、ZWJ 絵文字シーケンス、および RGI の地域細分化フラグ 3 種を除く | 警告 |
| MCP03 Tool Poisoning | U+E0000–U+E007F に隠されたペイロードが、どの搬送データにも存在する(「ASCII スマグリング」) | デコードして再スキャン — 復元されたシグネチャに基づいて判定。存在だけの場合は最低限の警告 |
| MCP03 Tool Poisoning | 1 回の tools/list で、正規化後に見分けがつかない 2 つのツール名を提示 | 警告 |
| MCP03 Tool Poisoning | ツールのメタデータ以外に、2 つ以上連続した異体字セレクターがある(「絵文字スマグリング」。存在のみを検出し、デコードはしない) | 警告 |
| MCP03 Tool Poisoning | ツール名に不可視文字または幅ゼロの文字が含まれる(例外なし)、またはラテン文字と別の文字体系が混在する | 警告 |
| MCP06 Intent Flow Subversion | initialize の指示へのインジェクション(行をまたぐもの) | ブロック |
| MCP06 Intent Flow Subversion | リソース/プロンプトのコンテンツへの指示のインジェクション | 警告(転送) |
| MCP06 Intent Flow Subversion | サーバーがウォレットのシードフレーズ/秘密鍵/カードの CVV/SSN/PIN を要求 | ブロック(サーバー宛て) |
| MCP06 Intent Flow Subversion | サーバー起点の sampling プロンプトへのインジェクション | ブロック(サーバー宛て) |
| MCP05 Command Injection & Execution | 識別子またはパス形式の tools/call 引数に含まれるシェルのメタ文字/コマンド置換構文(CVE-2025-53818、CVE-2026-25546 の形式) | ブロック |
| MCP05 Command Injection & Execution | テーブル名/列名/データベース名形式の引数に含まれるクエリ言語の制御構文(CVE-2026-33980 の形式) | ブロック |
| MCP05 Command Injection & Execution | 名前空間または不透明な識別子形式の引数に埋め込まれた、-- で始まる CLI フラグトークン(CVE-2026-39884 の形式) | ブロック |
| MCP01 Token Mismanagement & Secret Exposure | ツール応答で返される確度の高いシークレット | 警告(ログではシークレットをマスキング) |
| MCP01 Token Mismanagement & Secret Exposure | ツール応答で開示される一般的なベアラートークン | 警告(ログではシークレットをマスキング) |
| MCP02 Privilege Escalation via Scope Creep | initialize ハンドシェイクをまたいで、サーバーが提示するケイパビリティが変更される | 警告(1 回のみ) |
| unclassified | ツール引数内の機密パスからの情報流出 | 警告(ポリシーでブロックに昇格) |
| unclassified | electron.mcp 特権 IPC ブリッジを呼び出すツール応答内の HTML/スクリプト(CVE-2025-68669、CVE-2026-22793 の形式) | 警告 |
検出は正規表現と構造解析で行います。NFKC 正規化に加えて、Unicode のデフォルトで無視されるコードポイントをすべて除去し、空白幅のフィラーをスペースに変換することで、一般的な Unicode による回避を防ぎます。また、別個の隠し文字の存在チェックにより、正規化で消える前に回避に使われる文字を検出します。"ASCII smuggling"――Unicode TAG ブロック(U+E0000-U+E007F)にペイロードを隠す手法です。何も表示されませんが、モデルには読み取れます。除去処理によって完全にエンコードされたペイロードが露呈するのではなく消去されてしまうため、専用の処理を 2 回行います。ガードは TAG の連続部分を ASCII にデコードし、そのキャリア自身のシグネチャで再スキャンするため、隠されたペイロードは内容に基づいて判定されます。たとえば、TAG エンコードされたウォレットシードの要求は、単に不審として記録されるのではなく、認証情報フィッシングのシグネチャによってブロックされます。その下には、隠されているもののどのシグネチャにも一致しないペイロードを検出するための存在チェックの最低基準があります。絵文字の地域旗も同じコードポイントで構成されているため、クライアントが実際に表示する 3 つ(イングランド、スコットランド、ウェールズ)はシーケンス全体を検証して除外します。ほかの正しい地域旗は警告されます。サーバー応答内の Base64/base64url ペイロードもデコードして再スキャンするため、エンコードに隠されたインジェクションや認証情報が正規表現の最低基準をすり抜けることはありません(Base64 デコード後に検出されたものは警告のみで、ハードブロックされません。TAG デコード後に検出されたものは、隠蔽された状態では無害なコンテンツではありえないため、本来の重大度が維持されます)。現在提供されているシグネチャの一覧は mcpm guard list-signatures を参照してください。 |
隔離(オプトインの強制適用)
上記はすべて検出です。リレーは JSON-RPC のバイト列を判定し、警告またはブロックします。しかし、~/.ssh の読み取りや、~/Library/LaunchAgents への永続化フックの書き込みを決めたサーバーは、検査可能なトラフィックを通じてそれを行うとは限りません。mcpm guard enable --confine は、検出を強制適用で補完します。中継される各 stdio サーバーを OS サンドボックスでラップし、秘密ファイルの拒否リストにあるファイルの読み取りと、キャッシュ/スクラッチ領域外への書き込みを物理的に拒否するため、サーバーが送信する JSON-RPC の内容にかかわらず、認証情報の持ち出しや永続化を防げます。mcpm guard doctor-confine はバックエンドの利用可否と、登録されているサーバーを報告します。現時点ではmacOS のみ対応しています(Seatbelt/sandbox-exec)。ほかのプラットフォームでは、誤った安心感を与えないよう、警告を表示して隔離なしで実行します。ティアの詳細と注意事項については docs/GUARD.md を参照してください。
初日から使えるコマンド
mcpm guard enable [--client <name>] [--server <name>] [--dry-run] # wrap detected configs
mcpm guard disable [--client <name>] [--server <name>] # unwrap
mcpm guard status # what's wrapped + pin state
mcpm guard demo # synthetic attack-block demo
mcpm guard list-signatures [--json] # show shipped signatures
mcpm guard inspect frames.ndjson # verdicts for captured traffic, offline
mcpm guard enable --confine # also OS-sandbox wrapped stdio servers (macOS)
mcpm guard doctor-confine [--json] # confine backend availability + enrolled servers
サーバーを介さずにフレームを検査する
mcpm guard inspect は、キャプチャした応答、不審な tools/list、解説記事から取得したペイロードなど、手元にある MCP JSON-RPC フレームに対して、リレーと同じシグネチャカタログを実行します。ラップされたサーバー、リレー、ネットワークは不要です。
# one frame, human-readable
mcpm guard inspect suspicious-response.json
# a capture, machine-readable — one verdict line per input frame, in input order
cat frames.ndjson | mcpm guard inspect --json
終了ステータスを使って、記録済みトラフィックを CI のゲートにできます。0 は問題なし、1 は警告がある場合(またはフレームを解析できない、検査できない場合)、2 はブロック対象がある場合です。
判定結果には、警告のみとなるキャリアクランプを含め、シグネチャカタログのデフォルトのアクションが適用されます。そのため、resources/read の本文にあるインジェクションは、インラインで検査した場合と同じく、ここでも warn と報告されます。ローカルポリシーによる上書き(ミュート、log_only)は意図的に適用されません。これは「シグネチャが何を検出するか」への答えであり、「自分の設定ではどうなるか」への答えではありません。
また、これは mcp-guardbench が mcpm のガードを評価するために使う接点です。エンジンをインポートするのではなく、この公開済みバイナリを通じて評価するため、mcpm はほかのガードとまったく同じ条件で測定されます。mcp-guardbench はリファレンスコンシューマーです。ガードに依存しないコーパスとランナーを使って、あらゆる MCP ガードをこの方法で評価します。
ブロックが発生した場合
リレーは、シグネチャ ID と、実行すべきコマンドを明示する remediation 文字列を含む JSON-RPC エラーレスポンスを IDE に返します。典型的なケースを 2 つ示します。
# False positive on a legitimate signature
mcpm guard mute owasp-mcp-2-instruction-injection-in-response --for 5m
# Schema drift on a legitimate server upgrade
mcpm guard accept-drift slack-mcp --tool send_message --new-hash sha256:abc... --yes
ログを監査する
ブロックまたは警告はすべて ~/.mcpm/guard-events.jsonl に追記されます。jq で確認できます。
# Last hour's blocks
tail -n 1000 ~/.mcpm/guard-events.jsonl | jq 'select(.action == "block")'
# Group by signature id
jq -s 'group_by(.findings[0].signature_id) | map({sig: .[0].findings[0].signature_id, n: length})' \
< ~/.mcpm/guard-events.jsonl
# Top-N most-blocked servers
jq -s 'group_by(.server_name) | map({server: .[0].server_name, n: length}) | sort_by(-.n) | .[:10]' \
< ~/.mcpm/guard-events.jsonl
デバッグ中に一時的に無効にする必要がある場合
mcpm guard pause --for 10m # disables all inspection for 10 minutes
mcpm guard pause --off # cancel an active pause
これが存在する理由
ガードが行う各処理を裏付ける、2026年時点の独立した証拠です。宣伝文句を信じるのではなく、前提を確認できます。
- NSA AI Security Center, "MCP: Security Design Considerations" — アウトバウンドプロキシのフィルタリング、データ損失防止、サンドボックス化、ローカルでの MCP スキャンを推奨しています。これらは、ガードリレー、認証情報の外部送信検出機能、
--confine、mcpm auditに相当する内容が、政府の文書にひとまとめになったものです。 - OX Security, "Mother of All AI Supply Chains"(2026-04-15)— 設定からプロセスを起動する設計に起因する、割り当て済みの重大/高 CVE が10件報告されました。また、概念実証用の侵害されたサーバーが、公開レジストリおよびマーケットプレイス11件のうち9件で受け入れられました。レジストリに掲載されていることは、安全性の指標にはなりません。
- Microsoftのツールポイズニングに関する警告(2026-06-30、こちらで報道されています)— 侵害されたツールの説明は、システムプロンプトを書き換えるのとほぼ同じほど効果的にエージェントを誘導します。推奨される対策は、コードレビューと同様の方法で説明の変更を差分確認することです。スキーマのピン留めとドリフト検出は、検出の半分を担います。mcpm は、承認後に説明が変更されたことを通知し、スキーマまたはアノテーションのドリフトがある場合はブロックします。ただし、テキストの変更前後の差分は表示しません。
- SmartLoader(2026年2月に開示)— 偽の GitHub アカウントで作られたソーシャルプルーフを背景に、正規のレジストリに仕込まれたトロイの木馬化 Oura Ring MCP サーバーが、インフォスティーラーを配布しました。スター数や掲載情報は偽造できるため、
mcpm lock、why、verifyは代わりにビルドの来歴を確認します(信頼スコアには組み込まず、報告してゲートで制御します)。限界についても正直に記しておきます。来歴が証明するのは「誰がパッケージをビルドしたか」であり、コードが安全かどうかではありません。攻撃者が自分の CI からトロイの木馬化したパッケージを公開すれば、正当な来歴が付きます。これは他人になりすますコストを高めますが、それだけで SmartLoader を阻止できたわけではありません。 - Deadbugz(Pillar Security、2026-08-12に開示)— 活動中の MCP サプライチェーン攻撃キャンペーンです。単一の GitHub アカウントから、無関係な AI/MCP/開発ツールのプロジェクトに23件のプルリクエストを送り、最初の3回のツール呼び出しでは無害なまま、その後
tools/listとprompts/getの応答を切り替えて SSH キー、AWS 認証情報、シェル履歴、Kubernetes 設定を要求するサーバーを配布しました。実際のセッションでは、mcpm のセッションベースのスキーマドリフトチェックがtools/listの切り替えをブロックします(ディスク上のピン留め情報だけでなく、セッション内で最初に検出した定義と比較します)。しかし、mcp-guardbenchに掲載された、文脈を含まない単一フレームの再現3件――実際の mongodb-mcp-server のツール面に対する、外部提供の3件目のバリアントを含みます――は、@getmcpm/[email protected]で検出できなかった事例です(表現が現在の正規表現シグネチャに一致しません)。また、mcpm 自身のテストでは、このキャンペーンが同様に悪用するprompts/getチャネルにはドリフト保護がまったくないことが記録されています(src/guard/__tests__/deadbugz.test.ts)。 - Grafana MCP, CVE-2026-19516(Pillar Security、2026-09-02、Grafana のアドバイザリ、CVSS 9.1、v1.1.0で修正)— v1.1.0より前の
mcp-grafanaにあったセッション偽装と SSRF の脆弱性により、認証されていない呼び出し元が想定形式のセッションを偽造し、サーバー自身の Grafana 認証情報で操作できました。その後、呼び出し元が指定したX-Grafana-URLリクエストヘッダーを使って、サーバーのgrafana_api_requestツールを内部サービスやクラウドメタデータサービスに向けることができました。CVE 番号が対象とするのは SSRF の部分です。認証の欠落は同じ調査で見つかった付随的な問題で、それを修正するために v1.1.0で追加されたベアラートークン認証は任意です。正直な限界として、これはリモート HTTP/SSE サーバーの問題であり、mcpm のガードリレーは stdio 専用です。HTTP/SSE トランスポートを対象とせず、フェイルクローズ(ラップを拒否)します。 - Context7, CVE-2026-75130(2026-08-18に公開。割り当て機関のスコアは CVSS 4.0で6.4の中程度、CVSS 3.1で9.0の重大)— Upstash の広く使われているドキュメントサーバー(GitHub スター約5万、npm ダウンロード数800万以上)におけるプロンプトインジェクションの脆弱性です。Custom AI Instructions 機能により、通常のライブラリドキュメントのリクエスト時に、サニタイズされていないテキストを接続されたコーディングエージェントのコンテキストに注入でき、認証情報の窃取やファイルの破壊的な削除が可能でした。すでに修正済みです。報告者の記事には、2026-02-18の非公開開示と、CVE 公開の数か月前となる2026-02-23に Context7 の本番サービスへ修正がデプロイされたことが記録されています。ここで注目すべきなのは、修正されたのがサービスによる指示の提供方法だった点です。そのため、インストール済みパッケージのバージョンを固定しても、ロックファイルの項目を変更しても、この問題は解決しませんでした。
- 公式レジストリ自身のモデレーションポリシー — 利用者は「モデレーションはほとんど、あるいはまったくない」と想定すべきであり、セキュリティスキャンはパッケージレジストリと下流のサブレジストリに明示的に委ねられています。mcpm は、そうした下流レイヤーの1つです。
詳細を読む
docs/GUARD.md— コマンドの完全なリファレンスdocs/SIGNATURES.md— シグネチャのカタログと、新しいシグネチャの追加方法docs/POLICY.md—~/.mcpm/guard-policy.yamlのリファレンスdocs/owasp-mcp-mapping.md— すべての mcpm の仕組みを OWASP MCP Top 10(ベータ)のカテゴリに対応付け、対象外の項目も率直に列挙していますdocs/VISION.md— プロジェクトの今後の方向性(基本方針、展望、理念)
エージェントモード
mcpm は MCP サーバーとしても実行でき、AI エージェントが MCP サーバーをプログラムから検索、インストール、監査できます。
{
"mcpServers": {
"mcpm": {
"command": "npx",
"args": ["-y", "@getmcpm/cli", "serve"]
}
}
}
以下の 9 つのツールを公開します:mcpm_search、mcpm_install、mcpm_info、mcpm_list、mcpm_remove、mcpm_audit、mcpm_doctor、mcpm_setup、mcpm_up。
v0.46.0 の変更点: search/info は、既存の JSON テキストに加えて、バージョン管理された構造化エビデンスを公開します。これには、ライフサイクルのステータス、検出結果、スコアの分母/上限、実行済みまたは未実行のチェックが含まれます。スコアは安全である確率を示すものではなく、未実行のチェックは合格を意味しません。verify --json は、既存のバージョン管理されたカバレッジと失敗モデルを維持します。安定性の契約とエージェントのワークフローを参照してください。
mcpm_setup ツールは、「filesystem and GitHub」のような自然言語の説明を受け取り、検索、信頼性評価、インストールをすべて実行します。1 回のツール呼び出しで、動作する MCP ツールチェーンを構成できます。
お試しください -- 上記の設定を MCP クライアントに追加して再起動し、エージェントに次のように依頼してください:
mcpm を使って、ファイルシステムへのアクセスと GitHub 用の MCP サーバーを探してください。検出結果、ライフサイクルのステータス、未実行のチェックについて説明してください。インストール前に、提案される設定変更を表示してください。
リポジトリには、ポータブルなmcpm 使用スキルが含まれています。 レビュー済みでピン留めされたリポジトリのチェックアウトから、クライアントのスキル ディレクトリにインストールしてください。これは npm パッケージには含まれていません。スクリプト、フック、 権限の付与、モデルのサブスクリプション、外部の判断サービスはありません。
対応クライアント
| クライアント | 設定パス(macOS) |
|---|---|
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Code | ~/.claude.json(ユーザー共通の mcpServers) |
| Cursor | ~/.cursor/mcp.json |
| VS Code | ~/Library/Application Support/Code/User/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Gemini CLI | ~/.gemini/settings.json(ユーザー共通の mcpServers) |
VS Code の管理対象 mcp.json は JSONC コメントと末尾のカンマに対応しています。変更時は、
選択したサーバーを編集し、無関係な設定やコメント、および元のバックアップを保持します。
その他のクライアントでは、厳密な JSON 解析が維持されます。変数参照は、
クライアントが解決できるよう保持されます。ポータブル/ワークスペース設定と
Copilot Agent Host の設定パスは、これらのアダプターでは管理されません。ネイティブ検証の対象範囲を参照してください。
Linux と Windows のパスにも対応しています。お使いのシステムで検出されたクライアントを確認するには、mcpm doctor を実行してください。
仕組み
mcpm はローカル優先の CLI です。mcpm のバックエンドやアカウントシステムはありません。
flowchart TD
subgraph user["User / Terminal"]
CLI["mcpm CLI<br/>Commander entry point"]
end
subgraph commands["Commands (src/commands/)"]
SEARCH["search"]
INSTALL["install"]
AUDIT["audit"]
GUARD["guard<br/>enable/disable/status"]
end
subgraph registry["Registry API<br/>(Only Remote)"]
REGAPI["https://registry.<br/>modelcontextprotocol.io<br/>v0.1"]
end
subgraph scanning["Local Scanning & Trust<br/>(src/scanner/)"]
HEALTH["Health Check<br/>(0-30): spawn +<br/>verify response"]
TIER1["Tier 1: Static Patterns<br/>(0-40): secrets, injection,<br/>typosquatting, exfil"]
TIER2["Tier 2: External Scan<br/>(0-20): opt-in via<br/>MCPM_EXTERNAL_SCANNER"]
META["Registry Metadata<br/>(0-10): publisher,<br/>age, downloads"]
SCORE["Trust Score<br/>(max 80; 100 with<br/>external scan)"]
end
subgraph config["Config Management<br/>(src/config/adapters/)"]
DETECT["Detect AI clients<br/>Claude Desktop / Claude Code / Cursor<br/>VS Code / Windsurf / Gemini CLI"]
ATOMIC["Atomic writes<br/>0o600 + symlink-safe<br/>.tmp/.bak"]
end
subgraph guard_runtime["Guard Runtime<br/>(src/guard/)"]
WRAP["Config entry wrap<br/>via run --inner"]
RELAY["Stdio MITM Relay<br/>per-server"]
PATTERNS["Pattern Engine<br/>OWASP MCP Top 10"]
PINS["Schema Pins<br/>+ Drift Detection"]
FAILCLOSED["Fail-closed on<br/>pins.json error"]
EVENTS["Event Log<br/>guard-events.jsonl"]
end
subgraph local_state["Local State<br/>(~/.mcpm/)"]
SERVERS["servers.json"]
ALIASES["aliases.json"]
SECRETS["secrets.enc.json"]
PINS_STORE["pins.json"]
POLICY["guard-policy.yaml"]
end
subgraph clients["Native AI Clients"]
CD["Claude Desktop"]
CC["Claude Code"]
CURSOR["Cursor"]
VSCODE["VS Code"]
WINDSURF["Windsurf"]
GEMINI["Gemini CLI"]
end
CLI --> commands
commands -->|searchServers| REGAPI
commands -->|scan| HEALTH
commands -->|scan| TIER1
commands -->|if available| TIER2
commands -->|registry meta| META
HEALTH --> SCORE
TIER1 --> SCORE
TIER2 --> SCORE
META --> SCORE
commands -->|detect| DETECT
commands -->|merge & write| ATOMIC
DETECT -->|config paths| clients
ATOMIC -->|config| clients
GUARD -->|wrap| WRAP
WRAP -->|modifies config<br/>to invoke| clients
WRAP -->|setup| RELAY
RELAY -->|parse frames<br/>inspect msg| PATTERNS
PATTERNS -->|check pins| PINS
PINS -->|read| PINS_STORE
PATTERNS -->|read policy| POLICY
PINS -->|fail-closed| FAILCLOSED
RELAY -->|record| EVENTS
commands -->|store| SERVERS
commands -->|aliases| ALIASES
commands -->|secrets| SECRETS
- 検索とインストールでは、Model Context Protocol プロジェクトが管理する公式 MCP Registry API(v0.1)を照会します。
- 信頼性評価は、組み込みスキャナー(正規表現ベースのパターン検出)を使ってローカルで実行されます。また、
MCPM_EXTERNAL_SCANNERで指定した、インストール済みのサードパーティ製スキャナーをシェルから呼び出すこともできます。 - 設定管理では、各 AI クライアントのネイティブ設定ファイルを読み書きします。すべての書き込みには、アクセス権限を制限したアトミックなファイル操作を使用します(ファイルは 0o600、ディレクトリは 0o700)。
- ローカル状態は
~/.mcpm/に保存されます。servers.json(インストール済みサーバーのレジストリ)、aliases.json、secrets.enc.json(暗号化された認証情報ストア)、および guard ファイル(pins.json、guard-policy.yaml、guard-confine.yaml、guard-unguarded.json、guard-events.jsonl)が含まれます。レジストリのキャッシュはありません。レジストリの読み取りは毎回、ライブ取得を行います。
テレメトリーはありません。分析機能はありません。アカウントは不要です。
貢献
貢献を歓迎します。
git clone https://github.com/getmcpm/cli.git
cd cli
pnpm install
pnpm test
pnpm build
PR を送信する前に:
pnpm testを実行し、すべてのテストがパスすることを確認してください- 型を確認するために
pnpm lintを実行してください - コミットの内容は絞り、一つのコミットにつき一つの変更にしてください
- conventional commit の形式に従ってください
このプロジェクトは MIT ライセンスです。LICENSE をご覧ください。
セキュリティ
セキュリティの脆弱性を発見した場合は、公開の issue を作成するのではなく、GitHub の非公開脆弱性報告機能をご利用ください。48 時間以内に回答します。
信頼性評価に関する問題(スキャナーの誤検知/見逃し)については、通常の GitHub issue で問題ありません。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。