MCP(Model Context Protocol)が97Mインストールを超えた。プロトコル戦争は終わった。
でも、正直に言う。この数字を見てから、「で、自分は何をすればいいんだ?」と思った開発者は多いんじゃないか。97Mという規模感は確かに重要だが、それは「採用が広がった」という話だ。「あなたが今週やるべきこと」は別の話だ。
この記事では、MCPが標準になったあと、開発者にとって何が変わり、今何を作るべきかを時系列で整理する。
2024年11月: ゼロからのスタート、月間約200万DL
AnthropicがMCPをオープンソースで公開した。当時の反応は、AIコミュニティの一部での「面白そう」程度だった。
技術的な出発点はこうだ。MCPはJSON-RPC 2.0をベースとし、stdioトランスポート(ローカル)とHTTP+SSEトランスポート(リモート)の2つをサポートした。AIアプリケーションが外部ツール・データソースに繋がるための「標準の配線方法」を提案した。
それまでの状況は、開発者なら身に沁みているはずだ。OpenAIのfunction calling、AnthropicのTool Use、GoogleのFunction Declarations——それぞれ仕様が違う。同じツールをマルチプロバイダーで使おうとすると、統合コードをN倍書く必要があった。MCPはその「M×N問題」をM+Nに変えようとした。
2025年Q1〜Q3: エコシステムの急速な充填
MCP採用の初期は主にAnthropicエコシステムの中だった。Claude Desktop、Claude Code、そして公式SDKが整備された。
同時期に、コミュニティがMCPサーバーを大量に作り始めた。GitHubのMCPサーバーリポジトリが乱立し、Filesystem、Git、PostgreSQL、Slack、Notion——よく使うツールの基本的なMCPサーバーが揃った。
この段階での開発者にとっての意味: まだ「アーリーアダプターの実験場」。プロダクションへの採用は時期尚早とされていた。主なリスクは仕様変更への不安と、サーバー品質のばらつきだった。
2025年12月: Linux財団への移管、ゲームチェンジが起きた
AnthropicがMCPをLinux財団傘下のAgentic AI Foundation(AAIF)に寄贈した。このタイミングを境に、MCPの位置づけが「Anthropicのプロトコル」から「業界標準」に変わった。
なぜこれが重要か。Linux財団の傘下に入ることは、特定ベンダーへの依存リスクが実質ゼロになることを意味する。オープンガバナンス下での標準化は、企業のIT部門が採用を承認するための「お墨付き」になる。
実際、この直後からOpenAI、Google、Microsoft、AWS、Cloudflareが順次MCP対応を発表した。競合プロバイダーがMCPに乗ったことで、プロトコルの中立性が証明された。
2026年3月25日: 97Mインストール突破、エンタープライズ本番採用が始まった
97M月間SDKダウンロードという数字は、単なるダウンロード数ではない。企業のCI/CDパイプラインに組み込まれた回数の積み重ねだ。
同時期に起きていたこと:
- Q1 2026に企業のAIエージェント展開がパイロットから本番に移行し始めた
- MCP対応サーバーが5,800本以上に(データベース、CRM、クラウド、DevToolsをカバー)
- OpenAIが旧Assistants APIを非推奨化し、mid-2026のサンセットを発表(MCPへの移行を促進)
- Fortune 500の28%が本番環境でMCPを採用していると推定
これは「標準の収束」を意味する。新しいツール統合を作るとき、MCP以外の選択肢を選ぶ理由は急激に少なくなった。
| 時期 | 里程標 | 月間DL数 | 開発者への意味 |
|---|---|---|---|
| 2024年11月 | MCP公開 | 約200万 | 実験可能なプロトコル登場 |
| 2025年Q2 | コミュニティサーバー1000本超え | 約1500万 | ツールが揃い始めた |
| 2025年12月 | Linux財団移管 | 約3500万 | 企業採用の心理的障壁消滅 |
| 2026年3月 | 97M突破 | 97M | プロダクション採用が当たり前に |
97M突破後: 本当の競争が始まった
プロトコルが標準化された後、何が起きるか。インターネットの歴史を参照すると分かる。TCP/IPが標準になった後、競争はHTTPサーバーに移り、その後Webアプリケーション、さらにクラウドに移った。
MCPも同じ構造だ。プロトコル自体は標準化された。これからの競争は「何を繋ぐか」に移る。
現在の空白地帯は明確だ:
- 社内プロプライエタリシステム向けサーバー: デプロイパイプライン、フィーチャーフラグ管理、内部ナレッジベース——公開されているサーバーでは対応できない、各企業固有のシステムのMCPサーバーはほぼ存在しない
- 業界垂直向けサーバー: 医療の電子カルテシステム、法律の判例データベース、金融の規制データ——汎用サーバーでは対応できない業界固有の接続
- 複合サーバー: 複数のデータソースを束ねてコンテキストを構成するアグリゲーション層
既存のFunction Callingコードをどうやってすぐ活かすか
「MCPが標準になったなら、今まで書いたFunction Callingコードは捨てるのか?」という声をよく聞く。答えはNoだ。
MCPサーバーの内部でFunction Callingの仕組みを再利用できる。以下は既存のFunction Calling実装をMCPサーバーとして薄くラップする例だ:
# 既存のFunction Calling実装をMCPサーバーとして公開する
# 動作環境: Python 3.11+, mcp>=1.0
# pip install mcp
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import asyncio
import json
server = Server("legacy-tools-bridge")
# ===== 既存コード(変更なし)=====
def search_knowledge_base(query: str, top_k: int = 5) -> list[dict]:
"""既存のベクトル検索実装(変更不要)"""
# 実際は既存の検索ロジックをそのまま使う
return [{"doc": f"結果{i}: {query}に関する情報", "score": 0.9 - i*0.1} for i in range(top_k)]
def create_ticket(title: str, priority: str, assignee: str) -> dict:
"""既存のチケット作成処理(変更不要)"""
return {"ticket_id": "TICKET-001", "status": "created", "title": title}
# ===== 既存コードここまで =====
# MCPアダプター層(追加するだけでよい)
@server.list_tools()
async def list_tools():
return [
Tool(
name="search_knowledge_base",
description="社内ナレッジベースを検索する",
inputSchema={
"type": "object",
"properties": {
"query": {"type": "string", "description": "検索クエリ"},
"top_k": {"type": "integer", "description": "取得件数", "default": 5}
},
"required": ["query"]
}
),
Tool(
name="create_ticket",
description="サポートチケットを作成する",
inputSchema={
"type": "object",
"properties": {
"title": {"type": "string"},
"priority": {"type": "string", "enum": ["low", "medium", "high"]},
"assignee": {"type": "string"}
},
"required": ["title", "priority", "assignee"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "search_knowledge_base":
results = search_knowledge_base(**arguments)
return [TextContent(type="text", text=json.dumps(results, ensure_ascii=False))]
elif name == "create_ticket":
ticket = create_ticket(**arguments)
return [TextContent(type="text", text=json.dumps(ticket, ensure_ascii=False))]
raise ValueError(f"未知のツール: {name}")
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream, server.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
このアプローチの利点は、既存のビジネスロジックを一切変更せずにMCP対応にできる点だ。MCPサーバーは「薄いアダプター」として機能し、Claude Desktop・Claude Code・OpenAIエージェントSDKなど、あらゆるMCPクライアントから同じツールを使えるようになる。
今週やるべき3つのこと
抽象的な話はここまでにする。具体的なアクションに落とす。
1. 既存の統合コードをインベントリ化する(2時間)
現在のプロジェクトで「AIがツールにアクセスするために書いたカスタムコード」をリストアップする。provider固有のfunction calling定義、カスタムAPIラッパー、ツール実行のグルーコード——これらがMCPサーバーへの移行候補だ。
2. 自分のスタックに該当するMCPサーバーを探す(1時間)
5,800本以上のサーバーがある。MCP公式サーバーリストを確認し、現在のツールスタック(データベース、Slack、GitHub等)でMCPサーバーが存在するか確認する。あれば、カスタム実装は不要だ。
3. 社内固有システムへの接続を1本作ってみる(1日)
既存サーバーで対応できない社内システムを1つ選び、MCPサーバーを作ってみる。Python SDKなら以下が最小構成だ:
# Python MCPサーバー最小実装例
# 動作環境: Python 3.11+, mcp>=1.0
# pip install mcp
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import asyncio
server = Server("my-internal-tool")
@server.list_tools()
async def list_tools():
return [
Tool(
name="get_deployment_status",
description="社内デプロイパイプラインの状態を取得",
inputSchema={
"type": "object",
"properties": {
"environment": {"type": "string", "enum": ["staging", "production"]}
},
"required": ["environment"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict):
if name == "get_deployment_status":
env = arguments["environment"]
# ここに実際の内部API呼び出しを書く
# result = internal_api.get_status(env)
return [TextContent(type="text", text=f"{env}環境: デプロイ正常")]
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream, server.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
# 注意: 本番環境で使用する前に、必ずテスト環境で動作確認してください。
【要注意】MCPを採用するときの落とし穴
失敗1: 既存のREST APIをそのままMCPサーバーでラップする
❌ 全APIエンドポイントを機械的にMCPツールに変換する
⭕ AIが実際に使う可能性のある操作だけをツールとして定義する
なぜ重要か: ツールが多すぎると、AIがどのツールを使えばいいか判断できなくなる。30ツールを超えるMCPサーバーはツールサーチが必要になる。「何でもできる」より「明確に何かに特化している」方が使いやすいサーバーになる。
失敗2: 認証と権限管理を後回しにする
❌ 開発用のAPIキーをMCPサーバーにハードコードしたままにする
⭕ 環境変数とシークレットマネージャーを使い、最小権限原則に従って認証を設計する
なぜ重要か: MCPサーバーはAIが呼び出す。AIが「本来アクセスすべきでないデータ」にアクセスできる状態は、プロンプトインジェクション攻撃への直接的な脆弱性になる。
失敗3: ローカルstdioだけで完結させる
❌ stdioトランスポートのみで実装し、チーム共有を想定しない
⭕ 早期からHTTP+SSEトランスポートを視野に入れて設計する
なぜ重要か: チームが同じMCPサーバーを使う場合、各マシンにサーバーをインストールするか、中央サーバーとして運用するかを選択する必要がある。後者の場合はHTTPトランスポートが必要だ。
参考・出典
- MCP Hit 97 Million Installs. The Protocol War Is Over. — DEV Community(参照日: 2026-04-11)
- Anthropic’s Model Context Protocol Hits 97 Million Installs — AI Unfiltered(参照日: 2026-04-11)
- Function Calling vs. MCP vs. A2A — Zilliz Blog(参照日: 2026-04-11)
- Model Context Protocol 公式サイト(参照日: 2026-04-11)
- MCP Hits 97M Downloads — Digital Applied(参照日: 2026-04-11)
MCPの基本概念から始めたい方は、AIエージェント構築完全ガイドで全体像を確認してください。
あわせて読みたい:
- MCP完全ガイド|AIエージェントのツール連携を標準化する — MCPの基本概念と最初のサーバー構築
- FastMCPでPython MCPサーバーを作る — より高速なMCPサーバー実装方法
この記事はAIgent Lab編集部がお届けしました。