[{"data":1,"prerenderedAt":1069},["ShallowReactive",2],{"i-ic:sharp-mail":3,"i-fa6-brands:github":8,"i-fa6-brands:linkedin":12,"i-fa6-brands:telegram":15,"blog\u002F2026-07-06-mcp-pour-les-enfants\u002Fposition":4,"\u002Fblog\u002F2026-07-06-mcp-pour-les-enfants":17,"i-openmoji:flag-france":1058,"i-mdi-light:clipboard":1061,"i-ic:sharp-monitor":1063,"i-ic:sharp-arrow-back-ios":1065,"i-ic:sharp-arrow-forward-ios":1067},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"M22 4H2v16h20zm-2 4l-8 5l-8-5V6l8 5l8-5z\"\u002F>",{"left":4,"top":4,"width":9,"height":10,"rotate":4,"vFlip":6,"hFlip":6,"body":11},496,512,"\u003Cpath fill=\"currentColor\" d=\"M165.9 397.4c0 2-2.3 3.6-5.2 3.6c-3.3.3-5.6-1.3-5.6-3.6c0-2 2.3-3.6 5.2-3.6c3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9c2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9c.3 2 2.9 3.3 5.9 2.6c2.9-.7 4.9-2.6 4.6-4.6c-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2c12.8 2.3 17.3-5.6 17.3-12.1c0-6.2-.3-40.4-.3-61.4c0 0-70 15-84.7-29.8c0 0-11.4-29.1-27.8-36.6c0 0-22.9-15.7 1.6-15.4c0 0 24.9 2 38.6 25.8c21.9 38.6 58.6 27.5 72.9 20.9c2.3-16 8.8-27.1 16-33.7c-55.9-6.2-112.3-14.3-112.3-110.5c0-27.5 7.6-41.3 23.6-58.9c-2.6-6.5-11.1-33.3 2.6-67.9c20.9-6.5 69 27 69 27c20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27c13.7 34.7 5.2 61.4 2.6 67.9c16 17.7 25.8 31.5 25.8 58.9c0 96.5-58.9 104.2-114.8 110.5c9.2 7.9 17 22.9 17 46.4c0 33.7-.3 75.4-.3 83.6c0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252C496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2c1.6 1.6 3.9 2.3 5.2 1c1.3-1 1-3.3-.7-5.2c-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9c1.6 1 3.6.7 4.3-.7c.7-1.3-.3-2.9-2.3-3.9c-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2c2.3 2.3 5.2 2.6 6.5 1c1.3-1.3.7-4.3-1.3-6.2c-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2c-1.4-2.3-4-3.3-5.6-2\"\u002F>",{"left":4,"top":4,"width":13,"height":10,"rotate":4,"vFlip":6,"hFlip":6,"body":14},448,"\u003Cpath fill=\"currentColor\" d=\"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3M135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5c0 21.3-17.2 38.5-38.5 38.5m282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7c-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5c67.2 0 79.7 44.3 79.7 101.9z\"\u002F>",{"left":4,"top":4,"width":9,"height":10,"rotate":4,"vFlip":6,"hFlip":6,"body":16},"\u003Cpath fill=\"currentColor\" d=\"M248 8C111.033 8 0 119.033 0 256s111.033 248 248 248s248-111.033 248-248S384.967 8 248 8m114.952 168.66c-3.732 39.215-19.881 134.378-28.1 178.3c-3.476 18.584-10.322 24.816-16.948 25.425c-14.4 1.326-25.338-9.517-39.287-18.661c-21.827-14.308-34.158-23.215-55.346-37.177c-24.485-16.135-8.612-25 5.342-39.5c3.652-3.793 67.107-61.51 68.335-66.746c.153-.655.3-3.1-1.154-4.384s-3.59-.849-5.135-.5q-3.283.746-104.608 69.142q-14.845 10.194-26.894 9.934c-8.855-.191-25.888-5.006-38.551-9.123c-15.531-5.048-27.875-7.717-26.8-16.291q.84-6.7 18.45-13.7q108.446-47.248 144.628-62.3c68.872-28.647 83.183-33.623 92.511-33.789c2.052-.034 6.639.474 9.61 2.885a10.45 10.45 0 0 1 3.53 6.716a43.8 43.8 0 0 1 .417 9.769\"\u002F>",{"id":18,"title":19,"body":20,"date":1035,"description":1036,"draft":6,"extension":1037,"image":1038,"lang":1039,"meta":1040,"navigation":119,"path":1041,"seo":1042,"stem":1043,"tags":1044,"__hash__":1048,"before":1049,"after":1054},"blog\u002Fblog\u002F2026-07-06-mcp-pour-les-enfants.md","Le serveur MCP (Model Context Protocol) pour les enfants",{"type":21,"value":22,"toc":1027},"minimark",[23,27,31,34,39,42,47,50,53,60,66,69,72,75,88,92,95,165,254,258,261,284,395,398,401,415,418,673,677,680,711,714,733,809,812,1018,1020,1023],[24,25,19],"h1",{"id":26},"le-serveur-mcp-model-context-protocol-pour-les-enfants",[28,29,30],"p",{},"Comme si les exigences de connaissance des différentes technologies pour les développeurs ne suffisaient déjà pas,\nAnthropic a présenté son nouveau protocole : le Model Context Protocol. Bien que, de jure, le MCP soit une bibliothèque\nopen source décrivant les communications pour une technologie propriétaire, de facto, il est devenu la norme communément admise.",[28,32,33],{},"Le MCP n'est déjà plus tout à fait nouveau - il a 2 ans. Et pour le remplacer, on a développé les skills,\nqui résolvent bien des problèmes. Mais il reste encore aujourd'hui, fréquemment, des cas où le MCP demeure la meilleure solution.",[35,36,38],"h2",{"id":37},"mcp-ça-sert-à-quoi","MCP, ça sert à quoi ?",[28,40,41],{},"MCP est un protocole propriétaire créé dans Antropic pour l'échange des données entre les agents LLM et le serveur.",[43,44,46],"h3",{"id":45},"peut-on-éviter-mcp","Peut-on éviter MCP ?",[28,48,49],{},"Techniquement, oui, les agents LLM peuvent écrire et utiliser les scripts communiquant avec le serveur en protocoles\ndifférents (par exemple HTTP ou gRPC). Mais ces protocoles classiques demandent les appels précis. Et donc les LLM ont\ndes problèmes avec ça : ils peuvent halluciner une route HTTP et construire le corps de requête faux.",[28,51,52],{},"MCP rend l'API plus claire pour les modèles de langue, il ajoute des descriptions naturelles pour chaque utilité et\nchaque champ de message. C'est comment MCP laisse moindre risque d'échec.",[28,54,55],{},[56,57],"img",{"alt":58,"src":59},"Serveur expose sa fonctionnalité en HTTP et MCP","\u002Fblog\u002F2026-07-06\u002Fmcp-vs-express.png",[61,62,63],"blockquote",{},[28,64,65],{},"MCP est juste une nouvelle façon d'interagir avec le serveur.",[67,68],"hr",{},[28,70,71],{},"Vu que MCP est juste une façon de développer une API,\nil est beaucoup plus compréhensible en comparaison avec les API REST classiques.",[28,73,74],{},"Normalement, la configuration d'un serveur REST (Express.js comme un exemple ici) et d'un serveur MCP inclut trois simples étapes :",[76,77,78,82,85],"ol",{},[79,80,81],"li",{},"Instanciation de l'objet serveur",[79,83,84],{},"Déclaration des méthodes",[79,86,87],{},"Lancement du serveur",[43,89,91],{"id":90},"instantiation-dunserveur","Instantiation d'un serveur",[28,93,94],{},"L'étape est extrêmement claire, il faut importer une fonction pour l'instantiation et l'appeler.",[96,97,102],"pre",{"className":98,"code":99,"language":100,"meta":101,"style":101},"language-ts shiki shiki-themes github-light one-dark-pro","\u002F\u002F Express.js\n\nimport express from 'express'\n\nconst app = express()\n","ts","",[103,104,105,114,121,139,144],"code",{"__ignoreMap":101},[106,107,110],"span",{"class":108,"line":109},"line",1,[106,111,113],{"class":112},"s91Lf","\u002F\u002F Express.js\n",[106,115,117],{"class":108,"line":116},2,[106,118,120],{"emptyLinePlaceholder":119},true,"\n",[106,122,124,128,132,135],{"class":108,"line":123},3,[106,125,127],{"class":126},"sudEI","import",[106,129,131],{"class":130},"s33T6"," express",[106,133,134],{"class":126}," from",[106,136,138],{"class":137},"sDOtg"," 'express'\n",[106,140,142],{"class":108,"line":141},4,[106,143,120],{"emptyLinePlaceholder":119},[106,145,147,150,154,158,161],{"class":108,"line":146},5,[106,148,149],{"class":126},"const",[106,151,153],{"class":152},"sZ6H1"," app",[106,155,157],{"class":156},"su5p0"," =",[106,159,131],{"class":160},"sotTb",[106,162,164],{"class":163},"sXDFC","()\n",[96,166,168],{"className":98,"code":167,"language":100,"meta":101,"style":101},"\u002F\u002F MCP\n\nimport { McpServer } from '@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js'\n\nconst server = new McpServer({\n  name: \"recherche\",\n  version: \"1.0.0\",\n})\n",[103,169,170,175,179,198,202,220,235,248],{"__ignoreMap":101},[106,171,172],{"class":108,"line":109},[106,173,174],{"class":112},"\u002F\u002F MCP\n",[106,176,177],{"class":108,"line":116},[106,178,120],{"emptyLinePlaceholder":119},[106,180,181,183,186,189,192,195],{"class":108,"line":123},[106,182,127],{"class":126},[106,184,185],{"class":163}," { ",[106,187,188],{"class":130},"McpServer",[106,190,191],{"class":163}," } ",[106,193,194],{"class":126},"from",[106,196,197],{"class":137}," '@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js'\n",[106,199,200],{"class":108,"line":141},[106,201,120],{"emptyLinePlaceholder":119},[106,203,204,206,209,211,214,217],{"class":108,"line":146},[106,205,149],{"class":126},[106,207,208],{"class":152}," server",[106,210,157],{"class":156},[106,212,213],{"class":126}," new",[106,215,216],{"class":160}," McpServer",[106,218,219],{"class":163},"({\n",[106,221,223,226,229,232],{"class":108,"line":222},6,[106,224,225],{"class":130},"  name",[106,227,228],{"class":163},": ",[106,230,231],{"class":137},"\"recherche\"",[106,233,234],{"class":163},",\n",[106,236,238,241,243,246],{"class":108,"line":237},7,[106,239,240],{"class":130},"  version",[106,242,228],{"class":163},[106,244,245],{"class":137},"\"1.0.0\"",[106,247,234],{"class":163},[106,249,251],{"class":108,"line":250},8,[106,252,253],{"class":163},"})\n",[43,255,257],{"id":256},"déclaration-desméthodes","Déclaration des méthodes",[28,259,260],{},"En Express.js, on définit :",[76,262,263,274,281],{},[79,264,265,266,269,270,273],{},"Méthode HTTP (",[103,267,268],{},"GET",", ",[103,271,272],{},"POST",", etc.)",[79,275,276,277,280],{},"Chemin de la requête (",[103,278,279],{},"\u002Fsearch",")",[79,282,283],{},"Fonction de traitement de la requête",[96,285,287],{"className":98,"code":286,"language":100,"meta":101,"style":101},"\u002F\u002F Express.js\n\napp.post('\u002Fsearch', async (req, res) => {\n  const reponse = await monService.search(req.body)\n  res.json(response)\n})\n",[103,288,289,293,297,341,374,391],{"__ignoreMap":101},[106,290,291],{"class":108,"line":109},[106,292,113],{"class":112},[106,294,295],{"class":108,"line":116},[106,296,120],{"emptyLinePlaceholder":119},[106,298,299,303,306,309,312,315,317,320,323,327,329,332,335,338],{"class":108,"line":123},[106,300,302],{"class":301},"s9okb","app",[106,304,305],{"class":163},".",[106,307,308],{"class":160},"post",[106,310,311],{"class":163},"(",[106,313,314],{"class":137},"'\u002Fsearch'",[106,316,269],{"class":163},[106,318,319],{"class":126},"async",[106,321,322],{"class":163}," (",[106,324,326],{"class":325},"sagcK","req",[106,328,269],{"class":163},[106,330,331],{"class":325},"res",[106,333,334],{"class":163},") ",[106,336,337],{"class":126},"=>",[106,339,340],{"class":163}," {\n",[106,342,343,346,349,351,354,357,359,362,364,366,368,371],{"class":108,"line":141},[106,344,345],{"class":126},"  const",[106,347,348],{"class":152}," reponse",[106,350,157],{"class":156},[106,352,353],{"class":126}," await",[106,355,356],{"class":301}," monService",[106,358,305],{"class":163},[106,360,361],{"class":160},"search",[106,363,311],{"class":163},[106,365,326],{"class":301},[106,367,305],{"class":163},[106,369,370],{"class":130},"body",[106,372,373],{"class":163},")\n",[106,375,376,379,381,384,386,389],{"class":108,"line":146},[106,377,378],{"class":301},"  res",[106,380,305],{"class":163},[106,382,383],{"class":160},"json",[106,385,311],{"class":163},[106,387,388],{"class":130},"response",[106,390,373],{"class":163},[106,392,393],{"class":108,"line":222},[106,394,253],{"class":163},[28,396,397],{},"En général, on déclare des outils (tools) dans MCP, mais il faut noter qu'il existe aussi 2 types : ressources et prompts.",[28,399,400],{},"Pour un outil, il faut déclarer :",[76,402,403,406,409,412],{},[79,404,405],{},"Nom de l'outil",[79,407,408],{},"Description de la fonctionnalité",[79,410,411],{},"Schéma d'entrée",[79,413,414],{},"Fonction de traitement d'une requête",[28,416,417],{},"Ce qui est remarquable, MCP expose les descriptions de fonctionnalités et de chaque paramètre d'entrée. Après, LLM peut l'utiliser pour adapter mieux ses appels.",[96,419,421],{"className":98,"code":420,"language":100,"meta":101,"style":101},"\u002F\u002F MCP\n\nimport { z } from 'zod'\n\nserver.registerTool(\n  \u002F\u002F Nom de l'outil\n  \"search\",\n  {\n    \u002F\u002F Description de l'outil\n    description: \"Recherche du contenu pertinent\",\n    \u002F\u002F Schéma d'entrée\n    inputSchema: {\n      query: z\n        .string()\n        \u002F\u002F Description du parameter query\n        .describe(\"La requête pour chercher l'information\"),\n    },\n  },\n  \u002F\u002F Fonction de traitement d'une requête\n  async ({ query }) => {\n    const reponse = await monService.search({ query })\n    \u002F\u002F Transformer la reponse en texte\n    return [{ type: 'text', text: formatterReponse(reponse) }]\n  }\n)\n",[103,422,423,427,431,447,451,464,469,476,481,487,500,506,515,526,537,543,559,565,571,577,596,622,628,663,668],{"__ignoreMap":101},[106,424,425],{"class":108,"line":109},[106,426,174],{"class":112},[106,428,429],{"class":108,"line":116},[106,430,120],{"emptyLinePlaceholder":119},[106,432,433,435,437,440,442,444],{"class":108,"line":123},[106,434,127],{"class":126},[106,436,185],{"class":163},[106,438,439],{"class":130},"z",[106,441,191],{"class":163},[106,443,194],{"class":126},[106,445,446],{"class":137}," 'zod'\n",[106,448,449],{"class":108,"line":141},[106,450,120],{"emptyLinePlaceholder":119},[106,452,453,456,458,461],{"class":108,"line":146},[106,454,455],{"class":301},"server",[106,457,305],{"class":163},[106,459,460],{"class":160},"registerTool",[106,462,463],{"class":163},"(\n",[106,465,466],{"class":108,"line":222},[106,467,468],{"class":112},"  \u002F\u002F Nom de l'outil\n",[106,470,471,474],{"class":108,"line":237},[106,472,473],{"class":137},"  \"search\"",[106,475,234],{"class":163},[106,477,478],{"class":108,"line":250},[106,479,480],{"class":163},"  {\n",[106,482,484],{"class":108,"line":483},9,[106,485,486],{"class":112},"    \u002F\u002F Description de l'outil\n",[106,488,490,493,495,498],{"class":108,"line":489},10,[106,491,492],{"class":130},"    description",[106,494,228],{"class":163},[106,496,497],{"class":137},"\"Recherche du contenu pertinent\"",[106,499,234],{"class":163},[106,501,503],{"class":108,"line":502},11,[106,504,505],{"class":112},"    \u002F\u002F Schéma d'entrée\n",[106,507,509,512],{"class":108,"line":508},12,[106,510,511],{"class":130},"    inputSchema",[106,513,514],{"class":163},": {\n",[106,516,518,521,523],{"class":108,"line":517},13,[106,519,520],{"class":130},"      query",[106,522,228],{"class":163},[106,524,525],{"class":130},"z\n",[106,527,529,532,535],{"class":108,"line":528},14,[106,530,531],{"class":163},"        .",[106,533,534],{"class":160},"string",[106,536,164],{"class":163},[106,538,540],{"class":108,"line":539},15,[106,541,542],{"class":112},"        \u002F\u002F Description du parameter query\n",[106,544,546,548,551,553,556],{"class":108,"line":545},16,[106,547,531],{"class":163},[106,549,550],{"class":160},"describe",[106,552,311],{"class":163},[106,554,555],{"class":137},"\"La requête pour chercher l'information\"",[106,557,558],{"class":163},"),\n",[106,560,562],{"class":108,"line":561},17,[106,563,564],{"class":163},"    },\n",[106,566,568],{"class":108,"line":567},18,[106,569,570],{"class":163},"  },\n",[106,572,574],{"class":108,"line":573},19,[106,575,576],{"class":112},"  \u002F\u002F Fonction de traitement d'une requête\n",[106,578,580,583,586,589,592,594],{"class":108,"line":579},20,[106,581,582],{"class":126},"  async",[106,584,585],{"class":163}," ({ ",[106,587,588],{"class":325},"query",[106,590,591],{"class":163}," }) ",[106,593,337],{"class":126},[106,595,340],{"class":163},[106,597,599,602,604,606,608,610,612,614,617,619],{"class":108,"line":598},21,[106,600,601],{"class":126},"    const",[106,603,348],{"class":152},[106,605,157],{"class":156},[106,607,353],{"class":126},[106,609,356],{"class":301},[106,611,305],{"class":163},[106,613,361],{"class":160},[106,615,616],{"class":163},"({ ",[106,618,588],{"class":130},[106,620,621],{"class":163}," })\n",[106,623,625],{"class":108,"line":624},22,[106,626,627],{"class":112},"    \u002F\u002F Transformer la reponse en texte\n",[106,629,631,634,637,640,642,645,647,650,652,655,657,660],{"class":108,"line":630},23,[106,632,633],{"class":126},"    return",[106,635,636],{"class":163}," [{ ",[106,638,639],{"class":130},"type",[106,641,228],{"class":163},[106,643,644],{"class":137},"'text'",[106,646,269],{"class":163},[106,648,649],{"class":130},"text",[106,651,228],{"class":163},[106,653,654],{"class":160},"formatterReponse",[106,656,311],{"class":163},[106,658,659],{"class":130},"reponse",[106,661,662],{"class":163},") }]\n",[106,664,665],{"class":108,"line":5},[106,666,667],{"class":163},"  }\n",[106,669,671],{"class":108,"line":670},25,[106,672,373],{"class":163},[35,674,676],{"id":675},"lancement-duserveur","Lancement du serveur",[28,678,679],{},"Après avoir défini toute la logique, il reste seulement de lancer le serveur pour accepter des requêtes.",[96,681,683],{"className":98,"code":682,"language":100,"meta":101,"style":101},"\u002F\u002F Express.js\n\u002F\u002F Accepter les requêtes HTTP sur le port 8080\napp.listen(8080)\n",[103,684,685,689,694],{"__ignoreMap":101},[106,686,687],{"class":108,"line":109},[106,688,113],{"class":112},[106,690,691],{"class":108,"line":116},[106,692,693],{"class":112},"\u002F\u002F Accepter les requêtes HTTP sur le port 8080\n",[106,695,696,698,700,703,705,709],{"class":108,"line":123},[106,697,302],{"class":301},[106,699,305],{"class":163},[106,701,702],{"class":160},"listen",[106,704,311],{"class":163},[106,706,708],{"class":707},"syI6z","8080",[106,710,373],{"class":163},[28,712,713],{},"Pour lancer le serveur MCP vous avez plusieurs options de transport :",[715,716,717,727],"ul",{},[79,718,719,722,723,726],{},[103,720,721],{},"StreamableHTTPServerTransport"," (ou ancien ",[103,724,725],{},"SSEServerTransport",") - pour un serveur en ligne",[79,728,729,732],{},[103,730,731],{},"StdioServerTransport ","- pour un serveur local",[96,734,736],{"className":98,"code":735,"language":100,"meta":101,"style":101},"\u002F\u002F MCP local\n\nimport { StdioServerTransport } from '@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js'\n\n\u002F\u002F Instancier le transport\nconst transport = new StdioServerTransport()\n\u002F\u002F Lancer le serveur\nserver.connect(transport)\n",[103,737,738,743,747,763,767,772,788,793],{"__ignoreMap":101},[106,739,740],{"class":108,"line":109},[106,741,742],{"class":112},"\u002F\u002F MCP local\n",[106,744,745],{"class":108,"line":116},[106,746,120],{"emptyLinePlaceholder":119},[106,748,749,751,753,756,758,760],{"class":108,"line":123},[106,750,127],{"class":126},[106,752,185],{"class":163},[106,754,755],{"class":130},"StdioServerTransport",[106,757,191],{"class":163},[106,759,194],{"class":126},[106,761,762],{"class":137}," '@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js'\n",[106,764,765],{"class":108,"line":141},[106,766,120],{"emptyLinePlaceholder":119},[106,768,769],{"class":108,"line":146},[106,770,771],{"class":112},"\u002F\u002F Instancier le transport\n",[106,773,774,776,779,781,783,786],{"class":108,"line":222},[106,775,149],{"class":126},[106,777,778],{"class":152}," transport",[106,780,157],{"class":156},[106,782,213],{"class":126},[106,784,785],{"class":160}," StdioServerTransport",[106,787,164],{"class":163},[106,789,790],{"class":108,"line":237},[106,791,792],{"class":112},"\u002F\u002F Lancer le serveur\n",[106,794,795,797,799,802,804,807],{"class":108,"line":250},[106,796,455],{"class":301},[106,798,305],{"class":163},[106,800,801],{"class":160},"connect",[106,803,311],{"class":163},[106,805,806],{"class":130},"transport",[106,808,373],{"class":163},[28,810,811],{},"MCP en ligne demande configuration d'un serveur REST pour traiter les requêtes. C'est pourquoi le lancement est un peu plus compliqué.",[96,813,815],{"className":98,"code":814,"language":100,"meta":101,"style":101},"\u002F\u002F MCP en ligne\n\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol\u002Fsdk\u002Fserver\u002FstreamableHttp.js'\n\u002F\u002F Importer express pour lancer le serveur REST\nimport express from 'express'\n\n\u002F\u002F Instancier le transport\nconst transport = new StreamableHTTPServerTransport()\n\u002F\u002F Instancier le serveur express\nconst app = express()\n\n\u002F\u002F Déclarer un route pour MCP\napp.post('\u002Fmcp', async (req, res) => {\n  await transport.handleRequest(req, res, req.body)\n})\n\n\u002F\u002F Lancer le serveur\nserver.connect(transport)\n  .then(() => app.listen(8080))\n",[103,816,817,822,826,841,846,856,860,864,879,884,896,900,905,936,966,970,974,978,992],{"__ignoreMap":101},[106,818,819],{"class":108,"line":109},[106,820,821],{"class":112},"\u002F\u002F MCP en ligne\n",[106,823,824],{"class":108,"line":116},[106,825,120],{"emptyLinePlaceholder":119},[106,827,828,830,832,834,836,838],{"class":108,"line":123},[106,829,127],{"class":126},[106,831,185],{"class":163},[106,833,721],{"class":130},[106,835,191],{"class":163},[106,837,194],{"class":126},[106,839,840],{"class":137}," '@modelcontextprotocol\u002Fsdk\u002Fserver\u002FstreamableHttp.js'\n",[106,842,843],{"class":108,"line":141},[106,844,845],{"class":112},"\u002F\u002F Importer express pour lancer le serveur REST\n",[106,847,848,850,852,854],{"class":108,"line":146},[106,849,127],{"class":126},[106,851,131],{"class":130},[106,853,134],{"class":126},[106,855,138],{"class":137},[106,857,858],{"class":108,"line":222},[106,859,120],{"emptyLinePlaceholder":119},[106,861,862],{"class":108,"line":237},[106,863,771],{"class":112},[106,865,866,868,870,872,874,877],{"class":108,"line":250},[106,867,149],{"class":126},[106,869,778],{"class":152},[106,871,157],{"class":156},[106,873,213],{"class":126},[106,875,876],{"class":160}," StreamableHTTPServerTransport",[106,878,164],{"class":163},[106,880,881],{"class":108,"line":483},[106,882,883],{"class":112},"\u002F\u002F Instancier le serveur express\n",[106,885,886,888,890,892,894],{"class":108,"line":489},[106,887,149],{"class":126},[106,889,153],{"class":152},[106,891,157],{"class":156},[106,893,131],{"class":160},[106,895,164],{"class":163},[106,897,898],{"class":108,"line":502},[106,899,120],{"emptyLinePlaceholder":119},[106,901,902],{"class":108,"line":508},[106,903,904],{"class":112},"\u002F\u002F Déclarer un route pour MCP\n",[106,906,907,909,911,913,915,918,920,922,924,926,928,930,932,934],{"class":108,"line":517},[106,908,302],{"class":301},[106,910,305],{"class":163},[106,912,308],{"class":160},[106,914,311],{"class":163},[106,916,917],{"class":137},"'\u002Fmcp'",[106,919,269],{"class":163},[106,921,319],{"class":126},[106,923,322],{"class":163},[106,925,326],{"class":325},[106,927,269],{"class":163},[106,929,331],{"class":325},[106,931,334],{"class":163},[106,933,337],{"class":126},[106,935,340],{"class":163},[106,937,938,941,943,945,948,950,952,954,956,958,960,962,964],{"class":108,"line":528},[106,939,940],{"class":126},"  await",[106,942,778],{"class":301},[106,944,305],{"class":163},[106,946,947],{"class":160},"handleRequest",[106,949,311],{"class":163},[106,951,326],{"class":130},[106,953,269],{"class":163},[106,955,331],{"class":130},[106,957,269],{"class":163},[106,959,326],{"class":301},[106,961,305],{"class":163},[106,963,370],{"class":130},[106,965,373],{"class":163},[106,967,968],{"class":108,"line":539},[106,969,253],{"class":163},[106,971,972],{"class":108,"line":545},[106,973,120],{"emptyLinePlaceholder":119},[106,975,976],{"class":108,"line":561},[106,977,792],{"class":112},[106,979,980,982,984,986,988,990],{"class":108,"line":567},[106,981,455],{"class":301},[106,983,305],{"class":163},[106,985,801],{"class":160},[106,987,311],{"class":163},[106,989,806],{"class":130},[106,991,373],{"class":163},[106,993,994,997,1000,1003,1005,1007,1009,1011,1013,1015],{"class":108,"line":573},[106,995,996],{"class":163},"  .",[106,998,999],{"class":160},"then",[106,1001,1002],{"class":163},"(() ",[106,1004,337],{"class":126},[106,1006,153],{"class":301},[106,1008,305],{"class":163},[106,1010,702],{"class":160},[106,1012,311],{"class":163},[106,1014,708],{"class":707},[106,1016,1017],{"class":163},"))\n",[67,1019],{},[28,1021,1022],{},"Voilà, côté serveur, MCP n'est pas plus compliqué qu'Express.js - juste une façon différente de décrire ce que fait chaque outil. Le vrai gain apparaît côté client : c'est là que le LLM lit ces descriptions et décide quoi appeler. On verra ça dans le prochain article.",[1024,1025,1026],"style",{},"html pre.shiki code .s91Lf, html code.shiki .s91Lf{--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#7F848E;--shiki-dark-font-style:italic}html pre.shiki code .sudEI, html code.shiki .sudEI{--shiki-default:#D73A49;--shiki-dark:#C678DD}html pre.shiki code .s33T6, html code.shiki .s33T6{--shiki-default:#24292E;--shiki-dark:#E06C75}html pre.shiki code .sDOtg, html code.shiki .sDOtg{--shiki-default:#032F62;--shiki-dark:#98C379}html pre.shiki code .sZ6H1, html code.shiki .sZ6H1{--shiki-default:#005CC5;--shiki-dark:#E5C07B}html pre.shiki code .su5p0, html code.shiki .su5p0{--shiki-default:#D73A49;--shiki-dark:#56B6C2}html pre.shiki code .sotTb, html code.shiki .sotTb{--shiki-default:#6F42C1;--shiki-dark:#61AFEF}html pre.shiki code .sXDFC, html code.shiki .sXDFC{--shiki-default:#24292E;--shiki-dark:#ABB2BF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9okb, html code.shiki .s9okb{--shiki-default:#24292E;--shiki-dark:#E5C07B}html pre.shiki code .sagcK, html code.shiki .sagcK{--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic}html pre.shiki code .syI6z, html code.shiki .syI6z{--shiki-default:#005CC5;--shiki-dark:#D19A66}",{"title":101,"searchDepth":116,"depth":116,"links":1028},[1029,1034],{"id":37,"depth":116,"text":38,"children":1030},[1031,1032,1033],{"id":45,"depth":123,"text":46},{"id":90,"depth":123,"text":91},{"id":256,"depth":123,"text":257},{"id":675,"depth":116,"text":676},"2026-07-06","Express.js vs MCP : la même logique, une API que les LLM comprennent mieux","md","\u002Fblog\u002F2026-07-06\u002Fcover.webp","fr",{},"\u002Fblog\u002F2026-07-06-mcp-pour-les-enfants",{"title":19,"description":1036},"blog\u002F2026-07-06-mcp-pour-les-enfants",[1045,1046,1047],"MCP","AI","NodeJS","EcjQEjkG6aZp6TYtlEXNC9ZdFYGF8cz0L1wtpUNzpjo",{"title":1050,"path":1051,"stem":1052,"description":1053,"children":-1},"Taming the Chaos: Building a Custom File Format Toolkit","\u002Fblog\u002F2025-02-19-taming-the-chaos","blog\u002F2025-02-19-taming-the-chaos","How I built a toolkit for a custom file format. Which difficulties I faced and how I solved them.",{"title":1055,"path":1056,"stem":1057,"description":1036,"children":-1},"C’est quoi ça, le client MCP ?","\u002Fblog\u002F2026-07-30-client-mcp","blog\u002F2026-07-30-client-mcp",{"left":4,"top":4,"width":1059,"height":1059,"rotate":4,"vFlip":6,"hFlip":6,"body":1060},72,"\u003Cpath fill=\"#fff\" d=\"M5 17h62v38H5z\"\u002F>\u003Cpath fill=\"#1e50a0\" d=\"M5 17h21v38H5z\"\u002F>\u003Cpath fill=\"#d22f27\" d=\"M46 17h21v38H46z\"\u002F>\u003Cpath fill=\"none\" stroke=\"#000\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 17h62v38H5z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1062},"\u003Cpath fill=\"currentColor\" d=\"M6 5h2.5a3 3 0 0 1 3-3a3 3 0 0 1 3 3H17a3 3 0 0 1 3 3v11a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V8a3 3 0 0 1 3-3m0 1a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-1v3H7V6zm2 2h7V6H8zm3.5-5a2 2 0 0 0-2 2h4a2 2 0 0 0-2-2\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1064},"\u003Cpath fill=\"currentColor\" d=\"M22 3H2v15h5l-1 1v2h12v-2l-1-1h5zm-2 13H4V5h16z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1066},"\u003Cpath fill=\"currentColor\" d=\"M17.51 3.87L15.73 2.1L5.84 12l9.9 9.9l1.77-1.77L9.38 12z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":1068},"\u003Cpath fill=\"currentColor\" d=\"M6.23 20.23L8 22l10-10L8 2L6.23 3.77L14.46 12z\"\u002F>",1787421103530]