AIエージェントとMCP
MCP(Model Context Protocol)とは、AIエージェントが外部ツールやサービスと標準化された方法で連携するためのオープン規格です。エージェントがどのようなツールを使うにしても、同一のインターフェースで呼び出せるようにすることで、ツール統合の複雑さを大幅に削減します。
対象読者: AIエージェントの基本を理解しており、ツール連携の仕組みとセキュリティを学びたい方
学習時間の目安: 読了 20分
前提知識: AIエージェントとは、MCPとは
AIエージェントとツール連携の課題
Section titled “AIエージェントとツール連携の課題”AIエージェントが「行動する」ためにはツールが不可欠です。しかし従来のツール連携には以下の課題がありました。
| 課題 | 内容 |
|---|---|
| API仕様のばらつき | ツールごとに異なるリクエスト形式・認証方式・レスポンス構造 |
| 統合コストの増大 | 新しいツールを追加するたびにカスタム実装が必要(M×N問題) |
| エラーハンドリングの複雑化 | ツールごとに異なるエラーコード・例外処理が必要 |
| セキュリティ管理の分散 | 各ツールの認証情報・権限管理が別々 |
具体的には、エージェントがWeb検索・GitHub操作・データベース照会・ファイル操作を組み合わせる場合、それぞれ異なるSDKをインポートし、異なる形式で呼び出す必要がありました。
MCPが解決すること
Section titled “MCPが解決すること”MCPは、エージェントとツールの間に共通のプロトコル層を設けることで、上記の課題を解決します。
エージェントはMCPという「共通言語」でツールを呼び出すだけでよく、各ツールの実装の詳細はMCPサーバーが隠蔽します。
USB-Cのアナロジーが分かりやすいです。USB-C以前はデバイスごとに異なるケーブルが必要でしたが、USB-Cという共通規格が普及したことで1本のケーブルで多様なデバイスを接続できるようになりました。MCPはAIエージェントにとってのUSB-Cです。
MCPとエージェントの関係
Section titled “MCPとエージェントの関係”エージェントがMCPを使ってツールを呼び出す全体像は以下の通りです。
graph LR
subgraph AgentSystem["エージェントシステム"]
Agent["エージェント\n(LLMコア)"]
MCPClient["MCPクライアント\n(プロトコル変換)"]
Agent <-->|"ツール呼び出し要求\n・実行結果"| MCPClient
end
subgraph MCPServers["MCPサーバー群"]
FS["File System MCP\nファイル読み書き"]
GitHub["GitHub MCP\nリポジトリ操作"]
Browser["Puppeteer MCP\nブラウザ自動化"]
DB["Database MCP\nDB照会・更新"]
Search["Search MCP\nWeb検索"]
end
MCPClient <-->|"標準化されたMCPプロトコル"| FS
MCPClient <-->|"標準化されたMCPプロトコル"| GitHub
MCPClient <-->|"標準化されたMCPプロトコル"| Browser
MCPClient <-->|"標準化されたMCPプロトコル"| DB
MCPClient <-->|"標準化されたMCPプロトコル"| SearchMCPクライアントはエージェントとMCPサーバーの間でプロトコル変換を担うコンポーネントです。エージェントは「どのMCPサーバーか」を意識せず、統一されたインターフェースでツールを利用できます。
Claude CodeにおけるMCP活用例
Section titled “Claude CodeにおけるMCP活用例”Claude Code は MCP を標準サポートしており、.claude/mcp.json(または ~/.claude/mcp.json)に設定することで各種ツールと連携できます。
File System MCP(ファイルシステム操作)
Section titled “File System MCP(ファイルシステム操作)”// .claude/mcp.json の設定例
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/projects"
]
}
}
}File System MCP を設定すると、エージェントは以下の操作を自律的に実行できます。
- プロジェクトのファイル一覧を取得する
- ファイルの内容を読み取って分析する
- コードの修正結果をファイルに書き込む
- ディレクトリ構造を把握して設計判断に活用する
GitHub MCP(GitHub操作)
Section titled “GitHub MCP(GitHub操作)”{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}GitHub MCP を使うと、エージェントは以下の操作を実行できます。
- Issue の内容を参照してコードを修正する
- Pull Requestを作成・更新する
- リポジトリのコードを検索・分析する
- コミット履歴を参照してバグの原因を調査する
Puppeteer/Playwright MCP(ブラウザ自動化)
Section titled “Puppeteer/Playwright MCP(ブラウザ自動化)”Web UIのテスト・スクレイピング・動的コンテンツの取得を自動化します。
{
"mcpServers": {
"puppeteer": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-puppeteer"]
}
}
}データベースMCP
Section titled “データベースMCP”PostgreSQL・SQLiteなどのデータベースへの照会・更新を標準化されたインターフェースで実行できます。
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://localhost/mydb"
]
}
}
}MCPサーバーの呼び出しフロー
Section titled “MCPサーバーの呼び出しフロー”エージェントがMCPツールを呼び出す際の詳細なフローは以下の通りです。
sequenceDiagram
participant U as ユーザー
participant A as エージェント(LLM)
participant MC as MCPクライアント
participant MS as MCPサーバー
participant T as 外部ツール/API
U->>A: タスク依頼「issueを見てコードを修正して」
A->>MC: 利用可能なツール一覧を要求
MC->>MS: tools/list
MS->>MC: ツール一覧(read_file, write_file, list_issues など)
MC->>A: ツール一覧を返す
A->>A: Reason: GitHub MCP で issue を読む
A->>MC: tools/call: list_issues(repo="myrepo")
MC->>MS: tools/call リクエスト
MS->>T: GitHub API 呼び出し
T->>MS: issue データ
MS->>MC: ツール実行結果
MC->>A: issue 内容を返す
A->>A: Reason: 修正が必要なファイルを特定
A->>MC: tools/call: read_file(path="src/auth.ts")
MC->>MS: tools/call リクエスト
MS->>T: ファイルシステム読み取り
T->>MS: ファイル内容
MS->>MC: ファイル内容
MC->>A: ファイル内容を返す
A->>A: Reason: 修正内容を生成
Note over A,U: 不可逆な操作(ファイル書き込み)のため確認
A->>U: 「以下の変更を適用しますか?」(承認リクエスト)
U->>A: 承認
A->>MC: tools/call: write_file(path="src/auth.ts", content="...")
MC->>MS: tools/call リクエスト
MS->>T: ファイル書き込み
T->>MS: 成功
MS->>MC: 完了
MC->>A: 書き込み成功
A->>U: 修正完了を報告ツール承認とセキュリティ
Section titled “ツール承認とセキュリティ”MCPを通じたエージェントのツール利用には、適切なセキュリティ設計が不可欠です。
Allow list / Deny list
Section titled “Allow list / Deny list”エージェントが使用できるツール・操作を明示的に制限します。
// セキュリティ設定例(概念的)
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/projects/safe-dir" // アクセス許可ディレクトリを限定
]
}
},
"permissions": {
"allow": [
"filesystem/read_file",
"filesystem/list_directory",
"github/list_issues",
"github/read_pull_request"
],
"deny": [
"filesystem/delete_file", // ファイル削除は禁止
"github/delete_repository" // リポジトリ削除は禁止
]
}
}不可逆な操作への確認(Human-in-the-loop)
Section titled “不可逆な操作への確認(Human-in-the-loop)”一度実行すると取り消せない操作の前には、必ず人間の確認を求める設計にします。
| 操作カテゴリ | 例 | 推奨対応 |
|---|---|---|
| 高リスク(必ず確認) | ファイル削除、データベース削除、メール送信、支払い | 変更内容を表示して明示的な承認を要求 |
| 中リスク(確認推奨) | ファイル上書き、外部APIへのPOST、設定変更 | 変更内容のプレビューを表示 |
| 低リスク(自動実行可) | ファイル読み取り、Web検索、リスト取得 | 確認なしで実行 |
Claude Code では --dangerously-skip-permissions フラグを使わない限り、デフォルトで重要な操作に確認を求めます。このデフォルト動作を維持することがセキュリティ上の推奨設定です。
サンドボックス化の重要性
Section titled “サンドボックス化の重要性”エージェントがコードを実行する場合、本番環境に直接影響しないようサンドボックス(隔離された実行環境)内で実行します。
graph LR
Agent["エージェント"] --> Sandbox["サンドボックス環境\n(Docker コンテナなど)"]
Sandbox --> |"限定的なアクセスのみ"| Prod["本番環境\n(保護)"]
Sandbox --> LocalFS["ローカルファイルシステム\n(作業用)"]
Sandbox --> Internet["インターネット\n(必要に応じて)"]サンドボックスでの実行例
- コード実行はDockerコンテナ内に限定する
- 本番データベースへの書き込みは禁止し、テスト用DBのみ使用する
- ネットワークアクセスを必要なエンドポイントのみに制限する
MCP Registry(エコシステム)
Section titled “MCP Registry(エコシステム)”MCPはオープン規格であり、コミュニティが多数のMCPサーバーを公開しています。
公式・主要MCPサーバーの例
| カテゴリ | MCPサーバー | 提供機能 |
|---|---|---|
| ファイルシステム | @modelcontextprotocol/server-filesystem | ファイル読み書き・ディレクトリ操作 |
| バージョン管理 | @modelcontextprotocol/server-github | GitHub操作(Issue・PR・リポジトリ) |
| ブラウザ | @modelcontextprotocol/server-puppeteer | ブラウザ自動化・スクレイピング |
| データベース | @modelcontextprotocol/server-postgres | PostgreSQL照会・更新 |
| 検索 | @modelcontextprotocol/server-brave-search | Brave Search API |
| 通知 | @modelcontextprotocol/server-slack | Slack メッセージ送信 |
MCP公式サイトでは利用可能なMCPサーバーの一覧を確認できます。独自のMCPサーバーを実装することも可能で、Anthropicが公開しているSDK(Python・TypeScript)を使用します。
- MCPはAIエージェントとツール間の通信を標準化するオープン規格
- エージェントはMCPクライアント経由で複数のMCPサーバーに接続し、ツールを統一されたインターフェースで呼び出す
- Claude Code では
.claude/mcp.jsonに設定を書くだけでFile System・GitHub・ブラウザなどのMCPサーバーと連携できる - セキュリティ設計の核心は「allow/deny list」「不可逆操作への確認」「サンドボックス化」の3点
- MCPエコシステムには多数の公式・コミュニティ製サーバーが存在し、カスタムサーバーの実装も可能
よくある質問
Section titled “よくある質問”Q: MCPを使わないエージェントも作れますか?
A: はい、可能です。LLMのFunction Calling(OpenAI)やTool Use(Anthropic)機能を直接使って、MCPなしでツールを呼び出せます。MCPはツール統合を標準化するための規格であり、必須ではありません。ただし、複数ツールを使う場合はMCPを採用する方が長期的なメンテナンスが容易になります。
Q: MCPサーバーはどこで動きますか?ローカルですか?
A: ローカルサーバー(stdioトランスポート)とリモートサーバー(HTTPSトランスポート)の両方に対応しています。ローカルサーバーはセキュリティ上有利ですが、クラウドサービスと連携する場合はリモートMCPサーバーが必要になります。詳細はローカルMCPとリモートMCPの違いを参照してください。
Q: MCPサーバーへの認証情報(APIキーなど)はどう管理しますか?
A: 環境変数として注入する方法が標準的です("env": {"API_KEY": "${MY_API_KEY"} の形式)。APIキーをMCP設定ファイルにハードコードしないよう注意し、設定ファイルを .gitignore に追加してリポジトリにコミットしないようにします。
Q: 自分でMCPサーバーを作ることはできますか?
A: はい。Anthropicが提供するPython SDK(mcpパッケージ)またはTypeScript SDK(@modelcontextprotocol/sdk)を使って、独自のMCPサーバーを実装できます。社内の独自APIや独自データソースをエージェントから使えるようにしたい場合に有効です。
Q: MCPとAPIの違いは何ですか?
A: APIは特定のサービスへの接続インターフェースです。MCPはエージェントとツール間の通信を標準化するメタプロトコルです。MCPサーバーは内部でAPIを呼び出すことが多くあります。MCPはAPIを置き換えるものではなく、エージェントがAPIをより簡単に利用できるようにする仕組みです。
次のステップ: MCPとは
このページへのリンク(英語): AI Agents and MCP