Überwachen des MCP-Serverdatenverkehrs in Azure API Management

In diesem Artikel erfahren Sie, welche Telemetrie Azure API Management für den Datenverkehr an MCP-Server ausgibt, wie Sie die Nutzlastprotokollierung für Toolargumente und -ergebnisse aktivieren und wie Sie die Daten in Azure Monitor abfragen.  

Prerequisites

Standard-Telemetrie für MCP-Server

Für jede MCP-Anfrage schreibt API Management eine Zeile in die Anforderungstabelle von Application Insights mit MCP-spezifischen Dimensionen und setzt das Standardfeld für die Dauer. Sie können die Latenz pro Tool erstellen, ohne eine Konfiguration zu ändern. Ausführliche Informationen finden Sie im Abschnitt zur MCP-Telemetriereferenz weiter unten in diesem Artikel.  

Note

MCP-Telemetrie folgt den OpenTelemetry-Semantikkonventionen für generative KI, die Standardmäßige Telemetrie-Attributnamen (z. B. ) definieren, gen_ai.*damit Daten über Tools hinweg konsistent sind.

Nutzdatenprotokollierung für Argumente und Ergebnisse aktivieren

Standardmäßig erfasst die API-Verwaltung nicht die Argumente und Ergebnisse von Toolaufrufen. So aktivieren Sie die Erfassung für einen MCP-Server:

  1. Wechseln Sie im Azure-Portal zu Ihrer API-Verwaltungsinstanz. 

  2. Wählen Sie APIs>MCP-Server und dann den MCP-Server aus, den Sie protokollieren möchten. 

  3. Wählen Sie Einstellungen>Diagnoseprotokolle aus. 

  4. Aktivieren Sie die Frontend- und Back-End-Nutzlastprotokollierung. Wählen Sie Speichern aus. 

Vorsicht

Toolargumente und Ergebnisse können Eingabeaufforderungen, Kundendaten oder geheime Schlüssel enthalten. Aktivieren Sie die Nutzlastprotokollierung nur für die MCP-Server und -Umgebungen, in denen Sie sie benötigen. Führen Sie vor dem allgemeinen Rollout eine Bereinigung durch oder wenden Sie Positivlisten für Ansprüche an. 

MCP-Datenverkehr mit KQL abfragen

Im Folgenden finden Sie Beispiel-Kusto-Abfragen, die Sie in Azure Monitor ausführen können, um MCP-Datenverkehr zu analysieren. Ersetzen Sie in diesen Beispielen sales-mcp gegebenenfalls durch den Namen Ihres MCP-Servers.

Auflisten der letzten 50 Toolaufrufe auf einem bestimmten MCP-Server

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-Clients mit den meisten Tool-Aufrufen

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

p50- und p95-Latenz pro Tool in den letzten 24 Stunden

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

Fehlerrate pro Tool im Laufe der Zeit

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

Überprüfen von Argumenten, die an ein bestimmtes Tool gesendet werden

Stellen Sie für dieses Szenario sicher, dass die Nutzlastprotokollierung für den MCP-Server aktiviert ist.

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"]

Benutzerdefinierte Dimensionen mit der Trace-Richtlinie hinzufügen

Verwenden Sie die trace-Richtlinie im Gültigkeitsbereich des MCP-Servers, um Daten zu erfassen, die nicht im integrierten Schema enthalten sind – zum Beispiel einen benutzerdefinierten x-agent-id Header, einen JWT-Claim oder eine Korrelations-ID. 

Warning

Greifen Sie nicht über Richtlinien, die dem MCP-Bereich zugeordnet sind, auf context.Response.Body zu. MCP-Antworten werden als Stream übertragen, und das Lesen des Antworttexts unterbricht diese Übertragung. 

MCP-Telemetriereferenz

Die folgenden Dimensionen werden für jede MCP-Anforderung angezeigt:

Eigentum Description
gen_ai.operation.name die JSON-RPC-Methode (tools/list oder tools/call).
gen_ai.conversation.id MCP-Sitzungs-ID.
network.protocol.name Protokollname (MCP).
network.protocol.version Protokollversion.
auth.type Methode für die eingehende Authentifizierung.
user_agent.name MCP-Clientname (z. B. vscode oder claude-desktop).
user_agent.version MCP-Client-Version.
service.name Name des MCP-Servers.
service.version Version des MCP-Servers.
api.type API-Typ diskriminator (Mcp).
error.message Fehlerzeichenfolge bei Fehler
error.type Fehlerkategorie im Fehlerfall.

Zusätzliche Felder auf tools/list

Metric Description
ToolCount Anzahl der in der Antwort zurückgegebenen Werkzeuge.

Zusätzliche Felder für Tools/Aufrufe

Eigentum Description
gen_ai.tool.name Tool, das der Agent aufgerufen hat.
gen_ai.tool.type Tooltyp.
gen_ai.tool.call.arguments Argumente in JSON Nur vorhanden, wenn die Nutzlastprotokollierung aktiviert ist.
gen_ai.tool.call.result Ergebnis-JSON. Nur verfügbar, wenn die Nutzlastprotokollierung aktiviert ist.