Surveiller le trafic du serveur MCP dans Gestion des API Azure

Dans cet article, vous allez découvrir quelles données de télémétrie Gestion des API Azure émet pour le trafic vers les serveurs MCP, comment activer la journalisation des charges utiles pour les arguments et les résultats de l’outil et comment interroger les données dans Azure Monitor.  

Conditions préalables

Données de télémétrie par défaut pour les serveurs MCP

Pour chaque requête MCP, Gestion des API écrit une ligne de requêtes Application Insights avec des dimensions spécifiques à MCP et définit le champ de durée standard. Vous pouvez graphiquer la latence par outil sans modifier de configuration. Pour plus d’informations, consultez la section de référence sur les données de télémétrie MCP , plus loin dans cet article.  

Note

La télémétrie MCP suit les conventions sémantiques OpenTelemetry pour l’IA générative, qui définissent des noms d’attributs de télémétrie standard (par exemple) gen_ai.*afin que les données soient cohérentes entre les outils.

Activer la journalisation des charges utiles pour les arguments et les résultats

Par défaut, gestion des API ne capture pas les arguments et les résultats des appels d’outils. Pour activer la capture pour un serveur MCP :

  1. Dans le portail Azure, accédez à votre instance Gestion des API. 

  2. Sélectionnez API>Serveurs MCP, puis sélectionnez le serveur MCP que vous souhaitez consigner. 

  3. Sélectionnez Paramètres>Journaux de diagnostic

  4. Activez la journalisation des charges utiles du front-end et du back-end. Cliquez sur Enregistrer

Caution

Les arguments et les résultats des outils peuvent contenir des invites, des données client ou des secrets. Activez la journalisation de charge utile uniquement pour les serveurs et environnements MCP où vous en avez besoin. Appliquez un nettoyage ou des listes d'autorisation de revendications avant un déploiement à grande échelle. 

Interroger le trafic MCP avec KQL

Voici des exemples de requêtes Kusto que vous pouvez exécuter dans Azure Monitor pour analyser le trafic MCP. Dans ces exemples, remplacez sales-mcp par le nom de votre serveur MCP le cas échéant.

Répertorier les 50 derniers appels d’outil sur un serveur MCP donné

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

Principaux clients MCP par volume d’appel d’outils

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

latence p50 et p95 par outil au cours des dernières 24 heures

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

Taux d’erreur par outil au fil du temps

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

Inspecter les arguments envoyés à un outil spécifique

Pour ce scénario, vérifiez que la journalisation des charges utiles est activée pour le serveur 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"]

Ajouter des dimensions personnalisées avec la stratégie de traçage

Pour capturer des données qui ne se trouve pas dans le schéma intégré , par exemple, un en-tête personnalisé x-agent-id , une revendication JWT ou un ID de corrélation, utilisez la stratégie de trace au niveau de l’étendue du serveur MCP. 

Warning

N'accédez pas à context.Response.Body depuis des stratégies attachées à l'étendue MCP. Les réponses MCP sont transmises en flux, et la lecture du corps de la réponse rompt ce flux. 

Informations de référence sur les données de télémétrie MCP

Les dimensions suivantes s’affichent sur chaque requête MCP :

Propriété Description
gen_ai.operation.name méthode JSON-RPC (`tools/list` ou `tools/call`).
gen_ai.conversation.id ID de session MCP.
network.protocol.name Nom du protocole (MCP).
network.protocol.version Version du protocole.
auth.type Méthode d’authentification entrante.
user_agent.name Nom du client MCP (par exemple, vscode ou claude-desktop).
user_agent.version Version du client MCP.
service.name Nom du serveur MCP.
service.version Version du serveur MCP.
api.type Indicateur de type d’API (Mcp).
error.message Chaîne d’erreur, en cas d’échec.
error.type Catégorie d’erreur, en cas d’échec.

Champs supplémentaires sur les outils/listes

Metric Description
ToolCount Nombre d’outils retournés dans la réponse.

Champs supplémentaires dans tools/call

Propriété Description
gen_ai.tool.name Outil appelé par l’agent.
gen_ai.tool.type Type d’outil.
gen_ai.tool.call.arguments Arguments JSON. Présente uniquement lorsque la journalisation de charge utile est activée.
gen_ai.tool.call.result Résultat JSON. Présente uniquement lorsque la journalisation de charge utile est activée.