🙆‍♀️

簡単にMCPを実行できるMCP connectorを試す

に公開

通常、MCPサーバーを利用するにはそのクライアントアプリ(Claude Desktop、Cursor、Mastraなど)が必要です。
先ほどAnthropicから発表された MCP connector を使用すれば、AnthropicのメッセージAPIから直接MCPサーバーに接続できます。

使い方

早速試してみましょう。
今回はサンプルコードとしてPythonを利用します。

まずは必要なパッケージをインストールします。

pip install anthropic

環境変数を設定します。

ANTHROPIC_API_KEY=xxx

サンプルファイルです。

import os
import anthropic
import sys


def main():
    # 環境変数からキーを取得
    api_key = os.getenv("ANTHROPIC_API_KEY")
    if not api_key:
        raise ValueError("ANTHROPIC_API_KEY環境変数を設定してください。")

    # Client を初期化
    client = anthropic.Anthropic(
        api_key=api_key,
    )

    # コマンドライン引数から content を取得
    if len(sys.argv) < 2:
        print("ユーザメッセージを指定してください。")
        sys.exit(1)
    user_content = sys.argv[1]

    response = client.beta.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=1000,
        messages=[
            {
                "role": "user",
                "content": user_content,
            }
        ],
        mcp_servers=[
            {
                "type": "url",
                "url": "https://mcp.deepwiki.com/sse",
                "name": "deepwiki",
            },
            {
                "type": "url",
                "url": "https://xxxxx.workers.dev/mcp",
                "name": "my-mcp-worker",
            },
        ],
        betas=["mcp-client-2025-04-04"],
    )

    # レスポンス表示
    print("=== Claude の応答 ===")
    for content in response.content:
        if content.type == "text":
            print(content.text)
        elif content.type == "mcp_tool_use":
            print("tool use: ", content.name)


if __name__ == "__main__":
    main()

シンプルな構成にしました。MCP connector の特別な設定はmcp_serversbetasくらいです。
betasは現在は必須の項目なので特に気にせず追加しておいてください。

mcp_servevrsには以下の形式でMCPサーバーを指定します。

  "type": "url",
  "url": "https://example-server.modelcontextprotocol.io/sse",
  "name": "example-mcp",
  "tool_configuration": {
    "enabled": true,
    "allowed_tools": ["example_tool_1", "example_tool_2"]
  },
  "authorization_token": "YOUR_TOKEN"
}

上記3つは必須です。
typeは現在urlしか指定できません。つまりSSE形式かStremable HTTP形式しか対応していません。
考えてみればAnthropic APIという外部のツールを利用しているので、ローカルに立てるstdin形式のMCPサーバーが使えないのは当たり前ですね。

tool_configurationでは使用するツールを指定できます。
authorization_tokenは認証用のトークンです。

試してみる

では早速試してみましょう。
ちなみに今回のサンプルでは、SSE形式とStremable HTTP形式のMCPサーバーの両方を利用しています。

SSE形式はDeepWiki MCPを利用しています。
詳しくはこちらを御覧ください。

https://zenn.dev/nikechan/articles/b988cf067a8c56

Stremable HTTP形式はちょうどよかったものが見つからなかったので、azukiazusaさんのこちらの記事を参考にClaudeflareでMCPサーバーを用意しました。
dice_rollというサイコロを振るツールが提供されています。

まずは使えるツールについて聞いてみます。

-> % python main.py 使用できるツールを教えて下さい。

=== Claude の応答 ===
現在使用できるツールは以下の4つです:

## 1. **deepwiki_read_wiki_structure**
- **機能**: GitHubリポジトリのドキュメントトピック一覧を取得
- **パラメータ**: 
  - `repoName` (必須): GitHubリポジトリ名(例: "facebook/react")

## 2. **deepwiki_read_wiki_contents**
- **機能**: GitHubリポジトリのドキュメント内容を表示
- **パラメータ**:
  - `repoName` (必須): GitHubリポジトリ名(例: "facebook/react")

## 3. **deepwiki_ask_question**
- **機能**: GitHubリポジトリについて質問を投げかける
- **パラメータ**:
  - `repoName` (必須): GitHubリポジトリ名(例: "facebook/react")
  - `question` (必須): リポジトリについての質問内容

## 4. **my-mcp-worker_dice_roll**
- **機能**: サイコロを降った結果を返す
- **パラメータ**:
  - `sides` (オプション): サイコロの面の数(デフォルト: 6、範囲: 1-100)

これらのツールを使って、GitHubリポジトリの調査やサイコロゲームなどをお手伝いできます。何かご質問やご要望があれば、お気軽にお声かけください!

DeepWikiに向けて質問します。

-> % python main.py tegnike/aituber-kitリポジトリについて端的に解説してください
=== Claude の応答 ===
tegnike/aituber-kitリポジトリについて調べてみます。
tool use:  read_wiki_contents
**tegnike/aituber-kit** は、AIを活用したVTuber(バーチャルYouTuber)やバーチャルキャラクターを作成するためのオープンソースツールキットです。

## 主な特徴

### 🤖 AI統合
- **複数のAIサービスに対応**: OpenAI、Anthropic Claude、Google Gemini、Azure OpenAI、Groq、Cohere等、15以上のAIサービスをサポート
- **リアルタイムAPI対応**: 低遅延での双方向AI対話が可能
- **音声認識機能**: Whisper APIやブラウザ音声認識を使用した音声入力
- **マルチモーダル対応**: テキストと画像の両方を処理可能

### 🎭 キャラクターレンダリング
- **3D VRMモデル**: VRM 0.0/1.0形式の3Dキャラクターモデルに対応
- **2D Live2Dモデル**: Cubism 3以降の2Dキャラクターアニメーション
- **表情・動作制御**: AIの応答に基づいた感情表現とリップシンク
- **カスタムキャラクター**: 独自のVRMやLive2Dモデルをアップロード可能

### 🔊 音声合成システム
- **多様なTTSエンジン**: VOICEVOX、Koeiromap、Google TTS、ElevenLabs、OpenAI TTS等10種類以上
- **音声パラメータ調整**: 速度、ピッチ、イントネーションの細かい調整
- **リアルタイム音声生成**: AIの応答をリアルタイムで音声化

### 🌐 多言語対応
- **15言語サポート**: 日本語、英語、中国語、韓国語、フランス語等
- **自動翻訳システム**: GitHub ActionsとOpenAI APIを使った翻訳の自動化
- **i18next統合**: React i18nextによる完全な国際化対応

### 📡 拡張モード
- **YouTubeモード**: YouTubeライブストリームのコメントに自動応答
- **スライドモード**: PDFプレゼンテーションをAIキャラクターが自動発表
- **外部連携モード**: WebSocketを通じた外部アプリケーションとの連携
- **メッセージ受信システム**: 外部からのAPI経由での指示受信

## アーキテクチャ

```mermaid
graph TD
    subgraph "ユーザーインターフェース"
        UI[UIコンポーネント]
    end
    
    subgraph "コアシステム"
        AI[AIサービスシステム]
        Character[キャラクターシステム]
        Voice[音声合成システム]
        Chat[チャット処理システム]
        I18N[国際化システム]
    end
    
    subgraph "拡張モード"
        YT[YouTubeモード]
        Slide[スライドモード]
        External[外部連携モード]
        RT[リアルタイムAPIモード]
        Audio[音声モード]
    end
    
    UI --> AI
    UI --> Character
    UI --> Voice
    UI --> Chat
    UI --> I18N
    
    AI <--> Chat
    Chat --> Voice
    Voice --> Character
    
    UI --> YT
    UI --> Slide
    UI --> External
    UI --> RT
    UI --> Audio

最後にStremable HTTP形式のMCPサーバーを使ってサイコロを振ります。

-> % python main.py サイコロを振ってください                                   
=== Claude の応答 ===
サイコロを振りますね!
tool use:  dice_roll
サイコロの結果は **5** でした!🎲

Discussion