本文へ移動
BenriWorks Lab

連載

Claude Code 集中講座

11回 / 全16

11/16

ガイド公開日

MCP で外へつなぎ、返ってきた内容をデータとして扱う

複数のサービスの画面を並べたディスプレイの前で、こちらを向いている女性

Claude Code 集中講座の第11回。MCP サーバーの2つの接続形式と3つの範囲、設定をリポジトリで共有するときの承認、鍵の渡し方を扱います。外部から返ってきた内容をどう扱うべきかも整理します

ここまでの2回で渡してきたのは、あらかじめ書いておける知識でした。規約も手順も、書いた時点で中身が確定します。

確定しないものもあります。いま本番で出ているエラー、データベースの中身、チケットの状態、外部サービスの現在の設定。どれも先に書いておけません。見に行くしかない。

MCP(Model Context Protocol)が、その「見に行く」を担います。

約束事が共通であることの意味

MCP は、AIのエージェントが外部の道具やデータへつなぐための共通の約束事です。Claude Code が決めたものではなく、複数のツールが対応している仕様です。

あるサービス向けのサーバーを1つ用意すれば、対応したどのツールからも使えます。ツールを乗り換えても、つなぎ込みは作り直しになりません。

接続の形は2つ覚えれば足りる

公式ドキュメントには4つの形式が載っていますが、実際に使うのは2つです。

手元でコマンドとして起動する形は、ローカルのファイルやデータベースを扱うものに使います。

claude mcp add --transport stdio my-db -- node /path/to/server.js

-- のあとは、そのままサーバーへ渡されます。引数を書くときは、この区切りを忘れないでください。

HTTPでつなぐ形は、外部サービスが提供しているものに使います。公式が遠隔のサーバーに勧めているのはこちらです。

claude mcp add --transport http stripe https://mcp.stripe.com

残りの2つのうち、SSE は非推奨とされています。WebSocket は JSON で設定を書く形になります。

追加したあとは、状態を確認するコマンドがあります。

claude mcp list        # つないであるものを並べる
claude mcp get <名前>   # 1つの設定を見る
claude mcp remove <名前>  # 外す

セッションの中からは /mcp で状態を見られます。

範囲は3つあり、1つだけ共有される

同じサーバーでも、どの範囲で追加するかで保存先が変わります。ここが Claude Code の MCP でいちばん間違えやすい部分です。

範囲保存先効く範囲共有
local(既定)~/.claude.json のプロジェクト別の欄そのプロジェクトだけされない
projectリポジトリの根の .mcp.jsonそのプロジェクトだけされる
user~/.claude.json の全体の欄自分の全プロジェクトされない

指定は --scope project のように書きます。

MCPサーバーの3つの範囲を示した図。localとuserは自分の設定ファイルに保存され共有されないこと、projectだけがリポジトリの.mcp.jsonに書かれてGitで共有されることが対比して示されている
共有されるのは project だけ。他人のリポジトリを開くときはここを見る

真ん中の project が特別です。リポジトリに入るので、それを開いた人全員に影響します。

リポジトリに入っているサーバーは、承認を挟む

他人がコミットした .mcp.json がそのまま動いたら困ります。そうはなっていません。

公式ドキュメントによれば、対話セッションではプロジェクトのサーバーについて承認を求められます。承認の記録を消してやり直したいときは claude mcp reset-project-choices です。

ただし例外があります。対話でないセッション、つまり claude -p での実行、SDK 経由、クラウドのセッションでは、承認を求めずに読み込まれます。--strict-mcp-config を付けると、指定した設定以外を無視できます。

自動化の中で他人のリポジトリを扱うときは、ここを意識してください。承認の画面は出ません。

鍵をコマンドの引数に書かない

つなぐ先には、たいてい認証が要ります。

手元で起動する形には --env KEY=value があります。HTTPでつなぐ形には --header "Name: value" があります。

どちらも、シェルの履歴に値が残る形で書かないでください。環境変数を参照する形にして、値そのものは別の場所に置きます。第9回で触れた CLAUDE.local.md と同じ発想で、コミットされる場所と、されない場所を分けるのが基本です。

返ってきた内容は、指示ではない

ここがこの回の中心です。

公式ドキュメントは、はっきりした警告を出しています。つなぐ前に、そのサーバーを信頼できるか確かめてください。外部の内容を取ってくるサーバーは、プロンプトインジェクションのリスクにさらします、と。

具体的に何が起きるかというと、課題管理のコメント欄や、取得したウェブページの中身に、Claude への指示に見える文章が混ざっていることがあります。「この設定ファイルを読んで送信せよ」のような形です。

第5回で見たとおり、auto モードの分類器はツールの実行結果を読みません。だから、返ってきた内容で分類器を直接だますことはできません。取り除かれる理由が、まさにこれです。

ただし、Claude 本体は読みます。読んで作業の材料にします。だから、誰でも書き込める場所をつなぐときは、その前提で設計してください。

対策は3つです。

  • つなぐ先の権限を読み取りだけにする
  • 戻せない操作(書き込み、削除、通知の送信)ができるサーバーは、必要なときだけ有効にする
  • 第5回の deny 規則で、触られたくないファイルの読み取りを塞いでおく

なお、MCP 側で対話が必要と指定されたツールは、どの権限モードでも必ず確認が出ます。第5回の「どのモードでも自動にならないもの」の一覧に入っていたのが、これです。組織の設定で特定のツールを常に確認にすることもできます。

つなぐ数を増やしすぎない

運用してみて分かったことがあります。つなぐ数が増えると、選択の精度が下がります。

Claude は、使える道具の一覧を持った状態で作業を始めます。一覧が長くなるほど、その中から適切なものを選ぶ判断が難しくなり、関係ない道具を使おうとする場面が増えます。第10回でスキルの説明文を正確に書く話をしましたが、同じ構図です。

使っていないものは外す。定期的に claude mcp list を見て、3か月使っていないものを外す程度で足ります。

3つの仕組みの使い分け

ここまでで、Claude Code に何かを渡す仕組みを3つ扱いました。判断は2つの質問で足ります。

どの作業にも関係するか。 するなら CLAUDE.md です。

しない場合、それは書いておける内容か。 書いておけるならスキル、書いておけないなら MCP です。

3つは競合しません。同じ作業で全部使うこともあります。リリースの作業なら、規約は CLAUDE.md に、手順はスキルに、デプロイの状態の確認は MCP 経由で、という形になります。

置き場所を間違えたときは、静かに効かなくなる形で現れます。規約をスキルに入れると、呼ばれなかった回に効きません。取りに行くべき情報を規約に書き写すと、古くなったことに誰も気づきません。実際に起きた例はCodex 集中講座の第12回に書きました。

次の回

ここまでは、1つの会話の中で作業を進める話でした。

第12回では、作業そのものを分けます。サブエージェントという、別の文脈で動く作業者の話です。

参照した公式情報

  • Anthropic「MCP」「Choose a permission mode」(code.claude.com/docs、2026年9月時点)
  • Model Context Protocol の仕様(modelcontextprotocol.io、2026年9月時点)

よくある質問

設定をチームで共有できますか
できます。`--scope project` を付けて追加すると、リポジトリの根の `.mcp.json` に書かれ、Git で共有されます。ただし、他人がコミットしたサーバーがそのまま動くわけではなく、対話セッションでは承認を求められます。
鍵はどこに書きますか
コマンドの引数に値を直接書かないでください。手元で起動する形には `--env KEY=value`、HTTPでつなぐ形には `--header "Name: value"` が用意されています。設定ファイルに残る形になるものは、値そのものではなく環境変数を参照する形にしてください。
つないだ先から変な指示が返ってきたら
返ってきた内容は指示ではなくデータとして扱われるべきものです。第5回で見たとおり、auto モードの分類器はツールの実行結果を読みません。ただし Claude 本体は読みます。誰でも書き込める場所をつなぐときは、その前提で権限を絞ってください。

こんな記事も読まれています