---
title: "Ce qu’il faut journaliser pour chaque appel d’outil MCP"
description: "Un client voit un serveur MCP distant comme un seul span opaque, et un tableau de bord d’annuaire ne voit que des totaux. Seul le serveur a vu l’appel. La ligne que les serveurs MCP de Tajo écrivent pour chacun, champ par champ, ce qui en est retiré, et ce qui n’est pas construit."
url: https://tajo.io/fr/blog/what-to-log-for-every-mcp-tool-call/
markdown: https://tajo.io/fr/blog/what-to-log-for-every-mcp-tool-call.md
lang: fr-FR
author: "Set Noa"
author_url: https://tajo.io/fr/set-noa/
published: 2026-11-06
updated: 2026-11-06
alternates: {en-US: /blog/what-to-log-for-every-mcp-tool-call.md, bg-BG: /bg/blog/what-to-log-for-every-mcp-tool-call.md, cs-CZ: /cz/blog/what-to-log-for-every-mcp-tool-call.md, de-DE: /de/blog/what-to-log-for-every-mcp-tool-call.md, da-DK: /dk/blog/what-to-log-for-every-mcp-tool-call.md, es-ES: /es/blog/what-to-log-for-every-mcp-tool-call.md, el-GR: /gr/blog/what-to-log-for-every-mcp-tool-call.md, hi-IN: /hi/blog/what-to-log-for-every-mcp-tool-call.md, id-ID: /in/blog/what-to-log-for-every-mcp-tool-call.md, hr-HR: /hr/blog/what-to-log-for-every-mcp-tool-call.md, hu-HU: /hu/blog/what-to-log-for-every-mcp-tool-call.md, it-IT: /it/blog/what-to-log-for-every-mcp-tool-call.md, ja-JP: /jp/blog/what-to-log-for-every-mcp-tool-call.md, ko-KR: /kr/blog/what-to-log-for-every-mcp-tool-call.md, ar-SA: /ar/blog/what-to-log-for-every-mcp-tool-call.md, nl-NL: /nl/blog/what-to-log-for-every-mcp-tool-call.md, no-NO: /no/blog/what-to-log-for-every-mcp-tool-call.md, pl-PL: /pl/blog/what-to-log-for-every-mcp-tool-call.md, pt-BR: /pt/blog/what-to-log-for-every-mcp-tool-call.md, ro-RO: /ro/blog/what-to-log-for-every-mcp-tool-call.md, ru-RU: /ru/blog/what-to-log-for-every-mcp-tool-call.md, sv-SE: /se/blog/what-to-log-for-every-mcp-tool-call.md, zh-CN: /zh-cn/blog/what-to-log-for-every-mcp-tool-call.md, sl-SI: /sl/blog/what-to-log-for-every-mcp-tool-call.md, sr-Latn-RS: /sr/blog/what-to-log-for-every-mcp-tool-call.md, th-TH: /th/blog/what-to-log-for-every-mcp-tool-call.md, tr-TR: /tr/blog/what-to-log-for-every-mcp-tool-call.md, ur-PK: /ur/blog/what-to-log-for-every-mcp-tool-call.md, vi-VN: /vi/blog/what-to-log-for-every-mcp-tool-call.md, sk-SK: /sk/blog/what-to-log-for-every-mcp-tool-call.md}
---

[Agents d’IA](https://tajo.io/fr/blog/?category=ai-agents)

# Ce qu’il faut journaliser pour chaque appel d’outil MCP

Un client voit un serveur MCP distant comme un seul span opaque, et un tableau de bord d’annuaire ne voit que des totaux. Seul le serveur a vu l’appel. La ligne que les serveurs MCP de Tajo écrivent pour chacun, champ par champ, ce qui en est retiré, et ce qui n’est pas construit.

journalisation serveur MCP

Que doit consigner un serveur MCP pour chaque appel d’outil ?

Journalisez une ligne par appel d’outil, sur le serveur, car le serveur est le seul endroit qui l’a vu. Les serveurs MCP de Tajo enregistrent qui a appelé (l’identifiant de la clé, jamais son secret), quel serveur et quel connecteur, l’outil s’il existe, sa classe d’effet, ok ou un code d’erreur court, la durée, la taille du résultat, l’identifiant de trace, les enregistrements que l’appel a touchés, et les arguments et la réponse, débarrassés des secrets et des données personnelles. Les lignes se lisent avec logs.list et logs.get et sont supprimées après 30 jours. Elles vivent à part du journal d’audit chaîné par hachage, où sont conservées les approbations et les empreintes de leurs entrées. Pas construit : un score de santé, une alerte sur le taux d’erreur, la recherche par outil ou par identifiant de trace, et l’export vers votre propre traçage.

[En savoir plus](https://tajo.io/fr/blog/what-to-log-for-every-mcp-tool-call/#une-ligne-par-appel)

Le 8 juin 2026, Anthropic a donné aux propriétaires de connecteurs de l’annuaire de Claude un tableau de bord. Il affiche les utilisateurs actifs, le total des appels d’outils et le rang dans l’annuaire. Il affiche « [le score de santé, les taux d’erreur et la latence en un coup d’œil, avec une ventilation des erreurs par outil pour repérer précisément ce qui échoue](https://claude.com/resources/articles/observability-for-developers-building-connectors) ».

Un an plus tôt, Alex Volkov, de Weights & Biases, avait décrit le même problème depuis l’autre bout. Dès que son agent appelait des outils via MCP, « [toute cette observabilité à laquelle je suis habitué quand mon propre code tourne de bout en bout s’est un peu éteinte](https://www.youtube.com/watch?v=Lcqat4iP_lE&t=61s) ». Son co-intervenant, Benjamin Eckel, de Dylibso, a montré pourquoi. Un serveur MCP distant « [nous apparaît dans la trace comme un seul span de service](https://www.youtube.com/watch?v=Lcqat4iP_lE&t=447s) », parce qu’il tourne hors du contrôle de l’appelant.

Les deux points de vue se tiennent à l’extérieur du serveur. Le client voit un span opaque. L’annuaire voit des totaux. Aucun des deux n’a vu ce qu’on a demandé au serveur, ce qu’il a refusé et ce qu’il a touché. Seul le serveur l’a vu, donc seul le serveur peut l’écrire.

Voici ce que les serveurs MCP de Tajo écrivent, lu dans le code qui les fait tourner et [décrit dans la documentation](https://tajo.io/fr/docs/mcp/#mcp-request-log). [Qu’est-ce qu’un serveur MCP](https://tajo.io/fr/blog/what-is-an-mcp-server/) couvre le protocole. Ici, il s’agit de la ligne.

## Une ligne par appel

Un tableau de bord, c’est la vue du capitaine de port : les navires qui entrent, ceux qui sortent, ceux qui étaient en retard. Le journal des requêtes, c’est le livre de bord du navire lui-même, écrit à bord, sur le moment.

Chaque `tools/call` sur le serveur de l’espace de travail de Tajo et sur chaque serveur de connecteur [aboutit à une ligne](https://tajo.io/fr/docs/mcp/#mcp-request-log). La ligne est écrite une fois la réponse construite, quelle que soit cette réponse. Un appel refusé parce que la clé n’a pas le droit d’écrire, ou parce que le point de terminaison est en lecture seule, reçoit une ligne comme les autres. Un appel à un outil qui n’existe pas aussi.

Voici ce que la ligne contient, et ce qu’elle refuse de contenir.

| Champ | Conservé | Non conservé |
| --- | --- | --- |
| Qui | L’identifiant de la clé API qui a appelé. Un jeton issu d’une connexion OAuth est aussi une clé. | Le secret de la clé ou son préfixe. |
| Où | Le serveur de l’espace de travail ou un serveur de connecteur, avec son connecteur et son profil. |  |
| Outil | Le nom, quand le serveur a un outil de ce nom. | Tout autre nom envoyé par le client : il est stocké comme `(unknown)`. |
| Effet | `read`, `write`, `send` ou `destructive` : l’effet le plus lourd que l’appel pouvait avoir. |  |
| Résultat | `ok`, ou un code d’erreur court en snake\_case comme `unknown_tool`. | Le texte des erreurs : tout ce qui n’est pas un code est stocké comme `tool_error`. |
| Durée et taille | Les millisecondes entre l’arrivée et la réponse, et les octets que l’appelant a reçus. |  |
| Identifiant de trace | L’identifiant de la requête, tiré d’un en-tête `x-request-id`, `x-trace-id` ou W3C `traceparent`, sinon un nouveau. | Une valeur d’en-tête qui n’est ni hexadécimale ni un UUID. |
| Enregistrements | Jusqu’à 20 identifiants d’enregistrements que l’appel a nommés ou produits : un contact, un message, une approbation. | Les enregistrements eux-mêmes. |
| Corps | Les arguments et la réponse, [nettoyés](https://tajo.io/fr/docs/mcp/#mcp-request-log), 4 Ko au maximum chacun. | Les secrets, le texte libre et les données personnelles listées plus bas. |

Trois de ces refus concernent le client, pas les données. Un nom d’outil, un code d’erreur et un identifiant de trace arrivent tous de l’extérieur. Chacun n’est conservé que sous une forme dont le serveur peut répondre. Un journal qui stocke tout ce que l’appelant a envoyé peut être rempli de n’importe quoi, y compris l’adresse e-mail d’un client dans la colonne du nom d’outil.

La question ouverte de Benjamin Eckel à la fin de la présentation était de savoir comment un collecteur sait « [que c’est un appel d’outil MCP qui a une erreur](https://www.youtube.com/watch?v=Lcqat4iP_lE&t=906s) ». Sur un seul serveur, la réponse est une colonne. `ok` vaut false, et le code dit quelle erreur.

## Les arguments : une règle que nous avons inversée

L’objection est juste, et c’est la nôtre. Journalisez les arguments et vous avez construit une seconde copie des données de vos clients, hors de portée de toute demande de suppression. Jusqu’au 18 octobre 2026, c’était [notre propre règle](https://tajo.io/fr/docs/mcp/#mcp-request-log). Le journal ne conservait ni les arguments ni le corps du résultat, parce que l’un comme l’autre peut contenir des données personnelles.

C’était le mauvais compromis. Un journal des requêtes qui ne peut pas montrer ce qui a été envoyé et ce qui est revenu ne peut pas répondre à la seule question pour laquelle il existe : pourquoi l’appel de mon agent a-t-il échoué ?

Les corps sont donc conservés, et la raison pour laquelle ils ne l’étaient pas est traitée autrement. Chaque corps passe par [un passage déterministe](https://tajo.io/fr/docs/mcp/#mcp-request-log) avant d’être mis en file.

- **Aucun secret ne survit.** Un champ dont le nom évoque token, mot de passe, secret, signature, cookie, session ou une vingtaine de mots semblables ne garde que `[secret]`. De même pour une valeur ayant une forme connue d’identifiant d’accès, où qu’elle apparaisse. Cela couvre les jetons bearer, les JWT, les clés privées, les URL contenant un mot de passe et toute suite opaque de 40 caractères de clé ou plus.
- **La prose n’est pas conservée du tout.** Un champ nommé `html`, `text`, `body`, `markdown` ou `content` ne garde que `[redacted]`. La prose contient des noms et des adresses postales qu’aucun motif ne repère.
- **Les données personnelles sont masquées pour de bon.** Un champ dont le nom signale une donnée personnelle, comme un e-mail, un téléphone, un nom, une adresse ou une note, ne garde que `[redacted]`. Une adresse e-mail, un numéro de téléphone, une carte ou un IBAN à l’intérieur de toute autre chaîne est masqué.
- **Les corps restent petits.** [Les chaînes sont coupées à 512 caractères](https://tajo.io/fr/docs/mcp/#mcp-request-log), les listes à 20 éléments, les objets à 50 clés et l’imbrication à 6 niveaux. Le corps entier est [coupé à 4 Ko](https://tajo.io/fr/docs/mcp/#mcp-request-log) et marqué comme tronqué.

Deux types d’appels conservent moins. Les contacts que la conversation d’une personne a apportés depuis une autre application sont journalisés sous forme d’un marqueur et d’un nombre, jamais d’un corps. Un appel qui lit le journal ne conserve aucune réponse, puisque la réponse ne serait que d’autres lignes du journal.

Maintenant, le coût. Le masquage est définitif, ce n’est pas un chiffrement avec une clé que quelqu’un détient. Le journal ne peut pas vous montrer l’adresse e-mail qui a rebondi. Il vous montre l’identifiant du contact, et le contact, soumis à ses propres règles, est à un appel de distance. Le journal se trouve hors du balayage d’effacement de l’espace de travail, c’est pourquoi le masquage ne peut pas attendre ce balayage.

## Pourquoi le journal n’est pas la piste d’audit

Tajo a déjà [un journal d’audit en ajout seul](https://tajo.io/fr/docs/mcp/#mcp-request-log). Chaque ligne porte un hachage de la ligne précédente, si bien qu’une modification n’importe où rompt la chaîne. Pourquoi ne pas y écrire les appels d’outils ?

Parce que la chaîne a un prix. Chaque ajout prend un verrou par espace de travail et lit la ligne précédente pour prolonger la chaîne. Y écrire chaque lecture mettrait les appels d’un espace de travail en file derrière un seul verrou. Cela noierait aussi les changements d’état que le journal d’audit existe pour montrer sous des milliers de lectures.

Les deux registres se partagent donc les questions. Le journal des requêtes dit ce qu’un agent a demandé et ce qui s’est passé, [pendant 30 jours](https://tajo.io/fr/docs/mcp/#mcp-request-log). Le journal d’audit dit ce qui a changé, qui l’a autorisé, et si quelqu’un a modifié l’enregistrement depuis.

Les approbations se trouvent du côté de l’audit. Sur les profils de connecteur de Tajo, [un outil propose prépare une action déclarée et un outil apply l’exécute une fois qu’elle est approuvée](https://tajo.io/fr/docs/mcp/). Rien n’atteint le fournisseur tant que la proposition n’est pas approuvée, par une personne ou par une règle que l’espace de travail a activée. La ligne de l’appel propose nomme, parmi ses enregistrements, l’approbation qu’il a créée. L’approbation elle-même est liée à une empreinte SHA-256 de l’entrée exacte. [Une approbation couvre l’entrée exacte que vous avez vue](https://tajo.io/fr/docs/mcp/agent-specification/) : changez un champ et elle ne correspond plus. Quand l’écriture aboutit, sa ligne d’audit conserve l’empreinte de l’entrée et une empreinte de la réponse du fournisseur, jamais les valeurs de cette réponse.

## Ce que coûte la ligne

Une ligne est une écriture en base de données, et une écriture a un commit. [Jusqu’au 8 octobre 2026](https://tajo.io/fr/docs/mcp/#mcp-request-log), chaque appel attendait son propre commit avant la réponse, environ 2,6 ms sur notre hôte. Pour un client, cela représentait un quart d’un petit appel d’outil.

Désormais, la ligne est construite à la fin de l’appel et mise en file. Un flush écrit la file [au plus 100 ms plus tard](https://tajo.io/fr/docs/mcp/#mcp-request-log), une transaction par espace de travail, si bien que de nombreux appels partagent un même commit. Rien ne change dans une ligne, pas même son horodatage. Si [5 000 lignes sont en attente](https://tajo.io/fr/docs/mcp/#mcp-request-log), l’appel suivant attend le flush au lieu de laisser tomber une ligne.

L’enregistrement ne fait jamais échouer un appel. Une écriture qui échoue est retentée ligne par ligne, puis journalisée et abandonnée. Ce qu’un arrêt brutal du processus perd, c’est ce qui se trouvait dans la file : [au plus les 100 dernières ms d’appels](https://tajo.io/fr/docs/mcp/#mcp-request-log).

## Relire le journal

[`logs.list`](https://tajo.io/fr/docs/mcp/#mcp-request-log) renvoie les appels de l’espace de travail, du plus récent au plus ancien, sans les corps. Il filtre par période, par résultat ou statut HTTP, par source (MCP ou l’API REST, qui partage la table) et par clé API. Il pagine par 50 par défaut, jusqu’à 100. `logs.get` renvoie un appel avec le nom actuel de la clé, son statut, sa durée, la requête et la réponse nettoyées, et les enregistrements qu’il a touchés.

Les deux ne lisent que l’espace de travail de l’appelant. Un identifiant de ligne provenant d’un autre espace de travail est introuvable.

Une erreur d’outil porte l’identifiant de la requête. Quand le serveur a créé cet identifiant, ou qu’il est arrivé en hexadécimal ou sous forme d’UUID, c’est l’identifiant de trace de la ligne. Un agent qui a reçu une erreur peut transmettre à une personne la seule valeur qui désigne l’appel.

## Ce qui est construit, et ce qui ne l’est pas

Construit, au moment où nous écrivons :

- Une ligne par `tools/call` sur le serveur de l’espace de travail et sur chaque serveur de connecteur, appels refusés et inconnus compris.
- [Identifiant de clé, serveur, connecteur, profil, outil, effet, résultat, durée, taille du résultat, identifiant de trace et jusqu’à 20 enregistrements touchés](https://tajo.io/fr/docs/mcp/#mcp-request-log).
- [Arguments et réponses nettoyés](https://tajo.io/fr/docs/mcp/#mcp-request-log), 4 Ko au maximum chacun.
- [`logs.list` et `logs.get`](https://tajo.io/fr/docs/mcp/#mcp-request-log), limités à l’espace de travail, avec 30 jours de conservation.
- Des approbations liées à une empreinte de l’entrée, et des écritures appliquées enregistrées avec les empreintes de l’entrée et de la sortie dans le journal d’audit chaîné par hachage.

Pas construit, et bon à savoir avant de vous y fier :

- Pas de score de santé, pas de graphique par outil et pas d’alerte sur un taux d’erreur en hausse. Un résumé par outil des appels, des erreurs et des durées les plus lentes [existe pour les opérateurs de Tajo](https://tajo.io/fr/docs/mcp/#mcp-request-log), sur aucune surface que vous puissiez ouvrir.
- `logs.list` ne peut pas filtrer par nom d’outil ni par identifiant de trace. Pour trouver la ligne derrière un identifiant de requête, restreignez par période et par clé.
- Les lignes ne sont pas exportées vers un système de traçage que vous gérez. L’identifiant de trace n’est lu que dans les en-têtes HTTP, pas dans le champ MCP `_meta` que la présentation utilisait pour [transporter le contexte de trace](https://www.youtube.com/watch?v=Lcqat4iP_lE&t=535s).
- [Après 30 jours, une ligne est supprimée](https://tajo.io/fr/docs/mcp/#mcp-request-log). Il n’y a ni archive ni export.
- Ce qui a été masqué ne peut pas être récupéré depuis le journal.
- [Un arrêt brutal peut perdre les 100 dernières ms de lignes](https://tajo.io/fr/docs/mcp/#mcp-request-log).

La présentation se concluait sur une observabilité dans MCP « [pas répartie de façon égale](https://www.youtube.com/watch?v=Lcqat4iP_lE&t=841s) ». Un tableau de bord en aval ne peut pas corriger cela, pas plus qu’une trace qui s’arrête à la porte du serveur. [Une synchronisation qui échoue a besoin de son propre enregistrement](https://tajo.io/fr/blog/worker-died-sync-didnt/) ; il en va de même pour chaque appel qui en a demandé une.

Le serveur a vu l’appel. Personne d’autre. Écrivez-le là.

## Questions fréquemment posées

**Que doit journaliser un serveur MCP pour chaque appel d’outil ?**

Une ligne par appel, écrite par le serveur : quelle clé API a appelé, quel serveur et quel connecteur, le nom de l’outil si l’outil existe, sa classe d’effet, ok ou un code d’erreur court, la durée, la taille du résultat, l’identifiant de trace de la requête, les identifiants des enregistrements que l’appel a nommés ou produits, et les arguments et la réponse, débarrassés des secrets et des données personnelles. Les serveurs MCP de Tajo écrivent cette ligne pour chaque tools/call, appels refusés compris, et la conservent 30 jours.

**Un journal des requêtes MCP doit-il conserver les arguments des outils ?**

Oui, nettoyés. Un journal sans les arguments ne peut pas dire pourquoi un appel a échoué. Tajo ne conservait aucun corps jusqu’au 18 octobre 2026 et conserve désormais les deux, après un passage déterministe : les secrets deviennent \[secret\], le texte libre et les champs personnels deviennent \[redacted\], les e-mails, téléphones, cartes et IBAN sont masqués, et chaque corps est coupé à 4 Ko. Le masquage est définitif, si bien que le journal renvoie à l’enregistrement par son identifiant au lieu de le copier.

**Pourquoi séparer le journal des appels d’outils MCP du journal d’audit ?**

Parce qu’ils répondent à des questions différentes, à des coûts différents. Le journal d’audit de Tajo est une chaîne de hachage des changements d’état, et chaque ajout prend un verrou par espace de travail pour prolonger la chaîne. Y écrire chaque lecture mettrait les appels d’un espace de travail en file derrière ce verrou et noierait les changements parmi les lectures. Les appels d’outils vont dans une table séparée, sans chaîne, conservée 30 jours ; les écritures qu’un appel prépare laissent toujours leurs propres lignes d’audit.

## Articles connexes

### [Qu’est-ce qu’un serveur MCP ? Comment fonctionnent MCP et MCP UI en 2026](https://tajo.io/fr/blog/what-is-an-mcp-server/)

3 oct. 2026 · 16 min de lecture

Étape 1 → Étape 6

### [Grok Bot et Brevo : informer les clients après une demande de fonctionnalité](https://tajo.io/fr/blog/grok-bot-brevo-product-feedback/)

7 oct. 2026 · 5 min de lecture

3 sections

### [MCP ou CLI, c’est la mauvaise question. Demandez où vit l’état.](https://tajo.io/fr/blog/mcp-or-cli-is-the-wrong-question/)

4 nov. 2026 · 8 min de lecture

5 sections
