「AIエージェントキャッチアップ #13 - Model Context Protocol (MCP)」を開催しました

ジェネラティブエージェンツの大嶋です。

「AIエージェントキャッチアップ #13 - Model Context Protocol (MCP)」という勉強会を開催しました。

generative-agents.connpass.com

アーカイブ動画はこちらです。

youtube.com

Model Context Protocol (MCP)

今回は、Anthropicが公開した「Model Context Protocol (MCP)」について、公式ドキュメントを読んだり動かしたりしてみました。

MCPについての公式ブログはこちらです。

https://www.anthropic.com/news/model-context-protocolwww.anthropic.com

公式ドキュメントはこちらです。

modelcontextprotocol.io

今回のポイント

MCPの概要

MCPは、LLMアプリケーションと外部データなどを連携するためのプロトコルです。

LLMアプリケーションに対して、

  • リソース
  • プロンプト
  • ツール

の3つを接続することができます。

Quickstart

MCPの公式ドキュメントのQuickstartでは、ClaudeのデスクトップアプリからMCPを利用してSQLiteを扱う例が挙げられています。

modelcontextprotocol.io

macOSの場合、~/Library/Application Support/Claude/claude_desktop_config.jsonという設定ファイルに以下の設定を記述します。

{
  "mcpServers": {
    "sqlite": {
      "command": "uvx",
      "args": ["mcp-server-sqlite", "--db-path", "/Users/YOUR_USERNAME/test.db"]
    }
  }
}

すると、ClaudeのデスクトップアプリがSQLiteの「/Users/YOUR_USERNAME/test.db」というデータベースに接続できるようになります。

Quickstartを実行すると、以下の画像のように、ClaudeがSQLを実行しながらSQLiteのデータについて回答してくれました。

トラブルシューティング

実際にQuickstartを動かそうとしたときは、「Could not connect to MCP server sqlite」というエラーに遭遇しました。

macOSの場合、Claudeのデスクトップアプリは、MCPに関して~/Library/Logs/Claudeディレクトリにログを出力します。 今回は~/Library/Logs/Claude/mcp.logファイルを参照することでエラーの詳細を確認できました。

2024-12-09T03:14:03.954Z [error] Error in MCP connection to server sqlite: Error: spawn uvx ENOENT
    at ChildProcess._handle.onexit (node:internal/child_process:286:19)
    at onErrorNT (node:internal/child_process:484:16)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  errno: -2,
  code: 'ENOENT',
  syscall: 'spawn uvx',
  path: 'uvx',
  spawnargs: [Array]
}

これはuvxコマンドを実行する際のENOENTというエラーです。 私の環境でのuvxコマンドのインストール方法が影響しているようで、以下のようにuvxコマンドの絶対パスを指定するようにして解決できました。

{
  "mcpServers": {
    "sqlite": {
      "command": "/Users/YOUR_USERNAME/.local/bin/uvx",
      "args": ["mcp-server-sqlite", "--db-path", "/Users/YOUR_USERNAME/test.db"]
    }
  }
}

MCPの特徴

LLMがSQLiteのように外部ツールを操作できること自体はとくに真新しくありません。 OpenAIやAnthropicのAPIはFunction calling(Tool use)という機能を提供しており、今までも同様のことが実現できました。 また、OpenAIのGPTsにもOpenAPI仕様をもとに外部のツールと連携する機能があります。

これらと比較したMCPの特徴としては、以下の2つが挙げられます。

  1. OpenAPI仕様のような既存の仕様ではなく、LLMアプリに特化したプロトコルである
  2. ツールだけでなく、リソース・プロンプトの連携機能もある

(1)LLMアプリに特化したプロトコルである

MCPの仕様は以下のページで確認できます。

spec.modelcontextprotocol.io

MCPの仕様は、Function callingやGPTsのOpenAPI仕様連携よりも複雑になっています。

MCPでは単にLLMが外部の処理を呼び出すだけでなく、MCPのクライアント・サーバー間のネゴシエーションなども登場します。

OpenAPI仕様のような既存の仕様ではなく、LLMアプリに特化したプロトコルであると言えます。

なお、MCPではこのようなクライアント・サーバーを簡単に実装できるよう、PythonとTypeScriptのSDKが提供されています。

github.com

github.com

(2)リソース・プロンプトの連携機能もある

MCPは、Function callingやGPTsのOpenAPI仕様連携と異なり、ツール以外にリソースやプロンプトの連携機能も持っています。

たとえば、MCPのPython SDKのREADMEには、以下のようなサンプルが書かれています。

    :
from mcp.server import Server, NotificationOptions
    :
server = Server("example-server")

# Add prompt capabilities
@server.list_prompts()
async def handle_list_prompts() -> list[types.Prompt]:
    :
@server.get_prompt()
async def handle_get_prompt(
    name: str,
    arguments: dict[str, str] | None
) -> types.GetPromptResult:
    :

これはプロンプトを取得できるMCPサーバーの実装例です。

上記のコードをexample_server.pyといったファイルに保存して、~/Library/Application Support/Claude/claude_desktop_config.jsonに以下のように記述します。

{
    "example_prompts": {
      "command": "uv",
      "args": [
        "--directory",
        "<ディレクトリ>",
        "run",
        "python",
        "example_server.py"
      ]
    }
  }
}

すると、Claudeのデスクトップアプリでプロンプトを選択して使用できるようになります。

この仕組みは、社内でのプロンプトの共有などに活用できるはずです。

MCPがツールの統合に限らずリソース・プロンプトの統合も含んでいることは面白いと思いました。

次回のご案内

以上、今回は「Model Context Protocol (MCP)」をキャッチアップしました。

次回は「AIエージェントキャッチアップ #14 - LangGraph Agent Protocol」ということで、LangGraphの「Agent Protocol」がテーマです!

generative-agents.connpass.com

ご興味・お時間ある方はぜひご参加ください!

また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!