Monitorare il traffico del server MCP in Gestione API di Azure

Questo articolo illustra quali dati di telemetria Gestione API di Azure generano per il traffico verso i server MCP, come abilitare la registrazione del payload per gli argomenti e i risultati degli strumenti e come eseguire query sui dati in Monitoraggio di Azure.  

Prerequisites

Telemetria predefinita per i server MCP

Per ciascuna richiesta MCP, API Management scrive una riga nelle richieste di Application Insights con dimensioni specifiche di MCP e imposta il campo standard relativo alla durata. È possibile tracciare la latenza per strumento senza modificare alcuna configurazione. Per ulteriori dettagli, vedere la sezione Informazioni di riferimento sulla telemetria MCP, più avanti in questo articolo.  

Note

I dati di telemetria MCP seguono le convenzioni semantiche OpenTelemetry per l'intelligenza artificiale generativa, che definiscono nomi di attributi di telemetria standard (ad esempio, gen_ai.*) in modo che i dati vengano coerenti tra gli strumenti.

Abilitare la registrazione dei log del payload per argomenti e risultati

Per impostazione predefinita, Gestione API non acquisisce gli argomenti e i risultati delle chiamate agli strumenti. Per abilitare l'acquisizione per un server MCP:

  1. Nel portale di Azure passare all'istanza di Gestione API. 

  2. Selezionare API server>MCP e quindi selezionare il server MCP da registrare. 

  3. Selezionare Impostazioni>Log di diagnostica

  4. Abilita la registrazione dei payload frontend e backend. Seleziona Salva

Attenzione

Gli argomenti e i risultati degli strumenti possono includere prompt, dati dei clienti o informazioni riservate. Abilitare la registrazione del payload solo per i server e gli ambienti MCP in cui è necessario. Applicare gli elenchi di scrubbing o attestazione consentita prima dell'implementazione su larga scala. 

Eseguire query sul traffico MCP con KQL

Di seguito sono riportate le query Kusto di esempio che è possibile eseguire in Monitoraggio di Azure per analizzare il traffico MCP. In questi esempi sostituire sales-mcp con il nome del server MCP, se applicabile.

Elencare le ultime 50 chiamate allo strumento in un determinato server MCP

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

Principali client MCP per volume di chiamate agli strumenti

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

latenza p50 e p95 per strumento nelle ultime 24 ore

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

Frequenza degli errori per strumento nel tempo

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

Esaminare gli argomenti inviati a uno strumento specifico

Per questo scenario, assicurarsi che la registrazione del payload sia abilitata per il server 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"]

Aggiungere dimensioni personalizzate con i criteri di traccia

Per acquisire dati non inclusi nello schema predefinito, ad esempio un'intestazione personalizzata x-agent-id , un'attestazione JWT o un ID di correlazione, usare i criteri di traccia nell'ambito del server MCP. 

Avvertimento

Non accedere a context.Response.Body tramite i criteri associati all'ambito MCP. Le risposte MCP vengono trasmesse in streaming e la lettura del corpo della risposta interrompe il flusso. 

Informazioni di riferimento sulla telemetria MCP

In ogni richiesta MCP vengono visualizzate le dimensioni seguenti:

Property Descrizione
gen_ai.operation.name il metodo JSON-RPC (tools/list o tools/call).
gen_ai.conversation.id ID della sessione MCP.
network.protocol.name Nome del protocollo (MCP).
network.protocol.version Versione del protocollo.
auth.type Metodo di autenticazione in ingresso.
user_agent.name Nome client MCP (ad esempio, vscode o claude-desktop).
user_agent.version Versione del client MCP.
service.name Nome del server MCP.
service.version Versione del server MCP.
api.type Discriminatore del tipo di API (Mcp).
error.message Stringa di errore, in caso di malfunzionamento.
error.type Categoria di errore, in caso di mancata riuscita.

Campi aggiuntivi per strumenti/elenco

Metrica Descrizione
ToolCount Numero di strumenti restituiti nella risposta.

Campi aggiuntivi in strumenti/chiamate

Property Descrizione
gen_ai.tool.name Strumento richiamato dall'agente.
gen_ai.tool.type Tipo di strumento.
gen_ai.tool.call.arguments Argomenti JSON. Presente solo quando la registrazione del payload è abilitata.
gen_ai.tool.call.result Risultato JSON. Presente solo quando la registrazione del payload è abilitata.