Monitorizar o tráfego do servidor MCP no API Management do Azure

Neste artigo, vai aprender que telemetria o API Management do Azure emite relativamente ao tráfego para servidores MCP, como ativar o registo da carga útil dos argumentos e dos resultados das ferramentas e como consultar os dados no Azure Monitor.  

Pré-requisitos

Telemetria padrão para servidores MCP

Para cada pedido MCP, a API Management escreve uma linha de pedidos Application Insights com dimensões específicas do MCP e define o campo de duração padrão. Podes registar a latência por ferramenta sem mudar qualquer configuração. Para mais detalhes, consulte a secção de referência de telemetria MCP , mais adiante neste artigo.  

Note

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

Ativar o registo de dados para argumentos e resultados

Por defeito, a Gestão de APIs não capta os argumentos e resultados das chamadas de ferramenta. Para permitir a captura num servidor MCP:

  1. No portal do Azure, vá para sua instância de Gerenciamento de API. 

  2. Selecione APIs,>servidores MCP e depois selecione o servidor MCP que quer logar. 

  3. Selecione Definições>Registos de diagnóstico

  4. Ativar o registo da carga útil do frontend e do backend. Selecione Guardar

Atenção

Os argumentos e resultados da ferramenta podem incluir instruções, dados de cliente ou informação confidencial. Ative o registo de payload apenas para os servidores MCP e ambientes onde for necessário. Aplica o scrubbing ou declara listas de permissões antes de uma implementação abrangente. 

Consultar o tráfego MCP com KQL

Seguem-se exemplos de consultas Kusto que pode executar no Azure Monitor para analisar o tráfego MCP. Nestes exemplos, substitua sales-mcp pelo nome do seu servidor MCP quando aplicável.

Liste as últimas 50 chamadas de ferramenta num dado 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 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 erro 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 a uma ferramenta específica

Neste cenário, certifique-se de que o registo de payload está ativado para o 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"]

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

Para capturar dados que não estão no esquema integrado — por exemplo, um cabeçalho personalizado x-agent-id, uma declaração JWT ou um identificador de correlação — utilize a política trace ao nível do servidor MCP. 

Warning

Não acedas context.Response.Body a partir de políticas associadas ao âmbito do MCP. As respostas do MCP são transmitidas por streaming, e ler o corpo da resposta interrompe o fluxo. 

Referência de telemetria MCP

As seguintes dimensões aparecem em cada pedido MCP:

Property Description
gen_ai.operation.name método JSON-RPC (tools/list ou tools/call).
gen_ai.conversation.id ID da sessão 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 cliente MCP.
service.name Nome do servidor MCP.
service.version Versão do servidor MCP.
api.type Discriminador de tipo de API (Mcp).
error.message Sequência de erro, em caso de falha.
error.type Categoria de erro, em caso de falha.

Campos adicionais nas ferramentas/listas

Métrico Description
ToolCount Número de ferramentas devolvidas na resposta.

Campos adicionais nas ferramentas/chamada

Property Description
gen_ai.tool.name Ferramenta que o agente invocou.
gen_ai.tool.type Tipo de ferramenta.
gen_ai.tool.call.arguments Argumentos JSON. Só está presente quando o registo da carga útil está ativado.
gen_ai.tool.call.result Resultado, JSON. Só está presente quando o registo da carga útil está ativado.