Retour aux vidéos

Épisode 001 · Tutoriels IA

Migrer un serveur MCP vers la spécification sans session

Une migration exécutable des sessions MCP liées à la connexion vers un contexte par requête, des identifiants explicites et autorisés, une compatibilité bi-version et cinq tests de validation.

Par Hamza Diaz
5 min de vidéo3 min de lecture

Note de terrain

Pour prendre en charge MCP 2026-07-28, supprimez les sessions de protocole, Mcp-Session-Id et la dépendance moderne à initialize. Placez version et capacités dans chaque requête, implémentez server/discover et rendez la continuité métier explicite au moyen d’identifiants opaques et autorisés fournis comme arguments ordinaires. Isolez l’ancienne voie initialize, puis exigez la réussite des cinq tests entre connexions et utilisateurs.

Ce que le test nous apprend

Pour prendre en charge MCP 2026-07-28, supprimez les sessions de protocole, Mcp-Session-Id et la dépendance moderne à initialize. Placez version et capacités dans chaque requête, implémentez server/discover et rendez la continuité métier explicite au moyen d’identifiants opaques et autorisés fournis comme arguments ordinaires. Isolez l’ancienne voie initialize, puis exigez la réussite des cinq tests entre connexions et utilisateurs.

Transcription

Si votre serveur MCP crée encore une session, renvoie Mcp-Session-Id et attend notifications/initialized, il suit l’ancien modèle. Migrer vers la spécification 2026-07-28 ne consiste pas à déplacer cette session dans Redis. Chaque requête doit pouvoir être comprise seule.

Voici le résultat visé : l’appel transporte la version du protocole et les capacités du client dans _meta ; en HTTP, il transporte aussi MCP-Protocol-Version. Le serveur valide puis exécute sans mémoire liée à la connexion. Si un parcours exige une continuité, le serveur émet un identifiant explicite que le client fournit comme argument ordinaire de l’outil suivant.

Le journal officiel annonce deux ruptures majeures. Les sessions de protocole et l’en-tête Mcp-Session-Id disparaissent de Streamable HTTP ; tools/list, resources/list et prompts/list ne varient plus selon la connexion. Pour la révision moderne, l’échange initialize puis notifications/initialized disparaît également. Version, capacités et identité deviennent des métadonnées de chaque requête. C’est l’exigence normative. Notre recommandation est de conserver uniquement l’état métier utile, avec propriétaire, autorisation et expiration explicites.

Migrons un serveur de rapports. L’ancien gestionnaire lisait Mcp-Session-Id, retrouvait une session et y plaçait le brouillon. Supprimons le lecteur d’en-tête, le middleware, la table de sessions et le drapeau initialized. Ajoutons un validateur commun qui lit protocolVersion et clientCapabilities dans _meta. En HTTP, comparons avec MCP-Protocol-Version. Si la version n’est pas prise en charge, renvoyons UnsupportedProtocolVersionError et les versions disponibles, sans deviner silencieusement.

create_report renvoie désormais reportHandle, par exemple rpt_7K2. Ce n’est pas une session rebaptisée : c’est une référence explicite au rapport. update_report exige cet argument. Le serveur vérifie le propriétaire, applique une expiration et ne conserve que l’état nécessaire. L’identifiant doit être opaque et imprévisible, jamais une clé de base de données exposée.

Ajoutons server/discover pour annoncer versions, capacités et identité. Pendant une transition, un serveur bi-compatible peut reconnaître la voie moderne grâce à _meta et isoler l’ancienne voie initialize. L’état historique ne doit jamais modifier les listes modernes.

Le test comporte cinq contrôles : tools/list fonctionne sans initialize ni en-tête de session ; une nouvelle connexion reçoit le même catalogue ; create_report fournit un identifiant et update_report ne réussit qu’avec lui, même sur une autre connexion ; une version non prise en charge produit l’erreur prévue ; enfin, la voie moderne n’attend pas notifications/initialized. Deux utilisateurs en parallèle prouvent aussi qu’un identifiant ne donne pas accès au rapport de l’autre.

Le score de passage est cinq sur cinq : aucun Mcp-Session-Id, aucune dépendance moderne à initialize, métadonnées par requête, identifiants explicites et autorisés, tests entre connexions. Stateless ne signifie pas « aucune donnée métier » ; cela signifie « aucun état de protocole caché dans la connexion ». Joignez les sources officielles à la pull request et verrouillez les tests sur 2026-07-28. Optijara peut vous aider à concevoir la frontière de compatibilité et le plan de preuve.