Monitorar o tráfego do servidor MCP no Gerenciamento de API do Azure

Neste artigo, você aprenderá quais dados de telemetria o Gerenciamento de API do Azure emite para o tráfego destinado a servidores MCP, como habilitar o registro em log da carga útil para argumentos e resultados da ferramenta e como consultar os dados no Azure Monitor.  

Pré-requisitos

Telemetria padrão para servidores MCP

Para cada solicitação MCP, o Gerenciamento de API grava uma linha de solicitações do Application Insights com dimensões específicas do MCP e define o campo de duração padrão. Você pode mapear a latência por ferramenta sem alterar nenhuma configuração. Para obter detalhes, consulte a seção de referência de telemetria do MCP , mais adiante neste artigo.  

Note

A telemetria mcp segue as convenções semânticas OpenTelemetry para IA gerativa, que definem nomes de atributo de telemetria padrão (por exemplo, gen_ai.*) para que os dados sejam consistentes entre as ferramentas.

Habilitar o registro em log de payload para argumentos e resultados

Por padrão, o Gerenciamento de API não captura os argumentos e os resultados das chamadas de ferramenta. Para habilitar a captura para um servidor MCP:

  1. No portal do Azure, acesse sua instância de Gerenciamento de API. 

  2. Selecione APIs>Servidores MCP e, em seguida, selecione o servidor MCP que você deseja registrar em log. 

  3. Selecione Configurações>Logs de Diagnóstico

  4. Habilite o registro de payloads do Frontend e do Backend. Selecione Salvar

Cuidado

Os argumentos e os resultados da ferramenta podem incluir prompts, dados do cliente ou segredos. Habilite o registro de payloads somente nos servidores MCP e nos ambientes em que isso for necessário. Aplique listas de permissões de anulação ou declaração antes da distribuição ampla. 

Consultar o tráfego MCP com KQL

Veja a seguir exemplos de consultas Kusto que você pode executar em Azure Monitor para analisar o tráfego MCP. Nesses exemplos, substitua sales-mcp pelo nome do servidor MCP, quando aplicável.

Listar as últimas 50 chamadas de ferramenta em um determinado servidor 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

Principais clientes de MCP por volume de chamadas de ferramentas

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

latência p50 e p95 por ferramenta nas ú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

Taxa de erros por ferramenta ao longo do 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

Inspecionar argumentos enviados para uma ferramenta específica

Para esse cenário, certifique-se de que o registro de payload esteja habilitado no 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"]

Adicionar dimensões personalizadas com a política de rastreamento

Para capturar dados que não estão no esquema interno - por exemplo, um cabeçalho personalizado x-agent-id , uma declaração JWT ou uma ID de correlação - use a política de rastreamento no escopo do servidor MCP. 

Warning

Não acesse context.Response.Body nas políticas vinculadas ao escopo do MCP. As respostas do MCP são transmitidas em fluxo, e a leitura do corpo causa uma disruptura nessa transmissão. 

Referência de telemetria do MCP

As seguintes dimensões aparecem em cada solicitação MCP:

Propriedade Description
gen_ai.operation.name método JSON-RPC (tools/list ou tools/call).
gen_ai.conversation.id ID da sessão do MCP.
network.protocol.name Nome do protocolo (MCP).
network.protocol.version Versão do protocolo.
auth.type Método de autenticação de entrada.
user_agent.name Nome do cliente MCP (por exemplo, vscode ou claude-desktop).
user_agent.version Versão do cliente MCP.
service.name Nome do servidor MCP.
service.version Versão do servidor MCP.
api.type Tipo de discriminador de API (Mcp).
error.message Cadeia de caracteres de erro, em caso de falha.
error.type Categoria de erro, em caso de falha.

Campos adicionais na lista de ferramentas

Metric Description
ToolCount Número de ferramentas retornadas na resposta.

Campos adicionais nas ferramentas/chamadas

Propriedade Description
gen_ai.tool.name Ferramenta que o agente invocou.
gen_ai.tool.type Tipo de ferramenta.
gen_ai.tool.call.arguments Argumentos em JSON. Presente somente quando o registro em log de payload estiver habilitado.
gen_ai.tool.call.result Resultado em JSON. Presente somente quando o registro em log de payload estiver habilitado.