メインコンテンツへスキップ
Open In Colab Model Context Protocol (MCP) は、AI アプリケーションが大規模言語モデル(LLM)と情報をやり取りするための標準化された通信プロトコルです。ハードウェア互換性を変革した汎用コネクタと同様に、MCP は LLM がさまざまなデータソースへアクセスし、外部ツールと対話するためのインターフェースを提供します。これにより、新しいサービスごとにカスタムインテグレーションを実装する必要がなくなります。 Weave インテグレーションを使うと、MCP クライアントと MCP サーバー間のアクティビティをトレースできます。ツール呼び出し、リソースアクセス、プロンプト生成など、MCP ベースのシステム全体で何が起きているかを詳細に可視化できます。

しくみ

現在、このインテグレーションはクライアント側とサーバー側の処理を個別にキャプチャしますが、それらの相互作用をエンドツーエンドで可視化することはできません。エンドツーエンドのオブザーバビリティを実現するために、MCP に OpenTelemetry トレースのサポートを追加する提案が進められています。詳細については、GitHub discussion #269 を参照してください。
Weave インテグレーションは、コアメソッドに weave.op() デコレータを適用してパッチを当てることで、Model Context Protocol (MCP) の主要コンポーネントを自動的にトレースします。具体的には、mcp.server.fastmcp.FastMCP クラスおよび mcp.ClientSession クラスのメソッドにパッチを適用します。 このインテグレーションにより、Weave は次の MCP コンポーネントをトレースします。 mcp_trace_timeline.png

インテグレーションを使用する

Weave インテグレーションは MCP サーバーとクライアントの両方で動作します。インストール後は、weave をインポートする行と初期化する行の 2 行を追加するだけで、トレースを有効化できます。

前提条件

開始する前に、必要なパッケージをインストールしてください。
pip install -qq "mcp[cli]" weave

設定

MCP インテグレーションは環境変数によって設定できます:
  • MCP_TRACE_LIST_OPERATIONS: サーバー側およびクライアント側の両方で、リスト操作(list_toolslist_resourceslist_prompts)をトレースするには true に設定します。

サーバーサイドインテグレーション

MCP サーバーをトレースするには、既存の FastMCP のセットアップに 2 行を追加します。1 行は Weave をインポートし、もう 1 行はクライアントを初期化します。これらを追加すると、ツール、リソース、プロンプトの各操作は自動的にトレースされます。
# Weave をインポート(トレースに必要)
import weave
from mcp.server.fastmcp import FastMCP

# プロジェクト名で Weave を初期化
weave_client = weave.init("my-project")

# MCP サーバーをセットアップ
mcp = FastMCP("Demo")

# ツールを定義(この呼び出しはトレースされます)
@mcp.tool()
def add(a: int, b: int) -> int:
    """2つの数値を加算します。"""
    return a + b

# リソースを定義(この呼び出しはトレースされます)
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """パーソナライズされた挨拶を返します。"""
    return f"Hello, {name}!"

# プロンプトを定義(この呼び出しはトレースされます)
@mcp.prompt()
def review_code(code: str) -> str:
    """コードレビュー用のプロンプトを返します。"""
    return f"Please review this code:\n\n{code}"

# サーバーを起動
mcp.run(transport="stdio")

クライアント側のインテグレーション

クライアント側では、トレーシングのために必要な変更は 2 つだけです。Weave をインポートし、初期化します。ツール呼び出し、リソースアクセス、プロンプトリクエストはすべて自動的にトレースされます。
# Weave をインポート(トレースに必要)
import weave
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

# プロジェクト名で Weave を初期化する
weave_client = weave.init("my-project")

# MCP クライアントをセットアップして実行する
async with stdio_client(server_params) as (read, write):
    async with ClientSession(read, write) as session:
        # セッションを初期化する
        await session.initialize()
        
        # ツールを呼び出す(トレースされる)
        result = await session.call_tool("add", arguments={"a": 1, "b": 2})
        
        # リソースを読み取る(トレースされる)
        resource = await session.read_resource("greeting://user")
        
        # プロンプトを取得する(トレースされる)
        prompt = await session.get_prompt("review_code", arguments={"code": "print('Hello')"})

チュートリアル: mcp_demo サンプル

mcp_demo サンプルは、Model Context Protocol (MCP) と Weave をトレーシング用途でインテグレーションする方法を示します。クライアントおよびサーバー双方のコンポーネントにインストルメンテーションを追加し、それらのやり取りの詳細なトレースを取得する方法を紹介します。

サンプルを実行する

  1. docs リポジトリをクローンして、mcp_demo サンプルに移動します:
    git clone https://github.com/wandb/docs
    cd docs/weave/examples/mcp_demo
    
    このサンプルには、主に次の 2 つのファイルが含まれています:
    • example_server.py: FastMCP で構築されたデモ用の MCP サーバー。ツール、リソース、およびプロンプトを定義します。
    • example_client.py: サーバーに接続し、そのコンポーネントとやり取りするクライアント。
  2. 必要な依存パッケージを手動でインストールします:
    pip install mcp[cli] weave
    
  3. デモを実行します:
    python example_client.py example_server.py
    
    このコマンドはクライアントとサーバーの両方を起動します。クライアント側で対話型 CLI が立ち上がり、さまざまな機能を試せます。

クライアント CLI コマンド

クライアントインターフェースは次のコマンドをサポートします。
CommandDescription
tools利用可能なツールを一覧表示する
resources利用可能なリソースを一覧表示する
prompts利用可能なプロンプトを一覧表示する
add <a> <b>2 つの数値を加算する
bmi <weight> <height>BMI(Body Mass Index)を計算する
weather <city>指定した都市の天気データを取得する
greeting <name>パーソナライズされた挨拶メッセージを取得する
user <id>ユーザープロファイルを取得する
configアプリケーション設定を取得する
code-review <code>コードレビュー用プロンプトを生成する
debug <error>デバッグ用プロンプトを生成する
demo利用可能なすべての機能のフルデモを実行する。各機能を順番に実行し、Weave UI 上でインタラクションの完全なトレースタイムラインを生成する。
qセッションを終了する

サンプルについて

example_server.py サーバーでは、次の内容を定義しています:
  • Tools: add(), calculate_bmi(), fetch_weather() のような関数
  • Resources: greeting://{name}config://appusers://{id}/profile のようなエンドポイント
  • Prompts: review_code()debug_error() のようなテンプレート
クライアントを weave.init() で初期化すると、すべてのサーバー側の処理が Weave によって自動的にトレースされます。 example_client.py クライアントは、次のことをどのように行うかを示しています:
  • MCP サーバーに接続する
  • 利用可能な tools、resources、prompts を検出する
  • パラメーターを指定して tools を呼び出す
  • リソース URI から読み取る
  • 引数付きで prompts を生成する
  • カスタムメソッド/関数で weave.op() を使用する
Weave はすべてのクライアント側の呼び出しをトレースし、クライアントとサーバー間のやり取りを完全に可視化します。

よくある質問

なぜ MCP のトレーシングが必要なのですか?

LLM アプリケーション開発者として、あなたは次の 3 つのカテゴリのいずれかに当てはまります。
  • MCP サーバー側開発者: 複数のツール、リソース、プロンプトを MCP クライアントに公開したいと考えています。既存アプリケーションのツールやリソースなどを公開している、あるいはエージェントを構築している、またはオーケストレーターエージェントによって複数のエージェントをオーケストレーションしています。
  • MCP クライアント側開発者: クライアント側アプリケーションを複数の MCP サーバーに接続したいと考えています。クライアント側ロジックの中核は、どのツールを呼び出すか、どのリソースを取得するかを決めるための LLM 呼び出しです。
  • MCP サーバー兼クライアント開発者: サーバーとクライアントの両方を開発しています。
最初の 2 つのカテゴリのいずれかに当てはまる場合、各ツールがいつ呼び出されたか、実行フローがどのようになっているか、トークン数、そしてサーバーまたはクライアント側ロジック内の各コンポーネントのレイテンシを把握したいはずです。 サーバーとクライアントの両方を開発している場合、統合されたトレースタイムラインを確認できると、サーバー側とクライアント側のロジックを高速に反復改善できます。 いずれの場合でも、オブザーバビリティレイヤーによって次のことが可能になります:
  • アプリケーションを高速に反復改善する
  • ワークフローや実行ロジックを監査する
  • ボトルネックを特定する