MCP(Model Context Protocol)とは何か
2024年末にAnthropicが公開したMCP(Model Context Protocol)は、AIアシスタントが外部ツールやデータソースと安全かつ標準化された方法で通信するためのオープンプロトコルです。2025年に入ってからGitHub、Slack、Google Driveといった主要サービスが次々とMCPサーバーを公開し、エンジニアコミュニティで急速に注目を集めています。
一言で言えば、MCPは「AIのためのUSB-C規格」です。さまざまなデバイスをUSB-Cケーブル一本でつなげるように、MCPを使えばAIアシスタントとあらゆる外部システムを統一インターフェースで接続できます。これにより、ツールごとに異なる独自実装が必要だった従来の手間が大幅に解消されます。
なぜ今MCPが重要なのか
従来のAIツール連携の課題
これまでのAIアシスタントと外部ツールの連携は、Function CallingやPlugin APIなど、プラットフォームごとに仕様が異なる独自の方式に頼っていました。たとえばOpenAIのFunction Callingで書いたコードは、別のLLMプロバイダーでそのまま動かすことはできません。開発者はAIを切り替えるたびに連携コードを書き直す必要があり、これが普及の大きな障壁になっていました。
また、セキュリティの観点からも問題がありました。ツール連携のたびにAPIキーの扱いや認可の仕組みが統一されておらず、設計者のスキルに依存した実装がセキュリティホールを生む事例も見られました。
MCPはこれらの問題に対する、オープン仕様による答えです。プロトコルが標準化されているため、一度MCPサーバーを実装すれば、MCPに対応したどのクライアントからでも利用できます。
エージェント型AIとの相性の良さ
近年、単なる「質問に答えるAI」から、複数のタスクを自律的に実行する「エージェント型AI」への移行が進んでいます。エージェントはコードを書いてテストし、ファイルを操作し、外部APIを叩いてレポートを生成する、といった一連の作業を自律的にこなします。こうした自律的な動作を支えるためには、AIが外部リソースにアクセスする手段が不可欠であり、MCPはまさにその基盤として設計されています。
MCPのアーキテクチャを理解する
MCPはクライアント/サーバーモデルで動作します。
| 役割 | 説明 | 具体例 |
|---|---|---|
| MCPホスト | AIアシスタントが動作する環境 | Claude Desktop、VS Code拡張 |
| MCPクライアント | ホスト内でMCPサーバーと通信するコンポーネント | Claude本体のMCP通信層 |
| MCPサーバー | 外部ツールやデータを提供するプロセス | GitHub MCPサーバー、Slack MCPサーバー |
通信にはJSON-RPC 2.0を採用しており、通常はstdio(標準入出力)またはSSE(Server-Sent Events)を通じてメッセージをやり取りします。サーバーはAIに対して「ツール(Tools)」「リソース(Resources)」「プロンプトテンプレート(Prompts)」の3種類の機能を提供できます。
ツールはAIが呼び出せる関数に相当し、「GitHubのIssueを作成する」「Slackにメッセージを投稿する」といったアクションを実行します。リソースはファイルシステムやデータベースの内容など、AIが参照できるデータソースです。プロンプトテンプレートは、よく使うAIへの指示をあらかじめ定義しておく仕組みで、ユーザーが毎回長いプロンプトを書かなくて済むようにします。
実際にMCPサーバーを作ってみる
概念を理解するには実装が一番です。Pythonを使ったシンプルなMCPサーバーの例を見てみましょう。AnthropicはPythonとTypeScript向けの公式SDKを提供しています。
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import asyncio
app = Server("my-first-mcp")
@app.list_tools()
async def list_tools():
return [
Tool(
name="get_weather",
description="指定した都市の現在の天気を取得します",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string", "description": "都市名(例:Tokyo)"}
},
"required": ["city"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "get_weather":
city = arguments["city"]
# 実際はAPIを叩くが、ここではダミーレスポンス
return [TextContent(type="text", text=f"{city}の天気: 晴れ、気温22℃")]
async def main():
async with stdio_server() as streams:
await app.run(*streams)
if __name__ == "__main__":
asyncio.run(main())
このサーバーを起動してClaude Desktopの設定ファイル(claude_desktop_config.json)に登録すると、Claudeがget_weatherツールを使えるようになります。設定はシンプルで、コマンドとその引数を記述するだけです。
実装のポイントはinputSchemaの設計です。AIはこのスキーマを見てどういう引数を渡せばよいかを判断します。説明文(description)が曖昧だとAIが誤った使い方をすることがあるため、ツールの目的と各パラメータの意味を具体的に記述することが重要です。
セキュリティ上の注意点
MCPはAIに外部システムへのアクセス権を与えるものなので、セキュリティは設計段階から考慮しなければなりません。
まず最小権限の原則を徹底しましょう。MCPサーバーは本当に必要な操作だけを公開し、不要な書き込み権限や削除権限を持たせないようにします。読み取りで十分な場面にも書き込みツールを定義してしまうと、AIが意図しない変更を加えるリスクが生まれます。
次に入力バリデーションを忘れないことです。AIから渡される引数はJSON Schemaで型検証できますが、それだけでは不十分な場合があります。たとえばファイルパスを受け取るツールでは、パストラバーサル攻撃への対策として、アクセスを許可するディレクトリを明示的に制限する処理が必要です。
また、プロンプトインジェクションへの警戒も必要です。外部のデータソース(Webページやユーザー入力など)を取得してAIに渡す際、その内容に悪意ある指示が含まれている可能性があります。取得したデータをそのままAIに渡すのではなく、コンテキストとして明確に区別して渡す設計が求められます。
MCPエコシステムの現状と展望
2025年時点で、MCPのエコシステムは急速に拡大しています。
| カテゴリ | 代表的なMCPサーバー |
|---|---|
| 開発ツール | GitHub、GitLab、Jira |
| コミュニケーション | Slack、Microsoft Teams |
| データ・ストレージ | Google Drive、Notion、PostgreSQL |
| 観測・監視 | Datadog、Sentry |
| ブラウザ操作 | Puppeteer、Playwright |
特に注目すべきは、VSCodeやJetBrainsなどの主要IDEがMCPクライアント機能を組み込む動きが始まっていることです。エディタ上でAIエージェントが直接コードベースを分析し、テストを実行し、PRを作成する、という開発体験が現実のものになりつつあります。
Anthropicはこのプロトコルをオープン化しており、GoogleやMicrosoftなどの主要プレイヤーも採用を検討しているとされています。事実上の業界標準になる可能性は十分にあり、今のうちにMCPを理解し実装経験を積むことは、エンジニアとしての市場価値向上に直結します。
まとめ
MCPはAIと外部ツールの連携を標準化することで、これまでの断片的な実装を統一的なエコシステムへと変えようとしています。プロトコルの仕様はシンプルで、PythonやTypeScriptのSDKを使えば数十行のコードでサーバーを実装できます。セキュリティへの配慮を忘れずに、まずは小さなユースケースから試してみることをお勧めします。AIエージェント時代の到来に備えて、MCPを自分のツールキットに加えておきましょう。