Azure API Managementで MCP サーバー トラフィックを監視する

この記事では、MCP サーバーへのトラフィックについて Azure API Management が出力するテレメトリ、ツールの引数と結果のペイロード ログを有効にする方法、および Azure Monitor でデータをクエリする方法について説明します。  

Prerequisites

MCP サーバーの既定のテレメトリ

すべての MCP 要求について、API Management は、MCP 固有のディメンションを持つ Application Insights 要求行を書き込み、標準期間フィールドを設定します。 構成を変更することなく、ツールごとの待機時間をグラフにすることができます。 詳細については、この記事の後半の 「MCP テレメトリ リファレンス 」セクションを参照してください。  

Note

MCP テレメトリは、生成 AI の OpenTelemetry セマンティック規則に従います。これは、標準のテレメトリ属性名 ( gen_ai.* など) を定義するため、ツール間でデータの整合性が保たれます。

引数と結果のペイロード ログを有効にする

既定では、API Management はツール呼び出しの引数と結果をキャプチャしません。 MCP サーバーのキャプチャを有効にするには:

  1. Azure ポータルで、API Management インスタンスに移動します。 

  2. API>MCP サーバーを選択し、ログに記録する MCP サーバーを選択します。 

  3. [設定]>[Diagnostic Logs]\(診断ログ\) を選択します。 

  4. フロントエンドとバックエンドのペイロードのログ記録を有効にします。 保存を選びます。 

注意事項

ツールの引数と結果には、プロンプト、顧客データ、またはシークレットを含めることができます。 必要な MCP サーバーと環境に対してのみペイロード ログを有効にします。 本格展開の前に、スクラビングまたはクレーム許可リストを適用してください。 

KQL を使用して MCP トラフィックにクエリを実行する

MCP トラフィックを分析するためにAzure Monitorで実行できる Kusto クエリの例を次に示します。 これらの例では、 sales-mcp を該当する場合は MCP サーバーの名前に置き換えます。

特定の MCP サーバーで最後に 50 回のツール呼び出しを一覧表示する

requests
| where customDimensions["api.type"] == "Mcp"
  and customDimensions["service.name"] == "sales-mcp"
  and customDimensions["gen_ai.operation.name"] == "tools/call"
| project timestamp,
          tool       = customDimensions["gen_ai.tool.name"],
          session    = customDimensions["gen_ai.conversation.id"],
          client     = strcat(customDimensions["user_agent.name"], "/",
                              customDimensions["user_agent.version"]),
          durationMs = duration,
          success
| order by timestamp desc
| take 50

ツール呼び出しボリューム別の上位 MCP クライアント

requests
| where customDimensions["api.type"] == "Mcp"
  and customDimensions["gen_ai.operation.name"] == "tools/call"
| summarize calls = count()
    by client = strcat(customDimensions["user_agent.name"], "/",
                       customDimensions["user_agent.version"])
| top 10 by calls desc

過去 24 時間のツールあたりの p50 と p95 の待機時間

requests
| where customDimensions["api.type"] == "Mcp"
  and customDimensions["gen_ai.operation.name"] == "tools/call"
  and timestamp > ago(24h)
| summarize p50   = percentile(duration, 50),
            p95   = percentile(duration, 95),
            calls = count()
    by tool = tostring(customDimensions["gen_ai.tool.name"])
| order by p95 desc

時間の経過に伴うツールごとのエラー率

requests
| where customDimensions["api.type"] == "Mcp"
  and customDimensions["gen_ai.operation.name"] == "tools/call"
| summarize total    = count(),
            failures = countif(success == false)
    by bin(timestamp, 5m),
       tool = tostring(customDimensions["gen_ai.tool.name"])
| extend errorRate = todouble(failures) / total
| render timechart

特定のツールに送信された引数を検査する

このシナリオでは、MCP サーバーに対してペイロード ログが有効になっていることを確認します。

requests
| where customDimensions["api.type"] == "Mcp"
  and customDimensions["service.name"] == "sales-mcp"
  and customDimensions["gen_ai.tool.name"] == "create_quote"
  and timestamp > ago(1h)
| project timestamp,
          session = customDimensions["gen_ai.conversation.id"],
          args    = customDimensions["gen_ai.tool.call.arguments"],
          result  = customDimensions["gen_ai.tool.call.result"]

トレース ポリシーを使用してカスタム ディメンションを追加する

組み込みスキーマにないデータ (カスタム x-agent-id ヘッダー、JWT 要求、関連付け ID など) をキャプチャするには、MCP サーバーのスコープで トレース ポリシーを使用します。 

Warning

MCP スコープにアタッチされているポリシーから context.Response.Body にアクセスしないでください。 MCP 応答がストリーミングされ、本文の読み取りによってストリームが中断されます。 

MCP テレメトリ リファレンス

MCP 要求ごとに次のディメンションが表示されます。

プロパティ Description
gen_ai.operation.name JSON-RPC メソッド (ツール/リストまたはツール/呼び出し)。
gen_ai.conversation.id MCP セッション ID。
network.protocol.name プロトコル名 (MCP)。
network.protocol.version プロトコルのバージョン。
auth.type 受信認証方法。
user_agent.name MCP クライアント名 (vscode や claude-desktop など)。
user_agent.version MCP クライアントのバージョン。
service.name MCPサーバー名。
service.version MCP サーバーのバージョン。
api.type API 型識別子 (Mcp)。
error.message 失敗時のエラー文字列。
error.type エラー カテゴリ (失敗時)。

ツール/リストの追加フィールド

Metric Description
ToolCount 応答で返されるツールの数。

ツール/呼び出しの追加フィールド

プロパティ Description
gen_ai.tool.name エージェントが呼び出したツール。
gen_ai.tool.type ツールの種類。
gen_ai.tool.call.arguments 引数 JSON。 ペイロード ログが有効な場合にのみ存在します。
gen_ai.tool.call.result 結果 JSON。 ペイロード ログが有効な場合にのみ存在します。