ホームへ戻る

代理協定/供應鏈安全

MCP Registryの実測で隠れたシステムプロンプトが明らかに:接続可能な5,000超のサーバーがinstructionsを返却

Fetchgateが公式Registryに登録された15,329件のリモートURLに対して読み取り専用のハンドシェイクを実行したところ、接続可能な5,462エンドポイントがサーバーレベルの指示を送信していた。問題はプロンプトインジェクションだけでなく、ターンごとに繰り返し発生するコンテキストコストや、ツール間での暗黙的な優先順位争いにも及ぶ。

Alec Wilson from Solihull, United Kingdom · CC BY-SA 2.0 · Image source
zh-Hant

Fetchgateは、MCP公式Registryに掲載された15,329件のリモートURLに対し、`initialize`、`notifications/initialized`、`tools/list`を順に送信したが、ツール自体は一切呼び出さなかった。8,235エンドポイントがツール一覧を正常に返し、含まれるツールは合計140,284件に上った。このうち5,462エンドポイントは、ハンドシェイク結果に空ではない`instructions`も付加していた。MCP仕様では、このフィールドをモデルによるサーバー利用を支援する自然言語のプロンプトと定義し、クライアントがsystem promptに組み込むことを認めている。一方で、長さの上限や、その内容をユーザーインターフェース上でユーザーに表示する義務は定めていない。

実測では、`instructions`の長さの中央値は577文字だった。114エンドポイントは5,000文字を超え、最長は68,669文字に達し、概算では会話を始めるだけで約17,000 tokenを消費する。ツール説明にも同様の肥大化が見られ、9,262件が1,500文字を超えていた。単一の`create_diagram`の説明に至っては52,183文字に達した。こうした内容がリクエストのたびに再送信されれば、費用とレイテンシーが増えるだけでなく、限られたコンテキスト内でユーザープロンプトや過去の会話が持つ重みを薄める可能性もある。

さらに機微性が高いのが、行動を誘導する文言だ。研究者が手作業で整理したところ、47エンドポイントが、特定のプラットフォーム、競合他社、失敗、または安全上のブロックに関する情報をユーザーへ開示しないようモデルに求めていた。480ホストが「必ず〜しなければならない」や「常に呼び出す」といったモデル向けの表現を使用し、406ホストが自らのツールを他のツールより先に実行すべきだと主張していた。これは必ずしも悪意あるプロンプトインジェクションと同義ではない。研究では、140,284件の説明から、鍵を盗み出すよう指示する典型的な文言は見つからなかった。また、一部の文言は単なる内部識別子や決済フローのルールだった。それでも、サーバー事業者が通常のチャット履歴の外側からエージェントの挙動を変更できることは実証された。

プラットフォームエンジニアは、ハンドシェイクごとに取得した指示とツール説明を保存し、依存パッケージをロックする場合と同様に、バージョン間の差分、token予算、出所を監査すべきだ。また、`readOnlyHint`などのアノテーションは権限の証明ではなく、サーバーによる自己申告として扱う必要がある。なお、データには依然として偏りがある。URLには過去のバージョンが含まれ、認証が必要な3,617エンドポイントは検査できなかったうえ、2社の事業者だけで接続に成功したエンドポイントの約3割を占めていた。これは特定の時点に単一のネットワーク拠点から取得したスナップショットであり、MCPエコシステム全体における悪意あるサーバーの割合を示すものではない。

出典

  1. MCP Registry Audit 2026: 15,329 Servers Probed
  2. Schema Reference: InitializeResult.instructions
  3. MCP servers write into your system prompt. Nobody logs it.