Model Context Protocol入門：AIをリアルワールドに接続する | 第4章：MCPの実践的な応用

## はじめに

これまでの第1章から第3章では、**Model Context Protocol（MCP）**の概要、動作仕組み、そしてサーバーの構築方法を学びました。MCPがAIを外部データやツールと標準化された方法で接続する強力なプロトコルであることを理解し、実際に簡単なサーバーを動かしてみました。今回は、MCPが**実世界でどのように使われているか**、具体的な応用例を通じてその可能性を探ります。

この第4章では、ソフトウェア開発、ビジネスワークフロー、研究、クリエイティブ分野でのMCPの活用例を紹介します。コード例や実際のシナリオを交え、MCPがどのようにAIを「単なるチャットボット」から「真のアシスタント」に変えるかを明らかにします。さっそく始めましょう！

## 1. ソフトウェア開発でのMCP：コードを賢く書く

ソフトウェア開発は、MCPの最も強力な応用分野の一つです。MCPを活用することで、AIは開発者のコンテキストを深く理解し、正確で実用的なコード提案を行えます。

### 応用例：Zed Editorでのコード補完
- **シナリオ**：あなたはZed Editor（MCP対応）を使ってWebアプリを開発中。プロジェクトには複数のファイル（`app.py`、`schema.sql`、APIドキュメント）がある。
- **MCPの役割**：
  1. ZedがMCPサーバーに接続し、プロジェクトフォルダやデータベーススキーマをリソースとして提供。
  2. AI（例：Claude）がこれらのリソースを参照し、ファイル間の依存関係やスキーマを理解。
  3. ユーザーが「ユーザーデータを取得するAPIを書いて」と入力すると、AIが以下のようなコードを提案：
  
```python
from flask import Flask, jsonify
import sqlite3

app = Flask(__name__)

@app.route('/users', methods=['GET'])
def get_users():
    conn = sqlite3.connect('database.db')
    cursor = conn.cursor()
    cursor.execute('SELECT id, name, email FROM users')
    users = cursor.fetchall()
    conn.close()
    return jsonify(users)
```

- **利点**：
  - **コンテキスト認識**：AIが`schema.sql`を基に正確なテーブル名や列名を提案。
  - **効率化**：カスタムプラグインを書くことなく、プロジェクト全体をAIが理解。
  - **拡張性**：GitHubやAPIドキュメントを追加リソースとして提供可能。

### コード例：MCPサーバーでプロジェクトコンテキストを提供
以下は、プロジェクトフォルダ全体をリソースとして提供するMCPサーバーの例です：

```python
from mcp import MCPServer
import os
import glob

class ProjectServer(MCPServer):
    def __init__(self, host, port, project_root):
        super().__init__(host, port)
        self.project_root = project_root
        self.register_resource("get_project_files", self.get_project_files)

    def get_project_files(self, params):
        try:
            # PythonとSQLファイルのみを対象
            patterns = ["*.py", "*.sql"]
            files = []
            for pattern in patterns:
                files.extend(glob.glob(os.path.join(self.project_root, pattern), recursive=True))
            file_contents = {}
            for file in files:
                with open(file, "r", encoding="utf-8") as f:
                    file_contents[file] = f.read()
            return {"status": "success", "files": file_contents}
        except Exception as e:
            return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    server = ProjectServer(host="localhost", port=8082, project_root="./my_project")
    print("プロジェクトMCPサーバーを起動中: http://localhost:8082")
    server.start()
```

このサーバーは、プロジェクト内の`.py`や`.sql`ファイルの内容をAIに提供し、コード補完やデバッグを支援します。

## 2. ビジネスワークフローでのMCP：作業を自動化

MCPは、ビジネス環境でも大きな価値を発揮します。Slack、Notion、Google Driveなどのツールと統合することで、AIが日常業務を自動化します。

### 応用例：SlackとNotionの連携
- **シナリオ**：チームがSlackでタスクを議論し、Notionでプロジェクト管理を行う。
- **MCPの役割**：
  1. MCPサーバーがSlackのメッセージ履歴とNotionのタスクデータベースをリソースとして提供。
  2. ユーザーがSlackで「新しいタスクを作成：明日のミーティング準備」と投稿。
  3. AIがメッセージを解析し、Notion APIを通じてタスクを自動追加。

- **実装の流れ**：
  - Slack APIでメッセージを取得（MCPリソース）。
  - Notion APIでタスクを作成（MCPツール）。
  - AIがプロンプトを基に適切なアクションを選択。

### コード例：Slackメッセージを処理するMCPサーバー
以下は、Slackのメッセージを取得するMCPサーバーの例です：

```python
from mcp import MCPServer
import slack_sdk

class SlackServer(MCPServer):
    def __init__(self, host, port, slack_token):
        super().__init__(host, port)
        self.client = slack_sdk.WebClient(token=slack_token)
        self.register_resource("get_messages", self.get_messages)

    def get_messages(self, params):
        channel = params.get("channel", "general")
        try:
            result = self.client.conversations_history(channel=channel, limit=10)
            messages = [
                {"user": msg["user"], "text": msg["text"], "ts": msg["ts"]}
                for msg in result["messages"]
            ]
            return {"status": "success", "messages": messages}
        except Exception as e:
            return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    import os
    token = os.getenv("SLACK_TOKEN")
    server = SlackServer(host="localhost", port=8083, slack_token=token)
    print("Slack MCPサーバーを起動中: http://localhost:8083")
    server.start()
```

- **セットアップ**：
  - SlackでBotトークンを作成し、環境変数`SLACK_TOKEN`に設定。
  - サーバーを起動し、Claudeに接続。
- **使用例**：
  Claudeに「#generalチャンネルの最新メッセージを教えて」と依頼すると、メッセージリストが返る。

このサーバーをNotion APIと組み合わせれば、タスク自動化がさらに強化されます。

## 3. 研究でのMCP：データへのリアルタイムアクセス

研究分野では、MCPを使ってAIが最新データや専門知識にアクセスできます。

### 応用例：ベクトルデータベースとの統合
- **シナリオ**：研究者がQdrant（ベクトルデータベース）を使って論文を管理。
- **MCPの役割**：
  1. MCPサーバーがQdrantに接続し、論文のベクトルデータやメタデータをリソースとして提供。
  2. 研究者が「最近のAI倫理に関する論文を要約して」と依頼。
  3. AIがQdrantから関連論文を取得し、要約を生成。

### コード例：Qdrantサーバー
以下は、Qdrantからデータを取得するMCPサーバーの例です：

```python
from mcp import MCPServer
from qdrant_client import QdrantClient

class QdrantServer(MCPServer):
    def __init__(self, host, port, qdrant_url):
        super().__init__(host, port)
        self.client = QdrantClient(qdrant_url)
        self.register_resource("search_papers", self.search_papers)

    def search_papers(self, params):
        query = params.get("query", "")
        collection = params.get("collection", "papers")
        try:
            results = self.client.search(
                collection_name=collection,
                query_vector=[0.1] * 768,  # 仮のベクトル
                query_filter={"must": [{"key": "text", "match": {"value": query}}]},
                limit=5
            )
            papers = [{"id": hit.id, "payload": hit.payload} for hit in results]
            return {"status": "success", "papers": papers}
        except Exception as e:
            return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    server = QdrantServer(host="localhost", port=8084, qdrant_url="http://localhost:6333")
    print("Qdrant MCPサーバーを起動中: http://localhost:8084")
    server.start()
```

- **セットアップ**：
  - Qdrantをローカルで起動。
  - サーバーをClaudeに接続。
- **使用例**：
  Claudeに「AI倫理の論文を探して」と依頼すると、関連論文のメタデータが返る。

## 4. クリエイティブ分野でのMCP：AIで創造を加速

MCPは、クリエイティブな作業にも応用可能です。

### 応用例：Blenderとの統合
- **シナリオ**：3DアーティストがBlenderでシーンを作成中。
- **MCPの役割**：
  1. MCPサーバーがBlenderのPython APIに接続。
  2. アーティストが「立方体を追加して赤く塗って」と依頼。
  3. AIがBlender APIを呼び出し、シーンを操作。

### コード例：Blenderサーバー
以下は、Blenderを操作するMCPサーバーの簡易版です：

```python
from mcp import MCPServer
import bpy

class BlenderServer(MCPServer):
    def __init__(self, host, port):
        super().__init__(host, port)
        self.register_tool("add_cube", self.add_cube)

    def add_cube(self, params):
        try:
            bpy.ops.mesh.primitive_cube_add(size=2, location=(0, 0, 0))
            cube = bpy.context.active_object
            material = bpy.data.materials.new(name="Red")
            material.diffuse_color = (1, 0, 0, 1)
            cube.data.materials.append(material)
            return {"status": "success", "message": "立方体を追加しました"}
        except Exception as e:
            return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    server = BlenderServer(host="localhost", port=8085)
    print("Blender MCPサーバーを起動中: http://localhost:8085")
    server.start()
```

- **注意**：BlenderのPython環境で実行する必要あり。
- **使用例**：
  Claudeに「Blenderで立方体を追加して」と依頼すると、シーンに赤い立方体が追加される。

## MCP応用の利点

これらの応用例から、MCPの以下の利点が見えてきます：
- **開発時間の短縮**：標準化された接続により、カスタムインテグレーションの負担が軽減。
- **高精度な出力**：コンテキストに基づくAIの回答が、より関連性が高く実用的。
- **多様なユースケース**：開発からクリエイティブまで、幅広い分野で活用可能。

## まとめと次へのステップ

この第4章では、MCPの実際の応用例を通じて、ソフトウェア開発、ビジネス、研究、クリエイティブ分野での可能性を探りました。MCPは、AIを単なるテキスト生成ツールから、データやツールと深く統合されたアシスタントに変える力を持っています。

次の第5章では、「MCPの未来」をテーマに、MCPがAIエコシステムに与える影響や、今後の発展の方向性を考察します。MCPの可能性にワクワクしている方は、ぜひ最終章もお楽しみに！

---

役に立ったと思ったら、「いいね」や「ストック」をしていただけると嬉しいです！次の章でまたお会いしましょう！