Agent SDK で MCP をつなぐ|外部ツール連携の設定

この記事の要点
- MCP は AI エージェントを外部の道具やデータにつなぐ共通の規格。Agent SDK ではコードか設定ファイルでサーバーを足す
- つなぎ方は、手元で動かす(stdio)・URL でつなぐ(HTTP・SSE)・アプリの中に作る(SDK サーバー)の3つ
- MCP の道具は許可しないと使えない。allowedTools に mcp__サーバー名__道具名 で書くのが基本
AI エージェントに社内のデータベースやチャット、課題管理を触らせたいとき、窓口になるのが MCP(Model Context Protocol) です。CLI の Claude Code で MCP を使う方法は Claude Code の MCP で解説しました。
この記事では、公式ドキュメント「Connect to external tools with MCP」(2026年11月9日確認)にもとづいて、Agent SDK で作るアプリから MCP サーバーをつなぐ設定 を整理します。
結論:サーバーを足し、道具を許可し、状態を確かめる
MCP は、AI エージェントを外部の道具やデータにつなぐための共通の規格 です。Agent SDK では、次の3つをそろえれば使えます。
- サーバーを足す:呼び出しの設定(mcpServers)に書くか、プロジェクトの .mcp.json に書く
- 道具を許可する:許可リスト(allowedTools)に、使ってよい道具の名前を書く
- 状態を確かめる:会話の最初に届く init メッセージで、つながったかを見る

サーバーの足し方は2つ
| 足し方 | 書く場所 | 向いている場面 |
|---|---|---|
| コードで足す | query の mcpServers | アプリごとに使うサーバーを決めたい |
| 設定ファイルで足す | プロジェクトの直下の .mcp.json | CLI とも同じ設定を使い回したい |
.mcp.json は、設定の読み込み元に project が入っているときに読まれます。 何も指定しなければ入っていますが、読み込み元(settingSources)を自分で指定したときは、project を含めないと読まれません。
つなぎ方は3つ
サーバーの説明書きに「実行するコマンド」があれば stdio、「URL」があれば HTTP か SSE を選びます。
| つなぎ方 | 中身 | 例 |
|---|---|---|
| stdio | 同じマシンで別のプログラムとして動かし、入出力でやりとりする | npx で始めるファイル操作のサーバーなど |
| HTTP・SSE | ネットの向こうのサーバーに URL でつなぐ | クラウドで提供されているサーバー |
| SDK サーバー | 自分のアプリのコードの中に道具を作る | 社内の API を包んだ独自の道具 |
HTTP のうち新しい方式は type を http と書きます。自分で道具を作る方法は Agent SDK のカスタムツール で解説しています。
道具は許可しないと使えない
MCP の道具は、許可しないと AI から見えていても呼び出せません。 名前は mcp__サーバー名__道具名 の形です。サーバー名にある「.」や空白は「_」に置き換わります。
| 書き方 | 意味 |
|---|---|
| mcp__github__list_issues | github サーバーの list_issues だけ許可 |
| mcp__github__* | github サーバーの道具をすべて許可 |
公式は 「MCP の許可は、権限モードより許可リストで」 と勧めています。ファイル編集をまとめて許す acceptEdits では MCP の道具は許可されず、何でも許す bypassPermissions では MCP 以外の安全確認まで外れてしまうためです。権限の判定の順番は Agent SDK の権限設定 で解説しています。
道具が多いと、その説明だけで会話の容量を圧迫します。そこで SDK は、必要な道具の説明だけをその都度読み込む「道具の検索」を既定でオン にしています。
認証の渡し方
鍵やトークンは、設定に直接書かず環境変数から渡します。 stdio のサーバーには env 欄で、HTTP・SSE のサーバーには headers 欄で渡します。設定ファイルでは ${API_KEY} のように書くと、実行時に環境変数の値に置き換わります。
OAuth でログインするサーバーには注意があります。SDK はブラウザを開いてログインする流れを自分では行いません。 ログインが要るサーバーは状態が needs-auth になり、そのサーバーの道具なしで作業が続きます。自分のアプリでログインの流れを済ませ、受け取ったトークンを headers で渡す形にします。
つながったかの見方
会話の最初に届く init メッセージに、サーバーごとの状態 が入ります。
| 状態 | 意味 |
|---|---|
| connected | つながった |
| pending | まだつなぎ中、または前回の道具の一覧を使っていて最初の呼び出しでつなぐ。失敗とは限らない |
| failed | つながらなかった |
| needs-auth | ログインが要る |
| disabled | 無効にしている |
使えないサーバーを見つけるときは、failed と needs-auth を見ます。 pending だけで失敗と決めつけないのがポイントです。途中で接続が切れると pending に戻って自動でつなぎ直し、5回失敗すると failed になります。
つながらない時の主な原因は、環境変数の入れ忘れ、サーバーのプログラムが入っていない、接続先の書き間違い、ネットワークの制限です。道具が見えているのに使われない時は、許可リストを確かめます。
時間と大きさの上限
- 接続:既定で30秒。起動が遅いサーバーは、軽いサーバーに替える・先に起動しておくなどで対処する
- 出力の大きさ:画像を含まない結果が25,000トークンを超えると、ファイルに保存され、その場所が伝えられる。上限は環境変数で変えられる
データベースにつなぐ例では、公式も 読み取り専用の設定にしておくこと を勧めています。AI が書いた SQL がそのまま実行されるため、書き込みを許すかどうかは人が先に決めておきます。
まとめ
- MCP は 外部の道具につなぐ共通の規格。コードか .mcp.json でサーバーを足す
- つなぎ方は stdio・HTTP/SSE・SDK サーバー の3つ。道具は 許可リストで mcp__サーバー名__ から許可する
- 鍵は環境変数で渡し、init メッセージの failed と needs-auth でつながらないサーバーを見つける
出典
この記事はAIを使って下書きし、著者が事実確認・加筆しています。ツールの機能や料金は変わることがあるため、最新の情報は各社の公式ページでご確認ください。


