ALLER AU CONTENU
AGENTS IA7 minAgents en production / Ép. 11 · Niveau 11-2

MCP sans session : demander une info en cours d’appel

Votre outil a besoin d’une réponse de l’utilisateur en plein appel, et la relance peut tomber sur une autre instance. Comment l’appel reprend-il là où il s’était arrêté ?

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

Les Multi Round-Trip Requests (MRTR) sont la façon dont un serveur MCP pose une question en plein appel, dans la version 2026-07-28 : il renvoie input_required, et le client relance avec les réponses. Le travail inachevé peut voyager dans un requestState scellé, vérifié à chaque relance.

À RETENIR · 3

  • MRTR remplace l’élicitation et le sampling que le serveur déclenchait : il renvoie input_required, et le client relance.
  • Le requestState transite par le client : la spécification demande de le traiter comme contrôlé par un attaquant, et de le protéger, par exemple avec HMAC ou AEAD, s’il influence l’autorisation ou la logique métier.
  • Le lier au principal et à la requête, avec une courte expiration, borne le rejeu. L’usage unique exige un contrôle côté serveur.
Sur cette page

Demander une information en cours d’appel, étape par étape

EN BREF Avec MRTR, le serveur peut confier son travail inachevé au client dans un requestState facultatif : la relance peut arriver sur n’importe quelle instance.

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

Élicitation
La demande d’information que le serveur adresse à l’utilisateur au milieu d’un appel d’outil.
requestState
Un jeton facultatif et opaque que le serveur renvoie quand il lui faut une saisie. Le client le renvoie tel quel en relançant l’appel.
Principal
L’utilisateur ou le service au nom de qui agit une requête, indiqué par son jeton d’accès.

Élicitation La demande d’information que le serveur adresse à l’utilisateur au milieu d’un appel d’outil. Voir le glossaire passait par une requête envoyée sur un flux ouvert. Il fallait donc que le même processus soit encore là au retour de la réponse. Le sampling, où le serveur fait appel à un modèle via le client, marchait pareil.

Le mécanisme Multi Round-Trip Requests (MRTR) remplace les deux. Son but affiché : fonctionner

« sans exiger de couche de stockage partagée entre les instances du serveur ni de répartition de charge avec état ».

Spécification MCP 2026-07-28, MRTR

UN APPEL, DEUX INSTANCES

Diagramme de séquence : 4 participants : Appli d’IA, Répartiteur, Instance A, Instance BDiagramme de séquence : 4 participants : Appli d’IA, Répartiteur, Instance A, Instance B. Étape 1 : Appli d’IA vers Répartiteur, Appeler un outil (id 1). Étape 2 : Répartiteur vers Instance A, Vers n’importe quelle instance saine. Étape 3 : Instance A vers Appli d’IA, Saisie requise : une question et un état scellé. Étape 4 : Appli d’IA vers lui-même, Interroger l’utilisateur, recueillir les réponses. Étape 5 : Appli d’IA vers Répartiteur, Relance (id 2) : réponses et le même état. Étape 6 : Répartiteur vers Instance B, Tombe sur une autre instance. Étape 7 : Instance B vers lui-même, Vérifier sceau, appelant, expiration et requête. Étape 8 : Instance B vers Appli d’IA, Terminé : le résultat. Étape 9 : Répartiteur vers Instance B, Une relance à l’état modifié.APPLI D’IA > RÉPARTITEURAppeler un outil (id 1)RÉPARTITEUR > INSTANCE AVers n’importe quelle instancesaineINSTANCE A > APPLI D’IASaisie requise : une questionet un état scelléA ne garde rienAPPLI D’IA > APPLI D’IAInterroger l’utilisateur,recueillir les réponsesAPPLI D’IA > RÉPARTITEURRelance (id 2) : réponses etle même étatRÉPARTITEUR > INSTANCE BTombe sur une autre instanceINSTANCE B > INSTANCE BVérifier sceau, appelant,expiration et requêteINSTANCE B > APPLI D’IATerminé : le résultatRÉPARTITEUR > INSTANCE BUne relance à l’état modifié

Étape 1. Premier appel. L’appli appelle un outil avec l’identifiant 1. Le répartiteur choisit l’instance A.

Choisissez une étape pour la voir bouger
  1. Premier appel L’appli appelle un outil avec l’identifiant 1. Le répartiteur choisit l’instance A.
  2. Demande de saisie A répond input_required, avec une question et un requestState scellé. Puis elle oublie l’appel.
  3. Question à l’utilisateur L’appli interroge l’utilisateur et recueille ses réponses, les inputResponses.
  4. Relance L’appli renvoie le même appel avec un nouvel identifiant (2), les réponses et le requestState tel quel. La relance arrive sur B.
  5. Vérifier, puis répondre B vérifie le sceau, l’appelant, l’expiration et l’appel de départ, puis renvoie le résultat avec resultType complete.
  6. Modifié : refusé Une relance dont le requestState a été modifié échoue au contrôle du sceau. B la rejette et n’exécute rien.
La relance tombe sur une autre instance, qui reprend à partir de ce que porte la requête. La dernière étape montre un refus.

La relance reçoit un nouvel identifiant : cet identifiant ne permet donc pas de la relier au premier appel. C’est l’empreinte de l’appel de départ, scellée dans l’état, qui s’en charge.

Le sampling est d’ailleurs marqué obsolète (Deprecated) dans la version 2026-07-28, comme Roots et Logging, avec une période d’au moins 12 mois. Ils marchent encore, mais les nouvelles implémentations ne devraient pas les ajouter.

Pourquoi le serveur vérifie l’état scellé

EN BREF Comme requestState transite par le client, les serveurs « doivent (MUST) traiter requestState comme une entrée contrôlée par un attaquant ».

CE QUE LE SERVEUR VÉRIFIE À LA RELANCE
Diagramme de flux : 5 étapesDiagramme de flux : 5 étapes. Sceau intact ?, puis Même appelant ?. Même appelant ?, puis Pas expiré ?. Pas expiré ?, puis Même requête ?. Même requête ?, puis Reprendre l’appel.1Sceau intact ?Personne ne l’a modifié enroute2Même appelant ?L’appelant scellé est celuidu jeton d’accès3Pas expiré ?La courte expiration n’estpas dépassée4Même requête ?L’empreinte scelléecorrespond à l’appel relancé5Reprendre l’appel
Les trois liens sont ce que recommande la spécification. L’ordre est ma proposition. Tout contrôle raté rejette l’état.

S’il « influence l’autorisation, l’accès aux ressources ou la logique métier », le serveur doit le protéger contre toute modification, par exemple avec HMAC ou AEAD.

EN CLAIR

HMAC est un sceau calculé avec une clé secrète, qui révèle toute retouche. AEAD est un chiffrement qui la détecte aussi.

ADAM explique : Un sceau n’est pas un secret : avec HMAC seul, le client peut encore lire le contenu. S’il ne doit pas le lire, prenez AEAD.

Contre le rejeu (le même état renvoyé une deuxième fois), la spécification recommande de sceller trois choses dans cet état : 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 authentifié, une courte durée de vie et l’identifiant de la requête de départ.

OBJET OBTENU

Une entrée à traiter comme hostile

Le requestState revient par le client : le serveur le vérifie avant de s’y fier.

Ces liens bornent le rejeu, sans rendre l’état à usage unique. Un usage unique exige un contrôle côté serveur.

SealedState (mon esquisse, hors spécification)
substring

Le principal, tiré du jeton d’accès

expnumber

L’expiration. Gardez-la courte

reqstring

Méthode, nom de l’outil et empreinte des arguments de départ

dataunknown

Ce dont le serveur a besoin pour reprendre

Le nom de l’outil compte : tous les outils partagent la méthode tools/call. Calculez l’empreinte sur un encodage JSON canonique des arguments, pour que l’ordre des clés ne la change pas.

Sources : MRTR, changelog, lues le 7 octobre 2026.

FAQ

HMAC garantit l’intégrité, pas le secret : une charge utile seulement encodée en base64 se décode. Si le client ne doit pas lire l’état, prenez AEAD. Mon conseil dans les deux cas : changez de clé à dates fixes, avec une période de chevauchement, car chaque instance doit vérifier ce qu’une autre a scellé.

NIVEAU TERMINÉ

Ce que vous savez maintenant

  • Comment MRTR permet à n’importe quelle instance de finir un appel qui demandait une saisie.
  • Pourquoi le serveur vérifie l’état renvoyé avant de s’y fier.

Vérifiez par vous-même

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

Le client d’un même utilisateur renvoie deux fois un requestState valide, inchangé, avant son expiration. Le sceau bloque-t-il la deuxième relance ?

Pas à lui seul. Le sceau prouve que personne ne l’a modifié, et l’expiration limite la fenêtre. Bloquer un deuxième usage exige que le serveur note que l’état a déjà servi.

Niveau suivant :Où va le travail qui doit durer plus d’un appel, et comment le serveur évite-t-il de l’écrire deux fois ?6 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.