ALLER AU CONTENU
AGENTS IA6 minAgents en production / Ép. 11 · Niveau 11-3

Handles MCP : garder un travail entre deux appels, sans doublon

Votre import s’étend sur plusieurs appels d’outil, et après une coupure, le client renvoie une écriture. Comment le serveur garde-t-il le travail sans l’écrire deux fois ?

XIN
Scène nocturne en pixel art : une rangée d’armoires de serveurs identiques, sans bagage à côté. Chaque enveloppe lumineuse qui arrive sur un tapis roulant porte son propre petit sac à dos, et une clé de coffre turquoise pend à l’une des enveloppes.

EN 30 SECONDES

Un handle est un identifiant que le serveur MCP émet pour un travail qui dure plusieurs appels, comme un import ; le client le repasse en argument d’outil. Dans ma conception, le serveur vérifie à qui il appartient, et une clé d’idempotence empêche qu’une écriture rejouée soit appliquée deux fois.

À RETENIR · 3

  • Le changelog 2026-07-28 range l’état entre appels dans des « handles explicites, émis par le serveur et passés comme des arguments d’outil ordinaires ».
  • Ma proposition : un handle est difficile à deviner, a un propriétaire et une expiration, et il est refusé si quelqu’un d’autre le présente.
  • Un flux de réponse coupé se présente comme une nouvelle requête, avec un nouvel identifiant. Dans ma conception, c’est la clé d’idempotence, pas cet identifiant, qui repère la répétition.
Sur cette page

L’état entre appels devient un handle

EN BREF Dans ma conception, ce qui doit survivre à un appel vit dans votre stockage, et le client en renvoie le handle à chaque appel.

Ce que je marque comme proposition est mon avis, pas le standard. Le contrôle de l’appelant suppose un serveur HTTP qui vérifie chaque appel. Or la spec laisse l’autorisation au choix.

LES MOTS À CONNAÎTRE

Handle
Un identifiant que le serveur émet pour un objet qui dure plusieurs appels, comme un import ou une tâche.
Principal
L’utilisateur ou le service au nom de qui agit une requête, indiqué par son jeton d’accès.
Clé d’idempotence
Une valeur qui désigne un travail précis, pour que le serveur repère une répétition et ne refasse pas ce travail.
JSON-RPC
Le format de message de MCP. Chaque requête indique la méthode, les paramètres et un identifiant.

Un import en plusieurs étapes, un brouillon construit sur plusieurs outils, une tâche longue : chacun a besoin de ce que le changelog appelle des « handles explicites, émis par le serveur et passés comme des arguments d’outil ordinaires ».

Indexé par session

Une table par processus, qui associe chaque identifiant de session à un import. Elle casse quand une relance tombe sur une autre instance, quand le processus redémarre, ou quand deux conversations partagent une connexion stdio. L’état peut alors se mélanger ou se perdre sans bruit, et les logs ne diront pas forcément lequel des deux.

Indexé par handle

start_import renvoie imp_7KQ2M9. La ligne est enregistrée dans un stockage partagé, avec son propriétaire et une expiration. Chaque appel suivant passe le handle, le serveur vérifie que l’appelant en est propriétaire, et chaque ligne de log le nomme.

Mes règles pour un Handle Un identifiant que le serveur émet pour un objet qui dure plusieurs appels, comme un import ou une tâche. Voir le glossaire, à titre de proposition : le serveur l’émet, et ce handle devrait être impossible à deviner. Le stockage garde son propriétaire, le Principal L’utilisateur ou le service au nom de qui agit une requête, indiqué par son jeton d’accès. Voir le glossaire qui l’a créé, et refuse tout autre appelant. Il a une date d’expiration.

LE CONTRÔLE DU PROPRIÉTAIRE

Diagramme de flux : 5 étapesDiagramme de flux : 5 étapes. Un appel arrive avec un handle, puis Qui appelle ?. Qui appelle ?, puis L’appelant en est-il propriétaire ?. L’appelant en est-il propriétaire ?, puis Toujours valide ?. Toujours valide ?, puis Exécuter l’outil.1Un appel arrive avec unhandle2Qui appelle ?D’après le jeton d’accès3L’appelant en est-ilpropriétaire ?Le stockage connaît lepropriétaire4Toujours valide ?Pas expiré5Exécuter l’outil

Étape 1. Un appel arrive. user-7 envoie un appel avec imp_7KQ2M9, un handle valide ouvert par user-42.

Choisissez une étape pour la voir bouger
  1. Un appel arrive user-7 envoie un appel avec imp_7KQ2M9, un handle valide ouvert par user-42.
  2. Qui appelle ? Le jeton d’accès dit user-7.
  3. Pas le propriétaire : refusé D’après le stockage, le propriétaire est user-42 : le serveur rejette l’appel. Un handle valide ne donne aucun droit.
  4. Le propriétaire Quand user-42 l’envoie, le propriétaire correspond et le handle n’a pas expiré.
  5. Exécution L’outil s’exécute sur l’import stocké.
Les contrôles que je propose pour un handle, avec des utilisateurs fictifs. C’est le contrôle du propriétaire qui arrête user-7.

Traitez un handle comme n’importe quel argument non fiable. Le modèle, côté client, peut en coller un là où il n’a rien à faire. C’est la règle du moindre privilège pour les agents qui déplacent de l’argent : on contrôle à l’entrée du serveur.

Un exemple concret : une écriture reçue deux fois

EN BREF Dans ma conception, ce sont le handle et la clé d’idempotence, et non l’identifiant JSON-RPC, qui permettent de repérer une même écriture reçue deux fois.

La version 2026-07-28 supprime la reprise des flux. Si le flux de réponse se coupe, la spécification dit que le client « doit (MUST) réémettre la requête comme une nouvelle requête, avec un nouvel identifiant de requête ».

ADAM explique : Un outil qui modifie des données peut donc recevoir le même appel deux fois. Sans clé d’idempotence, une écriture peut devenir deux.

Dans ma conception, chaque outil qui écrit reçoit une Clé d’idempotence Une valeur qui désigne un travail précis, pour que le serveur repère une répétition et ne refasse pas ce travail. Voir le glossaire.

UN EXEMPLE CONCRET

Chiffres illustratifs

VALIDÉuser-42 ajoute des lignes à un import

ENTRÉE

Appel
append_rows, id 42
Handle
imp_7KQ2M9
Clé d’idempotence
b1c0e6
Jeton d’accès
user-42

CE QUI SE PASSE

  1. Le jeton identifie l’appelant : user-42.
  2. Le stockage indique que imp_7KQ2M9 appartient à user-42 et n’a pas expiré.
  3. La clé b1c0e6 est nouvelle pour ce handle : les lignes sont ajoutées.

SORTIE

Résultat
lignes ajoutées

PAS ÉCRIT DEUX FOISLe flux se coupe, le client renvoie l’appel

ENTRÉE

Appel
même appel, nouvel id 43
Clé d’idempotence
b1c0e6 (inchangée)

CE QUI SE PASSE

  1. Le nouvel identifiant JSON-RPC ne révèle pas la répétition : la spécification en impose un nouveau.
  2. Le serveur trouve b1c0e6 déjà enregistrée pour imp_7KQ2M9 et renvoie le résultat stocké.

SORTIE

Lignes ajoutées
aucune, la première écriture fait foi

EN CLAIR

L’identifiant JSON-RPC Le format de message de MCP. Chaque requête indique la méthode, les paramètres et un identifiant. Voir le glossaire sert toujours à relier une réponse à sa requête. L’outil, le handle et la clé relèvent de ma conception, avec des valeurs fictives.

Dans ma conception, la clé est enregistrée pour chaque handle, à côté du résultat de la première écriture.

OBJET OBTENU

La clé repère la répétition

Un appel renvoyé a un nouvel identifiant JSON-RPC : dans ma conception, seule la clé d’idempotence dit au serveur qu’il a déjà fait cette écriture.

Sources : changelog, Streamable HTTP, lues le 7 octobre 2026.

NIVEAU TERMINÉ

Ce que vous savez maintenant

  • Pourquoi, dans ma conception, un handle valide ne donne aucun droit : le serveur vérifie à qui il appartient.
  • Pourquoi l’identifiant JSON-RPC ne repère pas une écriture rejouée, et ce qui la repère.

Vérifiez par vous-même

Touchez ou cliquez une question pour voir la réponse.

Un client relance une écriture avec la même clé d’idempotence, mais un autre handle. Le serveur doit-il y voir une répétition ?

Non. Dans ma conception, la clé est enregistrée pour chaque handle : un autre handle, c’est un autre travail, dont le propriétaire est contrôlé comme pour tout appel.

Niveau suivant :Que doit journaliser un serveur MCP sans état à chaque requête, et comment préparer la bascule ?7 min
Adam Boudjemaa
Adam Boudjemaa

Ancien CTO d’Integra. Auteur nommé (1 sur 5) d’ERC-3643, premier auteur d’ERC-6960, co-auteur d’ERC-7410 et co-auteur d’ERC-8203, encore à l’état de brouillon. Conçoit des systèmes d’IA en production et des systèmes Web3 régulés.

Un projet à livrer ou un poste à pourvoir ?

Parlons de votre besoin
Suivre les notes techniques

Recevez les nouveaux articles sur l’IA en production et les smart contracts par email.