📚

MCP server を社内で増やし始めると、最初は「どの server が便利か」に目が行きます。GitHub、Sentry、Notion、Slack、社内検索、データ基盤。ひとつずつは便利ですが、数が増えた瞬間に「誰が許可したのか」「どの scope で動くのか」「いつ見直すのか」が見えなくなります。

この記事では、remote MCP server を組織で許可する前に作る MCP サーバーカタログ の設計を整理します。認証・監査・配布統制の全体像は MCP エンタープライズ運用ガイド、Claude Code から MCP をつなぐ手順は Claude Code MCP ガイド、prompt injection と tool poisoning の防御は MCP prompt injection 対策ガイド、AIエージェント全体の監査ログは AIエージェント監査ログ設計ガイド に分けています。

今回はその手前にある「どの MCP server を、誰の責任で、どの条件なら組織に入れてよいか」を扱います。

先に結論: allowlist の前に catalog が必要

MCP の統制でよくある失敗は、いきなり allowlist を作ることです。

allowlist は重要です。ただし、allowlist は「許可するものの一覧」であって、「なぜ許可したのか」「いつ見直すのか」「何をしてよいのか」までは説明してくれません。実務では、allowlist の前に catalog が必要です。

私なら、MCP サーバーカタログには最低限これを持たせます。

項目目的
server idgithub-readonly-mcp同名・類似名を避ける
ownerplatform team / data team障害時と棚卸し時の責任者を決める
transportStreamable HTTP / SSE / stdio接続方式ごとのリスクを分ける
endpointhttps://mcp.company.example/githuballowlist と監査ログへつなぐ
authOAuth / service account / header secret権限主体を説明する
scoperepo:read, issues:read最小権限を固定する
tool riskread / draft / write / external action承認要否を決める
data boundarypublic / internal / customer data扱う情報の機密度を決める
review date2026-09-01放置された server を止める
kill switchDNS / gateway / managed settings緊急停止の場所を決める

ここまでそろっていない MCP server は、便利でも組織標準にはしません。個人検証と組織配布は別物です。

なぜ今 catalog が必要なのか

MCP Registry の remote server 定義では、server.jsonremotes に transport type と URL を持たせられます。remote server は Streamable HTTP が推奨され、SSE も指定できます。さらに URL template variables や HTTP headers も定義できます。

これは公開・発見の仕組みとしては便利です。一方で、組織利用では「発見できる」ことと「許可してよい」ことを分ける必要があります。

たとえば、同じ remote MCP でも次はリスクが違います。

  • 社内 docs を read-only で検索する server
  • GitHub issue を読み、PR comment も書ける server
  • 顧客データを検索し、CRM に更新を書き戻せる server
  • API key を header secret として受け取る multi-tenant server

MCP の authorization 仕様では、HTTP transport 向けに OAuth ベースの authorization flow が定義され、scope selection や resource parameter、token handling が整理されています。つまり remote MCP は単なる URL ではなく、外部 system の権限主体を伴う接続です。

だから catalog では URL だけでなく、scope、認証主体、tool risk、data boundary まで同じ行に置く必要があります。

catalog の単位は server ではなく「許可された用途」

同じ vendor の MCP server でも、用途が違えば catalog では分けます。

悪い例:

GitHub MCP: allowed

良い例:

github-readonly-mcp
  purpose: PR / issue / repo metadata の読み取り
  scopes: repo:read, issues:read
  tools: list issues, read PR, read file metadata
  risk: read
  expires: 2026-09-01

github-review-comment-mcp
  purpose: PR への review comment 下書きと投稿
  scopes: pull_requests:write
  tools: create review comment
  risk: external action
  approval: required
  expires: 2026-07-15

この分け方にすると、「GitHub を許可するか」ではなく、「GitHub のどの操作を、どの文脈で許可するか」を議論できます。

MCP 導入の事故は、server 名の粒度が粗いと起きやすいです。read-only の便利さに引っ張られて、write tool まで同じ許可枠に入ってしまうからです。

初回審査で見るべき7項目

MCP server を catalog に入れるとき、私は次の7項目を見ます。

1. 所有者がいるか

owner がいない MCP server は組織標準にしません。

owner は「使いたい人」ではなく、次を説明できる人です。

  • なぜ必要か
  • どの data に触るか
  • scope をなぜその範囲にしたか
  • 障害時に誰が止めるか
  • version update を誰が見るか

MCP は一度入れると、AIエージェントの作業面に自然に組み込まれます。owner 不在の server は、時間が経つほど誰も外せなくなります。

2. endpoint と transport が固定されているか

remote MCP は、endpoint の固定が重要です。

MCP Registry の remote server 定義では URL template variables を使えます。multi-tenant には便利ですが、組織配布では変数の値が統制点になります。tenant_idregion をユーザーが自由入力できるなら、どの endpoint へ接続してよいかを別途制限する必要があります。

私なら catalog には、解決後の endpoint も残します。

server_id: docs-search-mcp
transport: streamable-http
declared_url: https://{tenant_id}.docs.example.com/mcp
approved_values:
  tenant_id:
    - jp-prod
    - us-prod
resolved_endpoints:
  - https://jp-prod.docs.example.com/mcp
  - https://us-prod.docs.example.com/mcp

これをしないと、「公式定義は正しいが、接続先は別 tenant」という抜け道が残ります。

3. scope が用途と一致しているか

MCP authorization 仕様では、clients は必要な scope を選び、server は WWW-Authenticate header などで必要 scope を示せます。実務では、ここをそのまま流さず catalog 側で用途と照合します。

たとえば docs search なのに write scope があるなら、初回審査で落とします。PR comment が必要なら、read-only catalog とは別 server id にします。

scope は「技術的に必要か」だけでなく、「この業務で必要か」で見ます。

4. tool list の変更をどう検知するか

MCP server は tool を提供します。問題は、server version の更新で tool list が変わることです。

初回審査で read-only だった server が、後から write tool を追加する可能性があります。これを allowlist だけで見るのは難しいです。

私なら、catalog に次を残します。

approved_tools:
  - search_docs
  - read_document
blocked_tools:
  - update_document
  - export_customer_data
tool_list_hash: sha256:...
last_tool_reviewed_at: 2026-06-06

hash そのものは運用環境によって実装が違って構いません。重要なのは、「server が変わったら再審査する」というルールを catalog に持たせることです。

5. header secret や API key を誰が管理するか

MCP Registry の remote server 定義では、HTTP headers を isSecret 付きで要求できます。これは便利ですが、組織では secret の置き場所が統制点になります。

個人の local config に API key を散らすなら、退職・異動・漏洩時に回収しにくくなります。標準配布する server なら、secret は個人ファイルではなく、gateway、IdP、secret manager、managed config のどこかに寄せます。

catalog には secret の値ではなく、管理方法を残します。

secret_owner: platform-security
secret_location: 1password-connect
rotation: 90d
user_supplied_secret_allowed: false

6. prompt injection の入力経路を分けているか

外部コンテンツを読む MCP server は、read-only でも安全とは限りません。issue、web page、docs、chat、customer support log には、モデルへの指示に見える文字列が混ざります。

ここは既存の MCP prompt injection 対策ガイド の範囲ですが、catalog にも最低限の分類を持たせます。

input_trust:
  external_text: true
  user_generated_content: true
  internal_only: false
session_policy: read_only_session_required
write_tools_same_session: denied

つまり、server を許可するときに「未信頼入力を持ち込むか」を先に分類します。あとから承認プロンプトで頑張るより、この方が効きます。

7. 失効条件が書かれているか

catalog の一番大事な項目は、実は失効条件です。

次のどれかに当てはまったら、MCP server は再審査または停止にします。

  • owner がいなくなった
  • endpoint が変わった
  • tool list が変わった
  • scope が増えた
  • secret rotation に失敗した
  • audit log が取れなくなった
  • vendor の security notice が出た
  • 90日使われていない

導入時の審査だけでは足りません。MCP server は運用中に変わるので、catalog も生きている必要があります。

catalog から managed settings へ落とす

catalog は文書で終わらせない方がいいです。可能な限り、配布設定へ落とします。

Claude Code の managed MCP docs では、managed-mcp.json で組織管理の MCP server を配布できます。また managed settings 側には、管理対象 server だけを尊重させる設定や、ユーザー設定からの拡張を抑える設定があります。Claude Code から個別に MCP を追加する手順や allowlist / denylist の詳細は Claude Code の MCP docs を確認してください。

実務では、catalog と managed settings を次のように対応させます。

catalogmanaged config 側の対応
approved endpointmanaged-mcp.json の server URL
denied endpointdenylist
approved stdio commandcommand 固定
user-added server 禁止managed server only
write tool 要承認permission rule / approval policy
owner / expirycatalog と棚卸し job

ここで注意すべきは、managed config だけでは owner や expiry までは表現しにくいことです。だから catalog が必要です。設定ファイルは enforcement、catalog は説明責任と棚卸しに使います。

小さく始める catalog 例

最初から大きな台帳システムを作る必要はありません。Markdown か YAML で十分です。

server_id: github-readonly-mcp
title: GitHub read-only MCP
owner: platform-team
status: approved
purpose: PR, issue, repo metadata の調査
transport: streamable-http
endpoint: https://mcp.company.example/github
auth:
  type: oauth
  subject: user
  scopes:
    - repo:read
    - issues:read
tool_risk:
  max_level: read
  write_tools_allowed: false
data_boundary:
  allowed:
    - company repositories
  denied:
    - personal repositories
    - secrets
prompt_injection:
  external_text: true
  same_session_write_tools: denied
audit:
  log_fields:
    - actor
    - server_id
    - tool_name
    - target
    - result
    - scope
review:
  approved_at: 2026-06-06
  expires_at: 2026-09-06
  kill_switch: managed-mcp denylist

これくらいの粒度でも、「便利そうだから入れる」よりはかなり安全です。

審査フローは3段階で十分

大企業向けの重い審査フローを最初から作ると、現場が迂回します。小さく始めるなら3段階で十分です。

1. Trial

個人または小チームで検証する段階です。

  • 期限は短くする
  • write tool は原則禁止
  • 個人 token を本番自動化に使わない
  • 検証ログを残す

2. Approved

組織で使ってよい段階です。

  • owner がいる
  • endpoint と scope が固定されている
  • audit log が取れる
  • managed config に落ちている
  • review date がある

3. Deprecated

使わない、または置き換える段階です。

  • 新規利用を止める
  • 既存利用者を棚卸しする
  • replacement を決める
  • expiry で denylist へ移す

この3段階を catalog に持たせるだけで、「入れたら終わり」から抜け出せます。

OpenAI / ChatGPT 側の custom MCP でも同じ考え方を使う

OpenAI の Developer mode と MCP apps のヘルプでも、未信頼の MCP server には prompt injection などのリスクがあると説明されています。ChatGPT 側で custom MCP app を試す場合でも、考え方は同じです。

remote MCP の認証については、2026年5月公開の計測研究でも OAuth 対応 server の動的 client registration や delegated authorization 周辺に多くの不備が見つかったと報告されています。研究結果をそのまま自社環境へ一般化するのは乱暴ですが、少なくとも「公開 server を見つけたら即採用」ではなく、catalog で審査する理由にはなります(A First Measurement Study on Authentication Security in Real-World Remote MCP Servers)。

違うのは、配布先や承認UIです。共通して必要なのは次です。

  • 誰が server を所有するか
  • どの endpoint を信頼するか
  • どの data に触るか
  • どの tool が write / external action か
  • いつ失効させるか

MCP client が Claude Code でも ChatGPT でも、自社が持つべき catalog の項目はほぼ変わりません。client ごとの設定差分を catalog の下流に置くと、運用を乗り換えやすくなります。

まとめ

MCP server の組織導入で一番危ないのは、server が増えること自体ではありません。許可理由、owner、scope、tool risk、失効条件が見えないまま増えることです。

MCP Registry や remote server 定義により、server の公開と発見は進みます。OAuth 仕様により、認証の標準化も進みます。だからこそ、自社側では「どの server をどの用途で許可するか」を catalog として持つ必要があります。

私なら、最初の MCP 統制は allowlist ではなく catalog から始めます。server id、owner、endpoint、scope、tool risk、data boundary、review date、kill switch を1行に置く。そこから managed settings、監査ログ、定期棚卸しへ落とす。

それができて初めて、MCP は「便利な外部接続」ではなく、組織で運用できる AIエージェントの接続基盤になります。

WRITTEN BY nidoneko

Full-stack engineer with 8+ years of experience in TypeScript, React, Node.js, and cloud-native development across healthcare, finance, HR, and IoT domains.

View Profile →