{"id":38383,"date":"2026-02-18T12:08:55","date_gmt":"2026-02-18T11:08:55","guid":{"rendered":"https:\/\/leocare.eu\/fr\/?post_type=leocare_lab&#038;p=38383"},"modified":"2026-02-18T21:25:14","modified_gmt":"2026-02-18T20:25:14","slug":"ouvrir-backend-aux-llm","status":"publish","type":"leocare_lab","link":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/","title":{"rendered":"Comment nous avons ouvert notre backend aux LLM avec MCP"},"content":{"rendered":"\n<p>Les LLMs deviennent utiles quand ils lisent vos donn\u00e9es et d\u00e9clenchent des actions, sans bricolage ni prise de risque. Le Model Context Protocol (MCP) standardise la passerelle entre un assistant et votre backend: des outils (tools) d\u00e9clar\u00e9s, d\u00e9couverts \u00e0 la vol\u00e9e, permissionn\u00e9s et auditables. <strong>Cet article propose de faire d\u00e9couvrir comment fonctionne un serveur MCP et d\u2019offrir des pistes de r\u00e9flexion pour savoir quoi exposer<\/strong> (lecture s\u00fbre vs actions), comment ma\u00eetriser la taille des r\u00e9ponses pour contr\u00f4ler les tokens, et quels garde\u2011fous poser (OAuth\/OIDC, scopes, quotas, relance sans doublon, audit).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le MCP expliqu\u00e9 en 2 minutes<\/h2>\n\n\n\n<p>MCP est un protocole. Le client (assistant\/IDE) ouvre une session, d\u00e9couvre vos capacit\u00e9s et d\u00e9crit les appels possibles.<strong> Le serveur MCP expose des tools (actions) et des resources (donn\u00e9es) au travers de sch\u00e9mas clairs qui pr\u00e9cisent entr\u00e9es\/sorties et erreurs. <\/strong>Les prompts et la session encadrent l\u2019\u00e9change et permettent aux clients de cadrer l\u2019usage attendu.<\/p>\n\n\n\n<p><strong>C\u00f4t\u00e9 positionnement, MCP ne remplace pas votre logique m\u00e9tier<\/strong> : il standardise la fa\u00e7on d\u2019annoncer et d\u2019appeler des outils, \u00e0 la mani\u00e8re de LSP (Language Server Protocol) pour les IDE : LSP permet \u00e0 des \u00e9diteurs (VS Code, Vim, IntelliJ) de dialoguer avec des \u00ab serveurs de langage \u00bb (TypeScript, Python, etc.) via un protocole commun pour l\u2019autocompl\u00e9tion, les diagnostics et la navigation. <strong>Cela r\u00e9duit les int\u00e9grations ad hoc, am\u00e9liore l\u2019interop\u00e9rabilit\u00e9 et facilite la s\u00e9curit\u00e9 et l\u2019observabilit\u00e9.<\/strong><\/p>\n\n\n\n<p>Le flux minimal ressemble \u00e0 ceci :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ouverture de session<\/li>\n\n\n\n<li>d\u00e9couverte des tools<\/li>\n\n\n\n<li>proposition d\u2019appel par le LLM<\/li>\n\n\n\n<li>validation c\u00f4t\u00e9 client<\/li>\n\n\n\n<li>ex\u00e9cution c\u00f4t\u00e9 serveur<\/li>\n\n\n\n<li>r\u00e9ponse compacte. <\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/flux-schema-mcp.svg\" alt=\"flux schema MCP\" class=\"wp-image-38385\"\/><\/figure>\n\n\n\n<p>\u00c0 chaque \u00e9tape, vous gardez la main sur les permissions, les limites de temps et de taille, et le format des retours.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9couverte vs ex\u00e9cution<\/h2>\n\n\n\n<p>Avant toute action, le client passe par une phase de d\u00e9couverte avec <code>tools\/list<\/code> :<strong> il r\u00e9cup\u00e8re la liste des outils expos\u00e9s par le serveur ainsi que leurs sch\u00e9mas JSON (contrats de validation JSON).<\/strong> Cela fournit un inventaire clair des outils disponibles et des param\u00e8tres attendus; le LLM et l\u2019application savent alors ce qui est faisable et avec quels param\u00e8tres.<\/p>\n\n\n\n<p>Une fois un outil pertinent identifi\u00e9, on passe \u00e0 l\u2019ex\u00e9cution avec <code>tools\/call<\/code> : <strong>le client appelle ce tool par son nom en fournissant des arguments valid\u00e9s; le serveur renvoie alors un <code>result<\/code> conforme au sch\u00e9ma, ou bien un <code>error<\/code> structur\u00e9 si quelque chose ne va pas. <\/strong>Les exemples ci\u2011dessous illustrent d\u2019abord la d\u00e9couverte (<code>tools\/list<\/code>), puis l\u2019ex\u00e9cution (<code>tools\/call<\/code>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple tools\/list :<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Appel de d\u00e9couverte des outils (tools\/list): le client r\u00e9cup\u00e8re l\u2019inventaire des tools expos\u00e9s\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 0,\n  \"method\": \"tools\/list\", \/\/ m\u00e9thode de d\u00e9couverte\n  \"params\": {} \/\/ aucun param\u00e8tre requis\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ R\u00e9ponse (extrait): inventaire des outils et de leurs sch\u00e9mas d'entr\u00e9e\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 0,\n  \"result\": {\n    \"tools\": &#91;\n      {\n\t      \/\/ nom du tool (utilis\u00e9 dans tools\/call)\n        \"name\": \"searchFlights\", \n        \/\/ \u00e0 quoi sert l'outil (recherche d'options de vol)\n        \"description\": \"Search for available flights\", \n        \/\/ sch\u00e9ma JSON des arguments attendus par le tool\n        \"inputSchema\": { \n          \"type\": \"object\",\n          \"properties\": {\n\t          \/\/ ville\/code a\u00e9roport d'origine (ex: \"NYC\")\n            \"origin\": { \n\t            \"type\": \"string\" \n            }, \n            \/\/ ville\/code a\u00e9roport de destination (ex: \"BCN\")\n            \"destination\": { \n\t            \"type\": \"string\"\n            }, \n            \"date\": { \/\/ date de d\u00e9part (ISO 8601, YYYY-MM-DD)\n\t            \"type\": \"string\", \n\t            \"format\": \"date\" \n\t          }\n          },\n          \"required\": &#91;\"origin\", \"destination\", \"date\"] \/\/ champs obligatoires\n        }\n      }\n    ]\n  }\n}<\/code><\/pre>\n\n\n\n<section class=\"wp-block-leocare-bon-a-savoir leocare-bas\"><div class=\"leocare-bas__head\"><img decoding=\"async\" class=\"leocare-bas__icon\" src=\"https:\/\/leocare.eu\/fr\/wp-content\/themes\/leocare-new\/assets\/img\/icon-alert-purple.svg\" alt=\"icon alerte\"\/><h3 class=\"leocare-bas__title\">Bon \u00e0 savoir<\/h3><\/div><div class=\"leocare-bas__content\">\n<p>Un client appelle un tool par son nom via <code>tools\/call<\/code> avec des arguments JSON valid\u00e9s; le serveur renvoie un objet JSON conforme au sch\u00e9ma attendu via <code>result<\/code>, ou un objet <code>error<\/code> structur\u00e9. Voir aussi <code>tools\/list<\/code> pour la d\u00e9couverte.<\/p>\n<\/div><\/section>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple tools\/call<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Appel d\u2019un tool (client \u2192 serveur)\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \/\/ m\u00e9thode appel\u00e9e\n  \"method\": \"tools\/call\", \n  \"params\": {\n\t  \/\/ nom exact du tool\n    \"name\": \"searchFlights\",\n    \/\/ param\u00e8tres valid\u00e9s selon le sch\u00e9ma d\u2019entr\u00e9e\n    \"arguments\": { \n\t    \"origin\": \"NYC\", \n\t    \"destination\": \"BCN\", \n\t    \"date\": \"2025-06-15\" \n\t   } \n  }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ R\u00e9ponse OK (serveur \u2192 client)\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"result\": {\n    \"items\": &#91;\n      { \n\t      \"id\": \"FL-1234\", \n\t      \"airline\": \"Iberia\", \n\t      \"price\": \"350 \u20ac\", \n\t      \"departAt\": \"2025-06-15T10:10:00Z\", \n\t      \"arriveAt\": \"2025-06-15T22:05:00Z\" \n\t     }\n    ],\n    \/\/ pagination: curseur pour r\u00e9cup\u00e9rer la page suivante\n    \"nextCursor\": \"eyJwYWdlIjoyfQ==\"\n  }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ R\u00e9ponse en erreur (serveur \u2192 client)\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"error\": {\n\t  \/\/ code (ex: -32602 = invalid params)\n    \"code\": -32602, \n    \/\/ message court\n    \"message\": \"Le champ 'date' doit \u00eatre au format YYYY-MM-DD\",\n    \/\/ data optionnels (prochain pas)\n    \"data\": { \"next\": \"corriger 'date' (ex: 2025-06-15) et relancer\" }\n  }\n}<\/code><\/pre>\n\n\n\n<section class=\"wp-block-leocare-bon-a-savoir leocare-bas\"><div class=\"leocare-bas__head\"><img decoding=\"async\" class=\"leocare-bas__icon\" src=\"https:\/\/leocare.eu\/fr\/wp-content\/themes\/leocare-new\/assets\/img\/icon-alert-purple.svg\" alt=\"icon alerte\"\/><h3 class=\"leocare-bas__title\">Important<\/h3><\/div><div class=\"leocare-bas__content\">\n<p>Concernant la d\u00e9couverte dynamique :<strong> les clients MCP rafra\u00eechissent g\u00e9n\u00e9ralement la liste des tools \u00e0 l\u2019ouverture de session.<\/strong> Pr\u00e9voyez un m\u00e9canisme de rechargement\/r\u00e9\u2011annonce apr\u00e8s d\u00e9ploiement (certains clients mettent en cache la liste des outils et leurs sch\u00e9mas pendant quelques minutes).<\/p>\n<\/div><\/section>\n\n\n\n<h2 class=\"wp-block-heading\">Empreinte tokens et fen\u00eatre de contexte<\/h2>\n\n\n\n<p><strong>La \u00ab fen\u00eatre de contexte \u00bb d\u00e9signe la quantit\u00e9 maximale d\u2019informations qu\u2019un mod\u00e8le peut prendre en compte \u00e0 un instant donn\u00e9. <\/strong>Elle s\u2019exprime en tokens et inclut tous les \u00e9l\u00e9ments envoy\u00e9s au mod\u00e8le (messages syst\u00e8me\/utilisateur, r\u00e9sultats de tools, ressources, prompts) ainsi qu\u2019une partie de la r\u00e9ponse g\u00e9n\u00e9r\u00e9e. Si l\u2019on d\u00e9passe cette capacit\u00e9, le mod\u00e8le doit tronquer ou oublier des \u00e9l\u00e9ments plus anciens. <strong>Plus on injecte de texte, moins il reste d\u2019espace pour le raisonnement et la r\u00e9ponse;<\/strong> d\u2019o\u00f9 l\u2019importance de r\u00e9ponses compactes. La taille de cette fen\u00eatre varie selon les mod\u00e8les.<\/p>\n\n\n\n<p>Sur les co\u00fbts, l\u2019essentiel vient des contenus inject\u00e9s dans cette fen\u00eatre : r\u00e9sultats de tools\/resources et prompts c\u00f4t\u00e9 client. <strong>\u00c0 l\u2019inverse, les messages du protocole et le simple fait d\u2019appeler un tool p\u00e8sent peu.<\/strong><\/p>\n\n\n\n<p>Deux rep\u00e8res simples aident \u00e0 se situer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>~1 token \u2248 3\u20134 caract\u00e8res<\/li>\n\n\n\n<li>2 Ko de JSON \u2248 ~500 tokens<\/li>\n<\/ul>\n\n\n\n<p><strong>Par exemple, une r\u00e9ponse <code>searchFlights<\/code> qui renvoie 10 options avec 5 champs courts chacun<\/strong> (~300 caract\u00e8res au total) co\u00fbte \u2248 80\u2013120 tokens. La m\u00eame r\u00e9ponse avec 15 champs riches (r\u00e8glement bagages, conditions tarifaires d\u00e9taill\u00e9es), descriptions longues et politiques imbriqu\u00e9es peut d\u00e9passer 2\u20134 Ko, soit 500\u20131\u202f000 tokens, saturant vite la fen\u00eatre si elle s\u2019accumule.<\/p>\n\n\n\n<p><strong>En pratique, visez des r\u00e9ponses &lt; 10\u201320 Ko et n\u2019autorisez plus que via pagination ou r\u00e9sum\u00e9.<\/strong> Si l\u2019assistant a besoin de d\u00e9tails, faites\u2011le en deux temps : renvoyer d\u2019abord une liste compacte, puis un appel cibl\u00e9 pour l\u2019\u00e9l\u00e9ment choisi (ex : <code>getFlightById(id)<\/code>), ou ajouter un param\u00e8tre <code>expand=true<\/code> pour ne renvoyer que les champs suppl\u00e9mentaires\/la page suivante.<\/p>\n\n\n\n<p>Pour rester dans une enveloppe raisonnable, privil\u00e9giez les approches suivantes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pr\u00e9f\u00e9rer des identifiants<\/strong> et quelques champs utiles aux objets verbeux<\/li>\n\n\n\n<li><strong>Appliquer les filtres c\u00f4t\u00e9 serveur, <\/strong>imposer une pagination stricte<\/li>\n\n\n\n<li><strong>G\u00e9n\u00e9rer des r\u00e9sum\u00e9s (synth\u00e8ses) c\u00f4t\u00e9 serveur <\/strong>(titres, \u00e9tats, horodatages pertinents)<\/li>\n\n\n\n<li><strong>Rendre les erreurs courtes et norm\u00e9es<\/strong> (code, message concis, prochain pas)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Patrons d\u2019exposition d\u2019un backend via MCP<\/h2>\n\n\n\n<p>On commence souvent par la lecture. Exposer un \u201cquery tool\u201d de type quotidien (ex : <code>searchFlights<\/code>, <code>listCalendarEvents<\/code>, <code>findRestaurants<\/code>) avec filtres, pagination et s\u00e9lection de champs permet de cadrer le volume d\u2019information tout en restant utile au LLM. Par exemple, <code>searchFlights<\/code> accepte des filtres simples (origin, destination, date) et renvoie uniquement <code>id<\/code>, <code>airline<\/code>, <code>price<\/code>, <code>departAt<\/code>, <code>arriveAt<\/code>. <strong>Si le mod\u00e8le a besoin du d\u00e9tail, un tool s\u00e9par\u00e9 <code>getFlightById<\/code> fournit une vue approfondie (bagages, conditions tarifaires) pagin\u00e9e.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Mini\u2011exemple (compact vs verbeux), contenu du champ <code>result<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Compact (champs utiles)\n{\n  \"items\": &#91;\n    { \n\t    \"id\": \"FL-1234\", \n\t    \"airline\": \"Iberia\", \n\t    \"price\": \"350 \u20ac\", \n\t    \"departAt\": \"2025-06-15T10:10:00Z\", \n\t    \"arriveAt\": \"2025-06-15T22:05:00Z\" \n\t   }\n  ],\n  \"nextCursor\": \"eyJwYWdlIjoyfQ==\"\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Verbeux (anti\u2011pattern pour d\u00e9fauts): politiques compl\u00e8tes, texte libre, champs imbriqu\u00e9s\n{\n  \"items\": &#91;\n    {\n      \"id\": \"FL-1234\",\n      \"airline\": \"Iberia\",\n      \"price\": \"350 \u20ac\",\n      \"departAt\": \"2025-06-15T10:10:00Z\",\n      \"arriveAt\": \"2025-06-15T22:05:00Z\",\n      \"baggagePolicy\": { \/* texte long *\/ },\n      \"fareRules\": \"... 3\u202f000+ caract\u00e8res ...\",\n      \"notes\": &#91; \"politique d\u2019embarquement ...\", \"conditions m\u00e9t\u00e9o ...\" ]\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<section class=\"wp-block-leocare-bon-a-savoir leocare-bas\"><div class=\"leocare-bas__head\"><img decoding=\"async\" class=\"leocare-bas__icon\" src=\"https:\/\/leocare.eu\/fr\/wp-content\/themes\/leocare-new\/assets\/img\/icon-alert-purple.svg\" alt=\"icon alerte\"\/><h3 class=\"leocare-bas__title\">Bon \u00e0 savoir<\/h3><\/div><div class=\"leocare-bas__content\">\n<p>nextCursor est un jeton opaque que le client renvoie au tool pour r\u00e9cup\u00e9rer la page suivante. Ne l\u2019interpr\u00e9tez pas c\u00f4t\u00e9 client; faites\u2011le expirer rapidement c\u00f4t\u00e9 serveur.<\/p>\n<\/div><\/section>\n\n\n\n<p><strong>Pour les actions, raisonnez comme sur des commandes. <\/strong>Par exemple, <code>createCalendarEvent<\/code> doit pouvoir \u00eatre relanc\u00e9 sans cr\u00e9er de doublon : envoyez un identifiant unique de requ\u00eate; si l\u2019appel revient avec le m\u00eame identifiant, le serveur n\u2019applique pas l\u2019action une seconde fois.<strong> Proposez aussi un \u201cdry\u2011run\u201d quand c\u2019est critique (pr\u00e9visualiser l\u2019impact avant d\u2019ex\u00e9cuter), et produisez des journaux d\u2019audit structur\u00e9s (qui, quoi, quand, avec quels param\u00e8tres).<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple tools\/call (dry\u2011run + relance sans doublon)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Appel (client \u2192 serveur)\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 2,\n  \"method\": \"tools\/call\",\n  \"params\": {\n    \"name\": \"createCalendarEvent\",\n    \"arguments\": {\n      \"requestId\": \"c9a1e3a0-7d6a-4f2a-8a6b-12f9e7\",\n      \"dryRun\": true,\n      \"title\": \"Barcelona Trip\",\n      \"startDate\": \"2025-06-15T09:00:00Z\",\n      \"endDate\": \"2025-06-22T18:00:00Z\"\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ R\u00e9ponse dry-run (serveur \u2192 client)\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 2,\n  \"result\": {\n    \"dryRun\": true,\n    \"impact\": { \"conflictsDetected\": true, \"conflictingEvents\": &#91;\"meet-123\"] },\n    \"canApply\": true,\n    \"next\": \"relancer avec dryRun=false pour cr\u00e9er l\u2019\u00e9v\u00e9nement\"\n  }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ R\u00e9ponse appliqu\u00e9e (m\u00eame requestId => pas de doublon)\n{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 2,\n  \"result\": {\n    \"eventId\": \"EVT-987\",\n    \"status\": \"created\"\n  }\n}<\/code><\/pre>\n\n\n\n<p>C\u00f4t\u00e9 authentification, deux sch\u00e9mas couvrent l\u2019essentiel en pratique.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00ab\u00a0On\u2011behalf\u2011of\u00a0\u00bb quand les droits de l\u2019utilisateur final s\u2019appliquent : <\/strong>le serveur MCP \u00e9change un jeton court et limit\u00e9 aux permissions n\u00e9cessaires \u00e0 partir d\u2019un jeton de rafra\u00eechissement interne, ex\u00e9cute l\u2019action au nom de l\u2019utilisateur, puis invalide\/expire correctement.<\/li>\n\n\n\n<li><strong>\u201cCompte de service\u201d pour des t\u00e2ches techniques ou globales.<\/strong><\/li>\n<\/ul>\n\n\n\n<p><strong>Dans tous les cas, chiffrer et faire tourner les jetons de rafra\u00eechissement (vault\/KMS), ne jamais renvoyer de secrets vers le client, <\/strong>et r\u00e9aliser le rafra\u00eechissement c\u00f4t\u00e9 serveur. Documentez vos scopes et mappez-les \u00e0 vos r\u00f4les m\u00e9tiers pour \u00e9viter les \u00e9l\u00e9vations de privil\u00e8ges implicites.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/schema-mcp.svg\" alt=\"schema MCP\" class=\"wp-image-38386\"\/><\/figure>\n\n\n\n<p><strong>C\u00f4t\u00e9 garde\u2011fous, mieux vaut \u00eatre explicite<\/strong> :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tenez une liste autoris\u00e9e des tools publi\u00e9s<\/li>\n\n\n\n<li>Fixez des limites de taille (octets, \u00e9l\u00e9ments) et de temps (timeouts) par tool<\/li>\n\n\n\n<li>Validez strictement les sch\u00e9mas d\u2019entr\u00e9e<\/li>\n\n\n\n<li>Renvoyez des erreurs courtes et actionnables (codes, champs manquants, limites atteintes)<\/li>\n<\/ul>\n\n\n\n<p>Sur l\u2019observabilit\u00e9, partez simple :<strong> latence p50\/p95, taille moyenne des r\u00e9ponses et \u201ctokens estim\u00e9s\u201d par tool suffisent \u00e0 d\u00e9tecter les d\u00e9rives. <\/strong>Ajoutez des alertes quand un tool d\u00e9passe son budget de tokens ou son temps de r\u00e9ponse cible.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Exemple (erreur norm\u00e9e et br\u00e8ve) \u2014 (tools\/call)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>{  \n\t\"jsonrpc\": \"2.0\",  \n\t\"id\": 3,  \n\t\"error\": {    \n\t\t\"code\": 402,    \n\t\t\"message\": \"Mode de paiement manquant\",    \n\t\t\"data\": { \n\t\t\t\"next\": \"attachPaymentMethod(customerId)\" \n\t\t}  \n\t}\n}<\/code><\/pre>\n\n\n\n<p>La voie d\u2019impl\u00e9mentation d\u00e9pend de votre contexte. Un serveur \u201cmaison\u201d via le SDK donne un contr\u00f4le fin : <strong>vous exposez des tools orient\u00e9s cas d\u2019usage, avec des r\u00e9ponses (outputs) compactes sur\u2011mesure \u2014 id\u00e9al pour ma\u00eetriser les tokens, au prix d\u2019un effort plus \u00e9lev\u00e9.<\/strong><\/p>\n\n\n\n<p>Un proxy OpenAPI\/GraphQL acc\u00e9l\u00e8re le d\u00e9marrage si vous avez un sch\u00e9ma robuste : <strong>il expose vite une large surface, mais exige de la r\u00e9duction\/synth\u00e8se (champs, r\u00e9sum\u00e9s), des filtres et une pagination stricte, faute de quoi la consommation de tokens explose. <\/strong>Un chemin hybride fonctionne bien en entreprise : g\u00e9n\u00e9rer le proxy pour la couverture g\u00e9n\u00e9rale, puis adapter finement les 10\u201320 parcours critiques avec des tools d\u00e9di\u00e9s et des sch\u00e9mas stricts.<\/p>\n\n\n\n<p><strong>C\u00f4t\u00e9 op\u00e9rations, traitez chaque tool comme une capacit\u00e9 produit, avec budgets et objectifs.<\/strong> D\u00e9finissez un budget de tokens par appel par d\u00e9faut, et des garde\u2011fous (ex : refuser au\u2011del\u00e0 de 20 Ko sans pagination). Mesurez latence, taille des r\u00e9ponses et tokens renvoy\u00e9s; suivez les tendances.<\/p>\n\n\n\n<p><strong>Sur le versioning, privil\u00e9giez les \u00e9volutions additives;<\/strong> pour un changement rupturant, publiez un nouveau tool (ex : <code>createCalendarEvent_v2<\/code>) et laissez une fen\u00eatre de coexistence avec d\u00e9pr\u00e9ciation annonc\u00e9e. N\u2019oubliez pas le cache de la liste d\u2019outils c\u00f4t\u00e9 clients : apr\u00e8s d\u00e9ploiement, forcez un rechargement ou une r\u00e9\u2011annonce pour \u00e9viter des incoh\u00e9rences.<\/p>\n\n\n\n<p>Enfin, concevez vos tools \u201corient\u00e9s tokens\u201d. \u00c9vitez le mapping 1:1 de endpoints verbeux. Pr\u00e9f\u00e9rez des tools centr\u00e9s sur la t\u00e2che \u00e0 accomplir, qui renvoient des identifiants ou quelques champs utiles, et offrent un chemin explicite pour obtenir davantage (pagination, r\u00e9sum\u00e9, \u201cexpand\u201d). <strong>Ce design r\u00e9duit la charge cognitive du mod\u00e8le et votre facture tout en am\u00e9liorant la fiabilit\u00e9 des appels.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Les points de vigilance \u00e0 retenir (protocole + clients)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ne pas exposer toute l\u2019API telle quelle \u00ab pour commencer \u00bb<\/strong> (explosion des tokens, erreurs ambigu\u00ebs)<\/li>\n\n\n\n<li><strong>Ne pas laisser des champs \u00ab debug \u00bb verbeux <\/strong>dans les r\u00e9ponses par d\u00e9faut<\/li>\n\n\n\n<li><strong>Ne pas renvoyer des erreurs non norm\u00e9es<\/strong> (pr\u00e9f\u00e9rer codes courts + prochaine \u00e9tape)<\/li>\n\n\n\n<li><strong>\u00c9viter les doublons sur les cr\u00e9ations\/\u00e9critures<\/strong> (idempotence)<\/li>\n\n\n\n<li><strong>V\u00e9rifier la compatibilit\u00e9 c\u00f4t\u00e9 clients :<\/strong> tools\/resources\/prompts ne sont pas toujours tous support\u00e9s.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Ressources pour aller plus loin<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.anthropic.com\/claude\/docs\/model-context-protocol\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Docs MCP (spec &amp; concepts)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/modelcontextprotocol.io\/docs\/learn\/architecture#understanding-the-tool-execution-request\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Architecture MCP<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/modelcontextprotocol\/specification\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Sp\u00e9cification<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/modelcontextprotocol\/typescript-sdk\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">SDK TypeScript MCP<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/modelcontextprotocol\/servers\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Exemples de serveurs MCP (TypeScript)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.anthropic.com\/claude\/docs\/claude-desktop-and-mcp\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Client MCP (Claude Desktop)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/makenotion\/notion-mcp-server\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Notion MCP server (surface compacte)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.github.com\/en\/copilot\/customizing-copilot\/using-model-context-protocol\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">GitHub MCP (doc d\u2019usage)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=kqS5i6U-kHk\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Tutoriel vid\u00e9o Nest (MCP)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.arsturn.com\/blog\/hidden-cost-of-mcp-monitor-reduce-token-usage\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Analyse des co\u00fbts cach\u00e9s MCP (monitoring et r\u00e9duction des tokens)<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Checklist rapide pour avancer<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Choisir les premiers tools (lecture seule, outputs compacts)<\/li>\n\n\n\n<li>D\u00e9finir sch\u00e9mas d\u2019E\/S et strat\u00e9gies de pagination\/r\u00e9sum\u00e9<\/li>\n\n\n\n<li>Mettre en place auth, scopes, journaux d\u2019audit, rate limits<\/li>\n\n\n\n<li>Instrumenter m\u00e9triques (latence, taille, tokens) et alertes<\/li>\n\n\n\n<li>Politique de versioning + d\u00e9pr\u00e9ciation; docs internes pour les \u00e9quipes<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Pour conclure<\/h2>\n\n\n\n<p><strong>MCP vous donne un cadre sobre pour ouvrir votre backend aux LLM sans sacrifier la ma\u00eetrise :<\/strong> outils d\u00e9couverts, sch\u00e9mas clairs, garde\u2011fous explicites.<\/p>\n\n\n\n<p>En exposant d\u2019abord des lectures compactes, en traitant les \u00e9critures comme des commandes relan\u00e7ables sans doublon et en imposant budgets et pagination, vous limitez les co\u00fbts tout en augmentant la fiabilit\u00e9. <strong>Le choix entre serveur \u201cmaison\u201d, proxy ou hybride d\u00e9pend de votre contexte : couverture vs efficience tokens vs vitesse de mise en place. Commencez petit, mesurez, it\u00e9rez.<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les LLMs deviennent utiles quand ils lisent vos donn\u00e9es et d\u00e9clenchent des actions, sans bricolage ni prise de risque. Le Model Context Protocol (MCP) standardise la passerelle entre un assistant et votre backend: des outils (tools) d\u00e9clar\u00e9s, d\u00e9couverts \u00e0 la vol\u00e9e, permissionn\u00e9s et auditables. Cet article propose de faire d\u00e9couvrir comment fonctionne un serveur MCP [&hellip;]<\/p>\n","protected":false},"author":49,"featured_media":38384,"comment_status":"closed","ping_status":"closed","template":"","categorie_leocare_lab":[56],"class_list":["post-38383","leocare_lab","type-leocare_lab","status-publish","has-post-thumbnail","hentry","categorie_leocare_lab-ia"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Comment nous avons ouvert notre backend aux LLM avec un MCP<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Comment nous avons ouvert notre backend aux LLM avec un MCP\" \/>\n<meta property=\"og:description\" content=\"Les LLMs deviennent utiles quand ils lisent vos donn\u00e9es et d\u00e9clenchent des actions, sans bricolage ni prise de risque. Le Model Context Protocol (MCP) standardise la passerelle entre un assistant et votre backend: des outils (tools) d\u00e9clar\u00e9s, d\u00e9couverts \u00e0 la vol\u00e9e, permissionn\u00e9s et auditables. Cet article propose de faire d\u00e9couvrir comment fonctionne un serveur MCP [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/\" \/>\n<meta property=\"og:site_name\" content=\"Leocare, assurance en ligne automobile et habitation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-18T20:25:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/serveur-ia.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"505\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"12 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Comment nous avons ouvert notre backend aux LLM avec un MCP","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/","og_locale":"fr_FR","og_type":"article","og_title":"Comment nous avons ouvert notre backend aux LLM avec un MCP","og_description":"Les LLMs deviennent utiles quand ils lisent vos donn\u00e9es et d\u00e9clenchent des actions, sans bricolage ni prise de risque. Le Model Context Protocol (MCP) standardise la passerelle entre un assistant et votre backend: des outils (tools) d\u00e9clar\u00e9s, d\u00e9couverts \u00e0 la vol\u00e9e, permissionn\u00e9s et auditables. Cet article propose de faire d\u00e9couvrir comment fonctionne un serveur MCP [&hellip;]","og_url":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/","og_site_name":"Leocare, assurance en ligne automobile et habitation","article_modified_time":"2026-02-18T20:25:14+00:00","og_image":[{"width":800,"height":505,"url":"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/serveur-ia.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/","url":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/","name":"Comment nous avons ouvert notre backend aux LLM avec un MCP","isPartOf":{"@id":"https:\/\/leocare.eu\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/#primaryimage"},"image":{"@id":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/#primaryimage"},"thumbnailUrl":"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/serveur-ia.jpg","datePublished":"2026-02-18T11:08:55+00:00","dateModified":"2026-02-18T20:25:14+00:00","breadcrumb":{"@id":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/leocare.eu\/fr\/leocare-lab\/ouvrir-backend-aux-llm\/#primaryimage","url":"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/serveur-ia.jpg","contentUrl":"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2026\/02\/serveur-ia.jpg","width":800,"height":505,"caption":"serveur ia"},{"@type":"WebSite","@id":"https:\/\/leocare.eu\/fr\/#website","url":"https:\/\/leocare.eu\/fr\/","name":"Leocare, assurance en ligne automobile et habitation","description":"enfin (r)assur\u00e9.e","publisher":{"@id":"https:\/\/leocare.eu\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/leocare.eu\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/leocare.eu\/fr\/#organization","name":"Leocare, assurance en ligne automobile et habitation","url":"https:\/\/leocare.eu\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/leocare.eu\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2020\/03\/logo-leocare.svg","contentUrl":"https:\/\/leocare.eu\/fr\/wp-content\/uploads\/2020\/03\/logo-leocare.svg","caption":"Leocare, assurance en ligne automobile et habitation"},"image":{"@id":"https:\/\/leocare.eu\/fr\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/leocare_lab\/38383","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/leocare_lab"}],"about":[{"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/types\/leocare_lab"}],"author":[{"embeddable":true,"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/comments?post=38383"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/media\/38384"}],"wp:attachment":[{"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/media?parent=38383"}],"wp:term":[{"taxonomy":"categorie_leocare_lab","embeddable":true,"href":"https:\/\/leocare.eu\/fr\/wp-json\/wp\/v2\/categorie_leocare_lab?post=38383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}