Supervisión del tráfico del servidor MCP en Azure API Management

En este artículo, aprenderás qué datos de telemetría emite Azure API Management para el tráfico hacia los servidores MCP, cómo habilitar el registro de la carga útil para los argumentos y resultados de las herramientas, y cómo consultar los datos en Azure Monitor.  

Prerequisites

Telemetría predeterminada para servidores MCP

Para cada solicitud de MCP, API Management escribe una fila de solicitudes de Application Insights con dimensiones específicas de MCP y establece el campo de duración estándar. Puede trazar la latencia por herramienta sin cambiar ninguna configuración. Para obtener más información, consulte la sección referencia de telemetría de MCP , más adelante en este artículo.  

Note

La telemetría de MCP sigue las convenciones semánticas de OpenTelemetry para la inteligencia artificial generativa, que definen nombres de atributos de telemetría estándar (por ejemplo, gen_ai.*), por lo que los datos son coherentes entre herramientas.

Habilita el registro de la carga útil para los argumentos y resultados

De forma predeterminada, API Management no captura los argumentos y los resultados de las llamadas a herramientas. Para habilitar la captura de un servidor MCP:

  1. En Azure Portal, vaya a la instancia de API Management. 

  2. Seleccione API>servidores MCP y, a continuación, seleccione el servidor MCP que desea registrar. 

  3. Seleccione Configuración>Registros de diagnóstico

  4. Active el registro de la carga útil del frontend y del backend. Seleccione Guardar

Caution

Los argumentos y los resultados de la herramienta pueden incluir mensajes, datos de clientes o secretos. Habilite el registro de carga solo para los servidores y entornos de MCP en los que lo necesite. Aplica el depurado o las listas de permitidos de reclamaciones antes de un despliegue generalizado. 

Consultar el tráfico de MCP con KQL

A continuación se muestran las consultas de Kusto de ejemplo que puede ejecutar en Azure Monitor para analizar el tráfico MCP. En estos ejemplos, reemplace por sales-mcp el nombre del servidor MCP cuando corresponda.

Enumerar las últimas 50 llamadas de herramienta en un servidor MCP determinado

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

Principales clientes de MCP por volumen de llamadas a herramientas

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

latencia p50 y p95 por herramienta en las últimas 24 horas

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

Tasa de errores por herramienta a lo largo del tiempo

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

Inspeccionar los argumentos enviados a una herramienta específica

En este escenario, asegúrese de que el registro de carga está habilitado para el servidor 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"]

Añade dimensiones personalizadas con la directiva de rastreo

Para capturar datos que no están en el esquema integrado (por ejemplo, un encabezado personalizado x-agent-id , una notificación JWT o un identificador de correlación), use la directiva de seguimiento en el ámbito del servidor MCP. 

Warning

No acceda a context.Response.Body desde las directivas asociadas al ámbito de MCP. Las respuestas MCP se transmiten en flujo continuo, y la lectura del cuerpo interrumpe el flujo. 

Referencia de telemetría de MCP

Las siguientes dimensiones aparecen en cada solicitud MCP:

Property Descripción
gen_ai.operation.name método JSON-RPC (tools/list o tools/call).
gen_ai.conversation.id Identificador de sesión de MCP.
network.protocol.name Nombre del protocolo (MCP).
network.protocol.version Versión del protocolo.
auth.type Método de autenticación de entrada.
user_agent.name Nombre de cliente MCP (por ejemplo, vscode o claude-desktop).
user_agent.version Versión del cliente MCP.
service.name Nombre del servidor MCP.
service.version Versión del servidor MCP.
api.type Discriminador de tipo de API (Mcp).
error.message Cadena de error, en caso de fallo.
error.type Categoría de error, en caso de error.

Campos adicionales en herramientas o lista

Métrica Descripción
ToolCount Número de herramientas devueltas en la respuesta.

Campos adicionales en tools/call

Property Descripción
gen_ai.tool.name Herramienta que invocó el agente.
gen_ai.tool.type Tipo de herramienta.
gen_ai.tool.call.arguments Argumentos en JSON. Solo está presente cuando el registro de la carga útil está habilitado.
gen_ai.tool.call.result JSON del resultado. Solo está presente cuando el registro de la carga útil está habilitado.