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: true に設定すると、リスト操作(list_toolslist_resources、および list_prompts)をサーバー側とクライアント側の両方でトレースします。

サーバー側の統合

MCP サーバーをトレースするには、既存の FastMCP setup: one to import Weave and one to initialize the client. Once added, tool, resource, and prompt operations will be automatically traced.
# Import Weave (required for tracing)
import weave
from mcp.server.fastmcp import FastMCP

# Initialize Weave with your project name
weave_client = weave.init("my-project")

# Set up the MCP server
mcp = FastMCP("Demo")

# Define a tool (this call will be traced)
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b

# Define a resource (this call will be traced)
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Return a personalized greeting."""
    return f"Hello, {name}!"

# Define a prompt (this call will be traced)
@mcp.prompt()
def review_code(code: str) -> str:
    """Return a prompt for reviewing code."""
    return f"Please review this code:\n\n{code}"

# Start the server
mcp.run(transport="stdio")

クライアント側の統合

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

# Initialize Weave with your project name
weave_client = weave.init("my-project")

# Set up and run the MCP client
async with stdio_client(server_params) as (read, write):
    async with ClientSession(read, write) as session:
        # Initialize the session
        await session.initialize()
        
        # Call a tool (this will be traced)
        result = await session.call_tool("add", arguments={"a": 1, "b": 2})
        
        # Read a resource (this will be traced)
        resource = await session.read_resource("greeting://user")
        
        # Get a prompt (this will be traced)
        prompt = await session.get_prompt("review_code", arguments={"code": "print('Hello')"})

Tutorial: mcp_demo

この mcp_example は、Model Context Protocol (MCP) と Weave の間のトレース用統合を示しています。クライアントとサーバーの両方のコンポーネントを計測して、それらの相互作用の詳細なトレースをキャプチャする方法を紹介しています。

例を実行する

  1. リポジトリをクローンして weave リポジトリに移動します mcp_demo example:
    git clone https://github.com/wandb/weave
    cd 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 コマンド

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

例の理解

この example_server.py サーバーは以下を定義しています:
  • ツール: add()calculate_bmi()fetch_weather()
  • リソース: greeting://{name}config://appusers://{id}/profile
  • プロンプト: review_code()debug_error()
などのテンプレート。サーバー側のすべての操作は、クライアントを weave.init() で初期化すると、Weave によって自動的にトレースされます。 この example_client.py クライアントは以下の方法を示しています:
  • MCP サーバーに接続する
  • 利用可能なツール、リソース、プロンプトを発見する
  • パラメータを使用してツールを呼び出す
  • リソース URI から読み取る
  • 引数を使用してプロンプトを生成する
  • カスタムメソッド/関数での weave.op() の使用方法を示す
Weave はすべてのクライアント側の呼び出しをトレースして、クライアントとサーバー間の相互作用の完全なビューを提供します。

FAQ

なぜ MCP トレースが必要なのですか?

LLM アプリケーション開発者として、あなたは次の3つのカテゴリのいずれかに該当します:
  • MCP サーバー側開発者: 複数のツール、リソース、プロンプトを MCP クライアントに公開したい。既存のアプリケーションのツール、リソースなどを公開するか、エージェントを構築したり、オーケストレーターエージェントによって複数のエージェントをオーケストレーションしたりしています。
  • MCP クライアント側開発者: クライアント側アプリケーションを複数の MCP サーバーに接続したい。クライアント側ロジックの中核部分は、どのツールを呼び出すか、どのリソースを取得するかを決定するための LLM 呼び出しを行うことです。
  • MCP サーバーとクライアントの開発者: サーバーとクライアントの両方を開発しています。
最初の2つのカテゴリのいずれかに該当する場合、各ツールがいつ呼び出されるか、実行フローがどのように見えるか、トークン数、サーバーまたはクライアント側ロジックのさまざまなコンポーネントのレイテンシーを知りたいと思うでしょう。 サーバーとクライアントの両方を開発している場合、統一されたトレースタイムラインを見る能力は、サーバーとクライアント側のロジックの両方を迅速に反復するのに役立ちます。 いずれの場合も、観測可能性レイヤーにより以下が可能になります:
  • アプリケーションを迅速に反復する
  • ワークフローや実行ロジックを監査する
  • ボトルネックを特定する