MCP (Model Context Protocol)：SSEサーバーの実装と活用


**目次**
- [1. MCPとSSEサーバーの基礎](#1-mcpとsseサーバーの基礎)
  - [1.1 MCPとは](#11-mcpとは)
  - [1.2 SSEサーバーの特徴](#12-sseサーバーの特徴)
  - [1.3 MCPにおけるSSEの役割](#13-mcpにおけるsseの役割)
- [2. マルチサーバークライアントの実装](#2-マルチサーバークライアントの実装)
  - [2.1 LangChain Multi MCP Clientの概要](#21-LangChain-multi-mcp-clientの概要)
  - [2.2 実装手順](#22-実装手順)
  - [2.3 クライアント動作検証](#23-クライアント動作検証)
- [3. MCPサーバーのデプロイ](#3-mcpサーバーのデプロイ)
  - [3.1 デプロイオプション](#31-デプロイオプション)
  - [3.2 認証と認可](#32-認証と認可)
  - [3.3 ロギングとモニタリング](#33-ロギングとモニタリング)
- [4. MCPサーバーの探し方と利用方法](#4-mcpサーバーの探し方と利用方法)
  - [4.1 awesome-mcp-serversリポジトリ](#41-awesome-mcp-serversリポジトリ)
  - [4.2 Playwright MCPサーバーの統合例](#42-playwright-mcpサーバーの統合例)
- [5. 実践的な応用例](#5-実践的な応用例)

## 1. MCPとSSEサーバーの基礎

### 1.1 MCPとは

MCP (Model Context Protocol) は、AIモデルが外部ツールやサービスとインタラクションするための標準プロトコルです。このプロトコルにより、AIエージェントは以下のことが可能になります：

- 利用可能なツールを発見する
- 適切なパラメータでツールを呼び出す
- ツールからの結果を処理する

MCPは基本的に1対1の接続モデルに基づいていますが、この流れでは複数のMCPサーバーに接続する方法を学びます。

```plantuml
@startuml
package "AIエージェント環境" {
  [LLM] as llm
  [MCP Client] as client
  
  llm --> client : 利用
}

cloud "MCPサーバー群" {
  [Math Server] as math
  [Weather Server] as weather
  [Database Server] as db
  [Browser Server] as browser
}

client --> math : STDIOトランスポート
client --> weather : SSEトランスポート
client --> db : SSEトランスポート
client --> browser : SSEトランスポート

@enduml
```

### 1.2 SSEサーバーの特徴

SSE (Server-Sent Events) は、サーバーからクライアントへの一方向のリアルタイム通信を可能にする技術です。SSEサーバーには以下の特徴があります：

- HTTP接続上でサーバーからクライアントへの更新をプッシュできる
- 接続が維持されるため、ストリーミング更新に適している
- シンプルなプロトコルで実装が容易
- ファイアウォールに優しい（標準HTTPポートを使用）

### 1.3 MCPにおけるSSEの役割

MCPエコシステムにおいて、SSEは以下の役割を果たします：

- AIエージェントとツール間のリアルタイム通信を実現
- クラウドにデプロイされたMCPサーバーとのシームレスな連携
- 大規模な組織内でのツール共有の促進

```plantuml
@startuml
participant "AIエージェント" as agent
participant "MCPクライアント" as client
participant "SSEサーバー" as server
participant "外部サービス" as external

agent -> client : ツールリクエスト
client -> server : HTTP接続
activate server
server -> external : データリクエスト
external --> server : データ返却
server --> client : SSEイベントストリーム
client --> agent : ツール結果

loop 継続的更新の場合
  external --> server : 新データ
  server --> client : SSEイベント
  client --> agent : 更新
end
deactivate server
@enduml
```

## 2. マルチサーバークライアントの実装

### 2.1 LangChain Multi MCP Clientの概要

LangChain Multi MCP Clientは、複数のMCPサーバーに同時に接続できるクライアントライブラリです。これにより：

- 複数の異なるツールを一つのAIエージェントで利用可能
- 異なるトランスポート（STDIO、SSEなど）を透過的に処理
- 異なるMCPサーバーへの接続管理を抽象化

```plantuml
@startuml
package "アプリケーション" {
  [LLM] as llm
  [LangChain Multi MCP Client] as multi
  
  llm --> multi : 利用
}

package "LangChain Multi MCP Client" {
  [STDIO Client] as stdio
  [SSE Client] as sse
  
  multi --> stdio : 管理
  multi --> sse : 管理
}

cloud "MCPサーバー群" {
  [Math Server] as math
  [Weather Server] as weather
}

stdio --> math : 接続
sse --> weather : 接続

@enduml
```

### 2.2 実装手順

以下は、STDIOベースの数学サーバーとSSEベースの天気サーバーに接続するマルチサーバークライアントの実装例です：

```python
from LangChain.mcp.adapters.client import MultiServerMcpClient
from langchain.agents import create_react_agent
from langchain.chat_models import ChatOpenAI
from dotenv import load_dotenv
import asyncio

# 環境変数をロード
load_dotenv()

# LLMの初期化
llm = ChatOpenAI()

async def main():
    # マルチサーバークライアントの設定
    async with MultiServerMcpClient({
        "math": {
            "command": "python",
            "args": ["servers/math.py"]
        },
        "weather": {
            "url": "http://localhost:8000",
            "transport": "sse"
        }
    }) as client:
        # ReactエージェントでLLMとクライアントを接続
        agent = create_react_agent(llm, client.get_tools())
        
        # エージェントにクエリを送信
        result = await agent.ainvoke({"messages": [{"content": "What is the weather in San Francisco?"}]})
        print(result)

# 非同期実行
asyncio.run(main())
```

:::note info
マルチサーバークライアントの設定では、辞書形式で各サーバーの接続情報を指定します。STDIOサーバーはコマンドと引数、SSEサーバーはURLとトランスポート情報を提供します。
:::

### 2.3 クライアント動作検証

クライアントを実行すると、以下のような動作が期待できます：

1. 数学的質問（例：「2+2は？」）の場合、STDIOベースの数学サーバーにリクエストが送信される
2. 天気に関する質問（例：「サンフランシスコの天気は？」）の場合、SSEベースの天気サーバーにリクエストが送信される
3. サーバーログでは、セッションごとのリクエストとレスポンスが確認できる

## 3. MCPサーバーのデプロイ

### 3.1 デプロイオプション

MCPサーバーは様々な環境にデプロイできます：

```plantuml
@startuml
actor 開発者
actor "企業ユーザー" as user

cloud "パブリッククラウド" {
  [公開MCPサーバー] as public
}

cloud "エンタープライズクラウド" {
  [プライベートMCPサーバー] as private
}

node "ローカル開発環境" {
  [ローカルMCPサーバー] as local
}

開発者 --> local : 開発・テスト
開発者 --> public : デプロイ
開発者 --> private : デプロイ

user --> public : 利用
user --> private : 利用(認証あり)

@enduml
```

- **ローカル開発環境**: 開発やテスト用
- **パブリッククラウド**: 広く一般に公開するツール用
- **エンタープライズクラウド**: 組織内限定のツール用

### 3.2 認証と認可

現在のMCPプロトコルでは認証・認可機能は限定的ですが、今後実装される予定です：

- ユーザー認証による制限アクセス
- ロールベースアクセス制御
- 組織内でのツールアクセス管理

:::note warn
エンタープライズ環境では、認証・認可メカニズムの実装は不可欠です。現時点ではアプリケーションレベルでの対応が必要な場合があります。
:::

### 3.3 ロギングとモニタリング

SSEサーバーは優れたロギング機能を備えています：

- セッションごとのリクエスト・レスポンスの追跡
- ツール呼び出しの監視
- デバッグとトラブルシューティング用の情報

例えば、サーバーログでは以下のような情報が確認できます：
```
This is a log from the SSE server
POST /tools - List tools request
POST /call - Tool call request for get_weather
```

## 4. MCPサーバーの探し方と利用方法

### 4.1 awesome-mcp-serversリポジトリ

[awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)は、様々なカテゴリのMCPサーバーを集めたリポジトリです：

```plantuml
@startuml
package "Awesome MCP Servers" {
  package "データベース" {
    [MySQL MCP]
    [PostgreSQL MCP]
    [Supabase MCP]
  }
  
  package "コミュニケーション" {
    [Email MCP]
    [WhatsApp MCP]
    [Telegram MCP]
  }
  
  package "ブラウザ自動化" {
    [Playwright MCP]
    [Puppeteer MCP]
  }
  
  package "コマンドライン" {
    [Run Command MCP]
    [iTerm MCP]
  }
}
@enduml
```

このリポジトリは以下の特徴を持ちます：

- 各MCPサーバーに実装言語（Python、TypeScriptなど）のバッジがある
- ローカル実行かクラウドベースかを示すスコープ情報
- OS互換性（macOS、Windows、Linux）の情報
- 公式実装かコミュニティ実装かの区別

:::note info
GitHub以外にも、このリポジトリのSaaS版ウェブサイトも提供されており、ウェブインターフェースから検索・閲覧が可能です。
:::

### 4.2 Playwright MCPサーバーの統合例

Microsoft公式のPlaywright MCPサーバーを利用する例：

1. リポジトリをクローン
   ```bash
   git clone https://github.com/microsoft/playwright-mcp
   ```

2. Cursorプロジェクトに統合
   - `.cursor`ディレクトリ作成
   - `mcp.json`ファイル作成
   - 以下のような設定を追加

   ```json
   {
     "mcps": [
       {
         "name": "playwright",
         "command": "npx playwright-mcp",
         "transport": "stdio"
       }
     ]
   }
   ```

3. Cursor内でのエージェントモードで利用可能になる

## 5. 実践的な応用例

MCPサーバーの実践的な応用例として、以下のようなケースが考えられます：

- **ウェブブラウジング**: PlaywrightやPuppeteer MCPを使用してAIにウェブ閲覧能力を付与
- **データベース操作**: MySQLやPostgreSQLのMCPを使用してデータ検索や更新
- **コミュニケーション**: EmailやWhatsApp MCPを使用してメッセージ送信
- **データ分析**: 各種データ分析ツールとの連携

例えば、Playwrightを使用したウェブ閲覧の例：

1. エージェントに「cursor.directoryにアクセスして、5つのMCPサーバー例を教えて」と指示
2. エージェントはPlaywright MCPを使用してブラウザを起動
3. 指定サイトにアクセスして情報を収集
4. 収集した情報を元にレスポンスを生成

## まとめ

MCPとSSEサーバーの組み合わせは、AIエージェントに強力なツール連携機能をもたらします。LangChain Multi MCP Clientを使用することで、複数のサーバーに簡単に接続でき、様々なツールの能力をAIに付与できます。

SSEサーバーのクラウドデプロイにより、エンタープライズレベルでの活用も可能になります。今後、認証・認可機能が強化されれば、よりセキュアな環境での利用が期待できます。

様々なMCPサーバーを探し、統合することで、AIエージェントの可能性は無限に広がります。ぜひawesome-mcp-serversリポジトリを活用して、あなたのプロジェクトに最適なMCPサーバーを見つけてみてください。

## 練習問題

1. MCPプロトコルの主な目的は何ですか？
2. SSEサーバーの利点を3つ挙げてください。
3. LangChain Multi MCP Clientを使用する利点は何ですか？
4. MCPサーバーをクラウドにデプロイする際の考慮事項を説明してください。
5. awesome-mcp-serversリポジトリから、あなたのプロジェクトに役立ちそうなMCPサーバーを3つ選び、その理由を説明してください。