AIエージェントとシステムをつなぐMCP入門(イントロダクション)

| 5 min read
Author: masato-ubata masato-ubataの画像

はじめに

#

本シリーズでは、MCP(Model Context Protocol)の基本から実装まで段階を分けて解説します。
「AIエージェントに社内システムや外部APIの知識を与えたい」という方へ向けた内容になります。

今回はMCPそのものについて説明します。
今後、トランスポート(stdio, Streamable HTTP)ごとの実装、MCPの自動生成などへの展開を予定しています。

なぜMCPが必要なのか

#

AIエージェント(Claude、GPT-4、Geminiなど)は、膨大な知識を持っていますが「今この瞬間のデータ」や「社内システムの情報」には直接アクセスできません。
たとえば「最新の受注状況」や「在庫数」をAIに聞いても、学習データに含まれていなければ答えられません。

こうした「知識の壁」を越えるための仕組みがMCPです。
MCPを使うことで、AIエージェントが社内外のシステムやデータベースと安全に連携できます。
併せて、認証や認可(アクセス制御)が自身の方式に統合できるように検討するのが重要な課題です。

MCPとは

#

AIエージェントが外部サービスと通信するための仕様で、2024/11にAnthropic社によって初版がリリースされました。(公式サイト
MCPを使用することで、AIエージェントは外部サービスの機能を効果的に利用できます。
MCPサーバーは、AIエージェントが外部ツールやデータソースと通信するため、MCPプロトコルを実装したサーバーを指します。
MCPクライアントは、AIエージェントなどのMCPサーバー利用者を指します。

graph LR
  Agent[AIエージェント]
  MCP[MCPサーバー]
  API1[受注/社内サービス]
  API2[天気API/社外]
  DB[社内DB]

  Agent -- "MCP/HTTP(JSON-RPC)" --> MCP
  MCP -- "REST/HTTP" --> API1
  MCP -- "外部API" --> API2
  MCP -- "SQL" --> DB

※MCPは「AIエージェントと社内外サービスをつなぐハブ」のような役割を果たします。

項目 MCP
プロトコル JSON-RPC 2.0 over stdio または HTTP/SSE(Streamable HTTP)
データ形式 JSON (JSON-RPC 2.0)
エンドポイント 統一エンドポイント(/mcp のみ)
操作 JSON-RPCメソッド(tools/list, tools/call
エラー JSON-RPC Error(code, message)
SSE(Server-Sent Events)とは

HTTP接続を維持したまま、サーバーからイベントを逐次送信する仕組み。(text/event-stream
MCPでは、ツールの呼び出し結果やストリームレスポンスを段階的に返す用途で利用されます。

MCPサーバーの主な役割

#

MCPサーバーが担う主な役割は下記の通りです。
BFFのMCPクライアント版のような役割と言えます。

  • プロトコル変換(MCP⇔REST)
  • 認証・認可
  • 流量制限
  • 監査ロギング
  • ルーティング
  • エラーハンドリング
  • レスポンスの変換、合成

MCPサーバーによる効果

#

AIエージェントは、学習データに含まれていない最新データや外部データは活用できません。
MCPサーバーで外部ツールやデータソースにアクセスできるツールを公開することで、リアルタイムデータにもとづいて返答できるようになります。

sequenceDiagram
  actor User
  actor Agent as AIエージェント
  participant MCP as MCPサーバー
  participant API as 受注サービス

  note over User, Agent: MCPなし
  User->>+Agent: 受注番号O001の状況を教えて
  Agent-->>-User: 受注番号「O001」の状況を確認する手段がありません。担当の受注管理部門にお問い合わせください。

  note over User, Agent: MCPあり
  User->>+Agent: 受注番号O001の状況を教えて。調べる際はget_orderを使って。
    Agent->>+MCP: 受注取得ツール呼び出し<br>get_order(order_id="O001")
      MCP->>+API: 受注取得APIリクエスト<br>GET /orders/O001
      API-->>-MCP: 受注を返却<br>{ "order_id": "O001", "status": "shipped", ... }
    MCP-->>-Agent: 受注を返却<br>{ "jsonrpc": "2.0", "result": "{ "order_id": "O001", "status": "shipped", ... }", "id": 1 }
  Agent-->>-User: 受注O001の状況は発送済みです

MCPの活用例

  • AIチャットボットが「受注番号O001の出荷状況を教えて」と聞かれたとき、MCP経由で社内の受注管理システムに問い合わせて最新情報を返す
  • 社内FAQボットが、MCPを通じて人事システムや勤怠データベースから必要な情報を取得し、社員の質問に答える
  • 外部API(天気、為替レートなど)と連携し、AIがリアルタイムなデータをもとにアドバイスを行う

トランスポート(通信方式)の種類

#

MCPのトランスポートにはstdioStreamable HTTPがあります。

stdio(標準入出力)

#

MCPクライアント(AIエージェントなど)がMCPサーバーをサブプロセスとして起動し、ローカル環境で通信する方式です。

  • 通信
    • データ形式: 改行区切りのJSON-RPCメッセージ。改行を許容するため、メッセージに改行を含めることはできません。
    • データ送受信: 標準入出力(stdin/stdout)を利用します。
    • セッションの終了: クライアントが入力ストリームを閉じるか、プロセスを終了する。
  • 用途
    • 個人のPC上で動くAIエージェントにローカルリソース(ファイルやツール)を操作させる。

Streamable HTTP

#

MCPサーバーは独立したプロセスとして稼働し、単一のHTTPエンドポイントで複数のMCPクライアントからの接続を受け付ける通信方式です。

  • 通信
    • POSTとSSEの組み合わせ: クライアントからのリクエストはPOSTで送信し、サーバーからのレスポンスや通知はSSEを利用してストリーミング配信します。
    • 非同期・準双方向通信: GETを使って独立した受信ストリームを開いておくことで、サーバーから任意のタイミングで自発的に通知を送ることが可能です。
    • 回復と状態管理: ネットワークが切断されてもLast-Event-IDを用いて途中から再接続できる機能や、MCP-Session-Idヘッダーを使ってセッション管理する機能が備わっています。
  • 用途
    • リモートサーバーでの利用: ネットワーク越しに配置されたサーバーの機能(クラウド上のデータベースや外部APIなど)を利用する場合に適しています。
    • 複数クライアントからの利用: 1つのMCPサーバーを複数のMCPクライアントから利用したい場合、Webサービスのような構成で活躍します。
`MCP-Session-Id`

クライアントとサーバー間のやり取り(セッション)を管理するIDのこと。

Streamable HTTPにおいて、サーバーは初期化時にセッションID(UUIDやJWTなど)を発行します。
クライアントは、これ以降のすべてのHTTPリクエスト(POSTやGET)にMCP-Session-Idヘッダーとしてこの値を含める必要があります。

Last-Event-ID

セッション内で開かれたSSEストリーム通信の連続性を保証するIDのこと。

サーバーからクライアントへメッセージを送るSSEストリーム上の各イベントにはIDが付与されます。
ストリームが切断された際、クライアントは再接続時にLast-Event-IDヘッダーを用いて「最後に受け取ったイベントID」をサーバーに伝えることで中断したところからストリームを再開できます。

今後の展開

#

本シリーズでは、MCPの基本から実践的な実装方法を解説します。
トランスポートごとの違い、自動生成ツールの活用など、段階的に解説していく予定です。
「AIエージェントとシステムの連携をもっと身近に」するための内容を目指します。
次回もぜひご期待ください。

豆蔵では共に高め合う仲間を募集しています!

recruit

具体的な採用情報はこちらからご覧いただけます。