MCPとは何か、なぜ重要か

MCP(Model Context Protocol)は、AnthropicがAIアシスタントと外部ツールを接続するための標準プロトコルとして2024年末にオープンソースで公開した仕様だ。

なぜ「標準」が必要だったのか。従来、各AIアプリケーションが独自の方法で外部ツールを統合していた。SlackをClaude Codeに繋げたければClaude Code用のコードを書き、同じSlack機能をCursorやContinueに追加したければそれぞれ別の実装が必要だった。ツールが増えるほど重複実装が増え、メンテナンスのコストも増していく。

MCPはこの問題を「USB規格」のような統一コネクタで解決しようとしている。MCPサーバーとして一度実装すれば、MCPクライアントに対応したどのAIアプリからでも使える。

MCPのアーキテクチャ

MCPはクライアント・サーバーモデルを採用している。

MCPサーバーは、特定のサービスや機能を外部に提供するプロセスだ。「GitHubのPRを一覧表示する」「Slackにメッセージを送る」「ファイルシステムを読む」といった機能をMCPの仕様に沿って公開する。

MCPクライアントは、AIアシスタント(Claude Codeなど)が内包しているコンポーネントで、MCPサーバーに接続してツールを呼び出す。

ホストは、クライアントが動くアプリケーション本体だ。Claude Code、Cursor、VS Code拡張など、エンドユーザーが直接使うソフトウェアがこれにあたる。

この分離により、ツール開発者はサーバーを作るだけでよく、AIアプリの内部実装を知る必要がなくなる。

通信プロトコルの仕様

MCPはJSON-RPC 2.0をベースとした通信プロトコルを採用している。トランスポート層はstdio(標準入出力)かSSE(Server-Sent Events)の2種類をサポートする。

ローカルで動くMCPサーバーはstdioが主流だ。ホストがサーバープロセスを起動し、標準入出力でメッセージをやり取りする。

リモートのMCPサーバー(外部APIとして公開するケース)はHTTP+SSEを使う。

主要なメッセージタイプを整理する。

initialize — クライアントがサーバーに接続し、対応している機能を確認する。

tools/list — サーバーが提供するツールの一覧を取得する。ツール名、説明、入力スキーマが返ってくる。

tools/call — 特定のツールを呼び出す。引数はJSONで渡す。

resources/list / resources/read — ファイルやドキュメントなどのリソースを扱う。

prompts/list / prompts/get — サーバーが提供するプロンプトテンプレートを扱う。

既存ツールのMCP対応状況

2026年時点で、主要なツールのMCPサーバーはすでに多数公開されている。

Anthropicが公式に提供しているリファレンスサーバーには、ファイルシステム操作、GitHubアクセス、Webスクレイピング(Puppeteer)、Slack、Google Drive、PostgreSQLなどがある。これらは @modelcontextprotocol/server-* というパッケージ名でnpmに公開されている。

コミュニティ製のMCPサーバーも急増しており、Notion、Linear、Jira、AWS、Figma、Supabaseなど、主要なSaaSほぼ全てについて何らかのMCPサーバーが存在する状況だ。

Claude CodeでMCPサーバーを追加する

Claude CodeへのMCPサーバー追加は、設定ファイルにサーバーの起動コマンドを記述するだけだ。

プロジェクトレベルの設定なら .claude/settings.json を、グローバルな設定なら ~/.claude/settings.json を編集する。

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed/dir"]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "your-token-here"
      }
    }
  }
}

Claude Codeを再起動すると設定が読み込まれ、登録したMCPサーバーのツールが自動的に使えるようになる。/mcp コマンドで接続状況を確認できる。

自作MCPサーバーの開発

Python SDKを使った自作MCPサーバーの基本的な実装を示す。

pip install mcp
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types

app = Server("my-custom-server")

@app.list_tools()
async def list_tools():
    return [
        types.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呼び出しに置き換える
        weather_data = fetch_weather_api(city)
        return [types.TextContent(type="text", text=str(weather_data))]
    raise ValueError(f"Unknown tool: {name}")

async def main():
    async with stdio_server() as (read_stream, write_stream):
        await app.run(read_stream, write_stream, app.create_initialization_options())

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())

このファイルを weather_server.py として保存し、Claude Codeの設定に追加する。

{
  "mcpServers": {
    "weather": {
      "command": "python",
      "args": ["/path/to/weather_server.py"]
    }
  }
}

TypeScript SDKでの実装

TypeScript版のSDKも提供されており、Node.jsで動かす場合はこちらが使いやすい。

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  { name: "my-ts-server", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "calculate",
      description: "数式を計算する",
      inputSchema: {
        type: "object",
        properties: { expression: { type: "string" } },
        required: ["expression"]
      }
    }
  ]
}));

server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "calculate") {
    const result = eval(request.params.arguments.expression);
    return { content: [{ type: "text", text: String(result) }] };
  }
  throw new Error("Unknown tool");
});

const transport = new StdioServerTransport();
await server.connect(transport);

MCPの設計思想と今後の展開

MCPがオープンソースとして公開された背景には、AnthropicがAIエコシステムの標準を握ろうとする意図と、開放的なエコシステムを育てることでClaude自体の価値を高めようとする意図がある。

2026年時点では、CursorやContinue、Zedなど多くのAI開発ツールがMCPをサポートしており、「MCPサーバーを書けば主要なAIツール全てで使える」状態に近づいている。

OpenAIも独自の「プラグイン」仕様を持っていたが、MCPの普及を受けて互換性を検討する動きがある。AIツール統合の標準規格としてMCPが定着しつつある状況だ。

まとめ

MCPは、AIエージェントとツールの接続を標準化するプロトコルだ。ツール開発者にとって「一度書けばどこでも使える」状況を作り、AIアプリ開発者にとって「接続するだけで機能が増える」環境を実現する。

Claude Codeを使っているなら、まず公式のリファレンスサーバーをいくつか試してみるのが最初の一歩だ。ファイルシステムやGitHubとの連携を追加するだけで、日常の開発作業が大きく変わる体験ができる。