[{"data":1,"prerenderedAt":5322},["ShallowReactive",2],{"navigation_fr":3,"posts_fr:/fr/blog/mcp-tiny-agents-on-premises":51,"posts_fr:/fr/blog/mcp-tiny-agents-on-premises:surround":2085},[4],{"title":5,"path":6,"stem":7,"children":8,"page":50},"Fr","/fr","fr",[9],{"title":10,"path":11,"stem":12,"children":13,"page":50},"Blog","/fr/blog","fr/blog",[14,18,22,26,30,34,38,42,46],{"title":15,"path":16,"stem":17},"Serveurs MCP comme Serveurs de Ressources OAuth : Une Approche Simplifiée","/fr/blog/mcp-aouth","fr/blog/1. mcp-aouth",{"title":19,"path":20,"stem":21},"Pratiques de Sécurité pour MCP Utilisant JSON-RPC","/fr/blog/mcp-security","fr/blog/1. mcp-security",{"title":23,"path":24,"stem":25},"Serveurs MCP : Connecter l'IA aux Données en Temps Réel","/fr/blog/mcp-create","fr/blog/2. mcp-create",{"title":27,"path":28,"stem":29},"Agents MCP Tiny On-Premises : S'affranchir des Dépendances Cloud","/fr/blog/mcp-tiny-agents-on-premises","fr/blog/5. mcp-tiny-agents-on-premises",{"title":31,"path":32,"stem":33},"De l'Idée à l'API en 2 Jours : Construction de Bankly avec les Flux de Travail Agentiques","/fr/blog/overvibing","fr/blog/6. overvibing",{"title":35,"path":36,"stem":37},"Chatbot IA, Serveur MCP construit avec le Protocole de Flux de Travail Agentique pour démo sur Checkatrade.com","/fr/blog/mcp-in-chat-demo","fr/blog/8. mcp-in-chat-demo",{"title":39,"path":40,"stem":41},"DDD et les Frameworks Full-Stack","/fr/blog/architecture","fr/blog/architecture",{"title":43,"path":44,"stem":45},"Qualité : Comment protéger les Frontends alimentés par l'IA ?","/fr/blog/qa-front","fr/blog/qa-front",{"title":47,"path":48,"stem":49},"Consultation et Stratégie IT","/fr/blog/strategy","fr/blog/strategy",false,{"id":52,"title":27,"authors":53,"badge":60,"body":64,"date":2076,"description":2077,"extension":2078,"image":2079,"meta":2081,"navigation":2082,"path":28,"seo":2083,"stem":29,"__hash__":2084},"posts_fr/fr/blog/5. mcp-tiny-agents-on-premises.md",[54],{"name":55,"description":56,"to":57,"avatar":58},"Michael Wybraniec","Freelance, Serveurs MCP, Développeur Full-Stack, Architecture","https://www.linkedin.com/in/one-front/",{"src":59},"https://media.licdn.com/dms/image/v2/D4D03AQEGvIVcrTTS2g/profile-displayphoto-shrink_800_800/B4DZbtSf7LIEAc-/0/1747737772225?e=1753315200&v=beta&t=EOviZQkM396PoGctVjDCdlG8U3vN5UKWiIeNQ8IFUgQ",{"label":61,"color":62,"variant":63},"MCP, On-Premises","error","soft",{"type":65,"value":66,"toc":2059},"minimark",[67,72,76,447,454,457,477,527,540,1264,1896,2031,2055],[68,69,71],"h2",{"id":70},"vue-densemble-de-larchitecture","Vue d'Ensemble de l'Architecture",[73,74,75],"p",{},"La beauté des Agents MCP Tiny réside dans leur simplicité architecturale. Qu'ils soient déployés dans le cloud ou on-premises, les composants principaux restent les mêmes : un agent léger, un client MCP et des outils connectés. Voici comment l'architecture complète on-premises se compare aux alternatives cloud :",[77,78,83],"pre",{"className":79,"code":80,"language":81,"meta":82,"style":82},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","graph TB\n    subgraph \"Infrastructure On-Premises\"\n        subgraph \"Stack IA Local\"\n            Agent[\"Agent Tiny\u003Cbr/>(~50 lignes)\"]\n            LocalLLM[\"LLM Local\u003Cbr/>Ollama/LM Studio\u003Cbr/>Qwen2.5-32B\"]\n            MCPClient[\"Client MCP\u003Cbr/>Gestionnaire d'Outils\"]\n        end\n        \n        subgraph \"Serveurs MCP Locaux\"\n            FileServer[\"Système de Fichiers\u003Cbr/>Serveur MCP\"]\n            WebServer[\"Playwright\u003Cbr/>Serveur MCP\"]\n            BusinessAPI[\"API Métier\u003Cbr/>Serveur MCP\"]\n            DatabaseServer[\"Base de Données\u003Cbr/>Serveur MCP\"]\n        end\n        \n        subgraph \"Couche Matérielle\"\n            GPU[\"GPU/CPU\u003Cbr/>16-140GB VRAM\"]\n            Storage[\"Stockage Modèles\u003Cbr/>GGUF/Safetensors\"]\n        end\n    end\n    \n    subgraph \"Alternative Cloud (Article HF)\"\n        CloudAgent[\"Agent Tiny\u003Cbr/>(Même Code)\"]\n        CloudAPI[\"Nebius/Cohere\u003Cbr/>Qwen2.5-72B\"]\n        CloudMCP[\"Client MCP Cloud\"]\n    end\n    \n    subgraph \"Architecture Hybride\"\n        Router[\"Routeur Intelligent\u003Cbr/>Classification des Données\"]\n        LocalPath[\"Données Sensibles → Local\"]\n        CloudPath[\"Tâches Complexes → Cloud\"]\n    end\n    \n    Agent -->|\"Requêtes d'Outils\"| MCPClient\n    MCPClient -->|\"Appels de Fonctions\"| LocalLLM\n    LocalLLM -->|\"Inférence\"| GPU\n    GPU -->|\"Chargement Modèles\"| Storage\n    \n    MCPClient -->|\"Exécution d'Outils\"| FileServer\n    MCPClient -->|\"Navigation Web\"| WebServer\n    MCPClient -->|\"Logique Métier\"| BusinessAPI\n    MCPClient -->|\"Requêtes de Données\"| DatabaseServer\n    \n    CloudAgent -->|\"Appels API\"| CloudMCP\n    CloudMCP -->|\"Inférence\"| CloudAPI\n    \n    Router -->|\"Décision de Route\"| LocalPath\n    Router -->|\"Décision de Route\"| CloudPath\n    LocalPath -->|\"Exécuter en Local\"| Agent\n    CloudPath -->|\"Exécuter dans le Cloud\"| CloudAgent\n    \n    Agent -.->|\"Boucle While\u003Cbr/>Jusqu'à Completion\"| Agent\n    \n    classDef localInfra stroke:#0277bd,stroke-width:2px\n    classDef cloudInfra stroke:#f57c00,stroke-width:2px\n    classDef hybridInfra stroke:#7b1fa2,stroke-width:2px\n    classDef hardware stroke:#388e3c,stroke-width:2px\n    \n    class Agent,LocalLLM,MCPClient,FileServer,WebServer,BusinessAPI,DatabaseServer localInfra\n    class CloudAgent,CloudAPI,CloudMCP cloudInfra\n    class Router,LocalPath,CloudPath hybridInfra\n    class GPU,Storage hardware\n","mermaid","",[84,85,86,94,100,106,112,118,124,130,136,142,148,154,160,166,171,176,182,188,194,199,205,211,217,223,229,235,240,245,251,257,263,269,274,279,285,291,297,303,308,314,320,326,332,337,343,349,354,360,366,372,378,383,389,394,400,406,412,418,423,429,435,441],"code",{"__ignoreMap":82},[87,88,91],"span",{"class":89,"line":90},"line",1,[87,92,93],{},"graph TB\n",[87,95,97],{"class":89,"line":96},2,[87,98,99],{},"    subgraph \"Infrastructure On-Premises\"\n",[87,101,103],{"class":89,"line":102},3,[87,104,105],{},"        subgraph \"Stack IA Local\"\n",[87,107,109],{"class":89,"line":108},4,[87,110,111],{},"            Agent[\"Agent Tiny\u003Cbr/>(~50 lignes)\"]\n",[87,113,115],{"class":89,"line":114},5,[87,116,117],{},"            LocalLLM[\"LLM Local\u003Cbr/>Ollama/LM Studio\u003Cbr/>Qwen2.5-32B\"]\n",[87,119,121],{"class":89,"line":120},6,[87,122,123],{},"            MCPClient[\"Client MCP\u003Cbr/>Gestionnaire d'Outils\"]\n",[87,125,127],{"class":89,"line":126},7,[87,128,129],{},"        end\n",[87,131,133],{"class":89,"line":132},8,[87,134,135],{},"        \n",[87,137,139],{"class":89,"line":138},9,[87,140,141],{},"        subgraph \"Serveurs MCP Locaux\"\n",[87,143,145],{"class":89,"line":144},10,[87,146,147],{},"            FileServer[\"Système de Fichiers\u003Cbr/>Serveur MCP\"]\n",[87,149,151],{"class":89,"line":150},11,[87,152,153],{},"            WebServer[\"Playwright\u003Cbr/>Serveur MCP\"]\n",[87,155,157],{"class":89,"line":156},12,[87,158,159],{},"            BusinessAPI[\"API Métier\u003Cbr/>Serveur MCP\"]\n",[87,161,163],{"class":89,"line":162},13,[87,164,165],{},"            DatabaseServer[\"Base de Données\u003Cbr/>Serveur MCP\"]\n",[87,167,169],{"class":89,"line":168},14,[87,170,129],{},[87,172,174],{"class":89,"line":173},15,[87,175,135],{},[87,177,179],{"class":89,"line":178},16,[87,180,181],{},"        subgraph \"Couche Matérielle\"\n",[87,183,185],{"class":89,"line":184},17,[87,186,187],{},"            GPU[\"GPU/CPU\u003Cbr/>16-140GB VRAM\"]\n",[87,189,191],{"class":89,"line":190},18,[87,192,193],{},"            Storage[\"Stockage Modèles\u003Cbr/>GGUF/Safetensors\"]\n",[87,195,197],{"class":89,"line":196},19,[87,198,129],{},[87,200,202],{"class":89,"line":201},20,[87,203,204],{},"    end\n",[87,206,208],{"class":89,"line":207},21,[87,209,210],{},"    \n",[87,212,214],{"class":89,"line":213},22,[87,215,216],{},"    subgraph \"Alternative Cloud (Article HF)\"\n",[87,218,220],{"class":89,"line":219},23,[87,221,222],{},"        CloudAgent[\"Agent Tiny\u003Cbr/>(Même Code)\"]\n",[87,224,226],{"class":89,"line":225},24,[87,227,228],{},"        CloudAPI[\"Nebius/Cohere\u003Cbr/>Qwen2.5-72B\"]\n",[87,230,232],{"class":89,"line":231},25,[87,233,234],{},"        CloudMCP[\"Client MCP Cloud\"]\n",[87,236,238],{"class":89,"line":237},26,[87,239,204],{},[87,241,243],{"class":89,"line":242},27,[87,244,210],{},[87,246,248],{"class":89,"line":247},28,[87,249,250],{},"    subgraph \"Architecture Hybride\"\n",[87,252,254],{"class":89,"line":253},29,[87,255,256],{},"        Router[\"Routeur Intelligent\u003Cbr/>Classification des Données\"]\n",[87,258,260],{"class":89,"line":259},30,[87,261,262],{},"        LocalPath[\"Données Sensibles → Local\"]\n",[87,264,266],{"class":89,"line":265},31,[87,267,268],{},"        CloudPath[\"Tâches Complexes → Cloud\"]\n",[87,270,272],{"class":89,"line":271},32,[87,273,204],{},[87,275,277],{"class":89,"line":276},33,[87,278,210],{},[87,280,282],{"class":89,"line":281},34,[87,283,284],{},"    Agent -->|\"Requêtes d'Outils\"| MCPClient\n",[87,286,288],{"class":89,"line":287},35,[87,289,290],{},"    MCPClient -->|\"Appels de Fonctions\"| LocalLLM\n",[87,292,294],{"class":89,"line":293},36,[87,295,296],{},"    LocalLLM -->|\"Inférence\"| GPU\n",[87,298,300],{"class":89,"line":299},37,[87,301,302],{},"    GPU -->|\"Chargement Modèles\"| Storage\n",[87,304,306],{"class":89,"line":305},38,[87,307,210],{},[87,309,311],{"class":89,"line":310},39,[87,312,313],{},"    MCPClient -->|\"Exécution d'Outils\"| FileServer\n",[87,315,317],{"class":89,"line":316},40,[87,318,319],{},"    MCPClient -->|\"Navigation Web\"| WebServer\n",[87,321,323],{"class":89,"line":322},41,[87,324,325],{},"    MCPClient -->|\"Logique Métier\"| BusinessAPI\n",[87,327,329],{"class":89,"line":328},42,[87,330,331],{},"    MCPClient -->|\"Requêtes de Données\"| DatabaseServer\n",[87,333,335],{"class":89,"line":334},43,[87,336,210],{},[87,338,340],{"class":89,"line":339},44,[87,341,342],{},"    CloudAgent -->|\"Appels API\"| CloudMCP\n",[87,344,346],{"class":89,"line":345},45,[87,347,348],{},"    CloudMCP -->|\"Inférence\"| CloudAPI\n",[87,350,352],{"class":89,"line":351},46,[87,353,210],{},[87,355,357],{"class":89,"line":356},47,[87,358,359],{},"    Router -->|\"Décision de Route\"| LocalPath\n",[87,361,363],{"class":89,"line":362},48,[87,364,365],{},"    Router -->|\"Décision de Route\"| CloudPath\n",[87,367,369],{"class":89,"line":368},49,[87,370,371],{},"    LocalPath -->|\"Exécuter en Local\"| Agent\n",[87,373,375],{"class":89,"line":374},50,[87,376,377],{},"    CloudPath -->|\"Exécuter dans le Cloud\"| CloudAgent\n",[87,379,381],{"class":89,"line":380},51,[87,382,210],{},[87,384,386],{"class":89,"line":385},52,[87,387,388],{},"    Agent -.->|\"Boucle While\u003Cbr/>Jusqu'à Completion\"| Agent\n",[87,390,392],{"class":89,"line":391},53,[87,393,210],{},[87,395,397],{"class":89,"line":396},54,[87,398,399],{},"    classDef localInfra stroke:#0277bd,stroke-width:2px\n",[87,401,403],{"class":89,"line":402},55,[87,404,405],{},"    classDef cloudInfra stroke:#f57c00,stroke-width:2px\n",[87,407,409],{"class":89,"line":408},56,[87,410,411],{},"    classDef hybridInfra stroke:#7b1fa2,stroke-width:2px\n",[87,413,415],{"class":89,"line":414},57,[87,416,417],{},"    classDef hardware stroke:#388e3c,stroke-width:2px\n",[87,419,421],{"class":89,"line":420},58,[87,422,210],{},[87,424,426],{"class":89,"line":425},59,[87,427,428],{},"    class Agent,LocalLLM,MCPClient,FileServer,WebServer,BusinessAPI,DatabaseServer localInfra\n",[87,430,432],{"class":89,"line":431},60,[87,433,434],{},"    class CloudAgent,CloudAPI,CloudMCP cloudInfra\n",[87,436,438],{"class":89,"line":437},61,[87,439,440],{},"    class Router,LocalPath,CloudPath hybridInfra\n",[87,442,444],{"class":89,"line":443},62,[87,445,446],{},"    class GPU,Storage hardware\n",[73,448,449,453],{},[450,451,452],"strong",{},"Idée Clé"," : Le même code d'agent fonctionne sur tous les modèles de déploiement. La puissance des APIs standardisées signifie que votre investissement dans les outils MCP et la logique d'agent reste portable, que vous choisissiez la commodité du cloud, le contrôle on-premises ou une approche hybride stratégique.",[455,456],"hr",{},[458,459,464,468],"div",{"className":460},[461,462,463],"flex","justify-between","items-center",[68,465,467],{"id":466},"le-piège-de-la-commodité-cloud","Le Piège de la Commodité Cloud",[73,469,470],{},[471,472,474],"a",{"href":473},"#top",[450,475,476],{},"⤴",[458,478,481,487,490,524],{"className":479},[480],"text-justify",[73,482,483,484],{},"L'implémentation de Hugging Face illustre l'élégance des architectures IA modernes. Avec seulement quelques lignes de TypeScript, vous pouvez créer un agent qui se connecte à plusieurs serveurs MCP (système de fichiers, navigation web via Playwright) et exploite des modèles puissants comme Qwen/Qwen2.5-72B-Instruct. L'idée fondamentale est profonde : ",[450,485,486],{},"\"Une fois que vous avez un Client MCP, un Agent n'est littéralement qu'une boucle while au-dessus.\"",[73,488,489],{},"Mais cette commodité s'accompagne de dépendances :",[491,492,493,500,506,512,518],"ul",{},[494,495,496,499],"li",{},[450,497,498],{},"Confidentialité des Données"," : Chaque requête, chaque appel d'outil, chaque contexte métier transite par des APIs externes",[494,501,502,505],{},[450,503,504],{},"Imprévisibilité des Coûts"," : La tarification basée sur les tokens peut s'envoler avec des interactions d'agents complexes",[494,507,508,511],{},[450,509,510],{},"Contraintes de Latence"," : Les allers-retours réseau ajoutent du délai à chaque étape d'inférence",[494,513,514,517],{},[450,515,516],{},"Dépendance au Fournisseur"," : Changer de fournisseur nécessite des modifications de code et une revalidation",[494,519,520,523],{},[450,521,522],{},"Problèmes de Conformité"," : Les industries réglementées peuvent interdire l'envoi de données vers des services externes",[73,525,526],{},"La question devient : Pouvons-nous maintenir la simplicité des Tiny Agents tout en obtenant un contrôle complet on-premises ?",[458,528,530,534],{"className":529},[461,462,463],[68,531,533],{"id":532},"anatomie-dun-tiny-agent-local","Anatomie d'un Tiny Agent Local",[73,535,536],{},[471,537,538],{"href":473},[450,539,476],{},[458,541,543,546,553,556,588,591,597,600,606,609,643,646,720,723,729,732,1060,1073],{"className":542},[480],[73,544,545],{},"La réponse est oui, mais avec des compromis importants. Analysons ce qui change lors du passage du cloud à l'on-premises :",[547,548,550],"h3",{"id":549},"sélection-du-modèle-et-moteur-dinférence",[450,551,552],{},"Sélection du Modèle et Moteur d'Inférence",[73,554,555],{},"Au lieu d'appeler des APIs externes, nous avons besoin d'inférence locale. Les options se sont considérablement améliorées :",[491,557,558,564,570,576,582],{},[494,559,560,563],{},[450,561,562],{},"Ollama"," : Déploiement le plus simple, supporte Qwen2.5, Llama 3.1 et d'autres modèles instruits",[494,565,566,569],{},[450,567,568],{},"llama.cpp"," : Exécution directe de modèles avec inférence optimisée",[494,571,572,575],{},[450,573,574],{},"LM Studio"," : Interface conviviale avec compatibilité API",[494,577,578,581],{},[450,579,580],{},"vLLM"," : Service de niveau production avec endpoints compatibles OpenAI",[494,583,584,587],{},[450,585,586],{},"LocalAI"," : Compatibilité complète avec l'API OpenAI pour les modèles locaux",[73,589,590],{},"L'idée clé de l'article HF s'applique ici : les LLMs modernes ont un support natif des appels de fonctions. Des modèles comme Qwen2.5-32B-Instruct, Llama 3.1-70B-Instruct, et même des variantes plus petites peuvent gérer efficacement l'utilisation d'outils.",[547,592,594],{"id":593},"larchitecture-du-serveur-mcp-reste-inchangée",[450,595,596],{},"L'Architecture du Serveur MCP Reste Inchangée",[73,598,599],{},"C'est ici que brille le protocole MCP. Vos serveurs MCP existants—qu'ils exposent des systèmes de fichiers, des bases de données ou des APIs métier personnalisées—continuent de fonctionner sans modification. L'abstraction du protocole signifie que vos outils restent portables entre les déploiements cloud et on-premises.",[547,601,603],{"id":602},"implémentation-modifiée-de-lagent",[450,604,605],{},"Implémentation Modifiée de l'Agent",[73,607,608],{},"La logique centrale de l'agent change à peine. Au lieu de :",[77,610,614],{"className":611,"code":612,"language":613,"meta":82,"style":82},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const client = new InferenceClient(apiKey);\n","typescript",[84,615,616],{"__ignoreMap":82},[87,617,618,622,626,630,633,637,640],{"class":89,"line":90},[87,619,621],{"class":620},"spNyl","const",[87,623,625],{"class":624},"sTEyZ"," client ",[87,627,629],{"class":628},"sMK4o","=",[87,631,632],{"class":628}," new",[87,634,636],{"class":635},"s2Zo4"," InferenceClient",[87,638,639],{"class":624},"(apiKey)",[87,641,642],{"class":628},";\n",[73,644,645],{},"Vous vous connectez à votre endpoint local :",[77,647,649],{"className":611,"code":648,"language":613,"meta":82,"style":82},"const client = new InferenceClient({\n  baseUrl: \"http://localhost:1234/v1\", // LM Studio\n  apiKey: \"not-needed-for-local\"\n});\n",[84,650,651,669,695,710],{"__ignoreMap":82},[87,652,653,655,657,659,661,663,666],{"class":89,"line":90},[87,654,621],{"class":620},[87,656,625],{"class":624},[87,658,629],{"class":628},[87,660,632],{"class":628},[87,662,636],{"class":635},[87,664,665],{"class":624},"(",[87,667,668],{"class":628},"{\n",[87,670,671,675,678,681,685,688,691],{"class":89,"line":96},[87,672,674],{"class":673},"swJcz","  baseUrl",[87,676,677],{"class":628},":",[87,679,680],{"class":628}," \"",[87,682,684],{"class":683},"sfazB","http://localhost:1234/v1",[87,686,687],{"class":628},"\"",[87,689,690],{"class":628},",",[87,692,694],{"class":693},"sHwdD"," // LM Studio\n",[87,696,697,700,702,704,707],{"class":89,"line":102},[87,698,699],{"class":673},"  apiKey",[87,701,677],{"class":628},[87,703,680],{"class":628},[87,705,706],{"class":683},"not-needed-for-local",[87,708,709],{"class":628},"\"\n",[87,711,712,715,718],{"class":89,"line":108},[87,713,714],{"class":628},"}",[87,716,717],{"class":624},")",[87,719,642],{"class":628},[73,721,722],{},"La boucle while, l'appel d'outils et l'intégration MCP restent identiques. C'est la puissance des APIs standardisées—l'agent ne se soucie pas d'où se produit l'inférence.",[547,724,726],{"id":725},"la-boucle-while-en-action",[450,727,728],{},"La Boucle While en Action",[73,730,731],{},"Rappelez-vous l'idée centrale de l'article HF : \"un Agent n'est littéralement qu'une boucle while.\" Voici comment cela se déroule en pratique :",[77,733,735],{"className":79,"code":734,"language":81,"meta":82,"style":82},"flowchart TD\n    Start([\"Requête Utilisateur\u003Cbr/>Obtenir météo et sauvegarder\"])\n    \n    subgraph \"Boucle While du Tiny Agent (On-Premises)\"\n        Initialize[\"Initialiser Agent\u003Cbr/>Charger LLM Local\u003Cbr/>Connecter Serveurs MCP\"]\n        \n        subgraph \"Boucle Principale\"\n            ParseIntent[\"LLM Analyse Intention\u003Cbr/>Local Qwen2.5-32B\"]\n            ToolDecision{\"Outils\u003Cbr/>Nécessaires?\"}\n            \n            subgraph \"Phase 1 d'Exécution\"\n                CallTool[\"Appeler Outil MCP\u003Cbr/>get_weather(lat, lng)\"]\n                ExecuteTool[\"Exécuter Outil\u003Cbr/>Récupérer Données Météo\"]\n                ToolResult[\"Résultat\u003Cbr/>Température: 72°F\"]\n            end\n            \n            FeedResult[\"Alimenter Résultat au LLM\u003Cbr/>Poursuivre Raisonnement\"]\n            \n            subgraph \"Phase 2 d'Exécution\"\n                CallTool2[\"Appeler Autre Outil\u003Cbr/>write_file(weather.txt)\"]\n                ExecuteTool2[\"Exécuter Écriture\u003Cbr/>Sauvegarder Données Météo\"]\n                ToolResult2[\"Fichier Sauvegardé\u003Cbr/>Desktop/weather.txt\"]\n            end\n            \n            Complete{\"Tâche Terminée?\"}\n            Response[\"Générer Réponse\u003Cbr/>Météo sauvegardée avec succès\"]\n        end\n    end\n    \n    End([\"Tâche Accomplie\"])\n    \n    %% Connexions de flux\n    Start --> Initialize\n    Initialize --> ParseIntent\n    ParseIntent --> ToolDecision\n    \n    ToolDecision -->|\"Oui - Besoin Météo\"| CallTool\n    CallTool --> ExecuteTool\n    ExecuteTool --> ToolResult\n    ToolResult --> FeedResult\n    \n    FeedResult --> ToolDecision\n    ToolDecision -->|\"Oui - Besoin Sauvegarde\"| CallTool2\n    CallTool2 --> ExecuteTool2\n    ExecuteTool2 --> ToolResult2\n    ToolResult2 --> FeedResult\n    \n    ToolDecision -->|\"Plus d'Outils\"| Complete\n    Complete -->|\"Oui\"| Response\n    Complete -->|\"Non - Continuer\"| ParseIntent\n    \n    Response --> End\n    \n    %% Annotation idée clé\n    LoopNote[\"Idée Centrale:\u003Cbr/>Agent = Boucle While\u003Cbr/>+ Client MCP\u003Cbr/>+ LLM Local\"]\n    LoopNote -.-> ParseIntent\n    \n    %% Styles\n    classDef agent stroke:#1976d2,stroke-width:2px\n    classDef tool stroke:#388e3c,stroke-width:2px\n    classDef decision stroke:#f57c00,stroke-width:2px\n    classDef insight stroke:#c2185b,stroke-width:2px\n    \n    class Initialize,ParseIntent,FeedResult,Response agent\n    class CallTool,ExecuteTool,ToolResult,CallTool2,ExecuteTool2,ToolResult2 tool\n    class ToolDecision,Complete decision\n    class LoopNote insight\n",[84,736,737,742,747,751,756,761,765,770,775,780,785,790,795,800,805,810,814,819,823,828,833,838,843,847,851,856,861,865,869,873,878,882,887,892,897,902,906,911,916,921,926,930,935,940,945,950,955,959,964,969,974,978,983,987,992,997,1002,1006,1011,1016,1021,1026,1031,1036,1042,1048,1054],{"__ignoreMap":82},[87,738,739],{"class":89,"line":90},[87,740,741],{},"flowchart TD\n",[87,743,744],{"class":89,"line":96},[87,745,746],{},"    Start([\"Requête Utilisateur\u003Cbr/>Obtenir météo et sauvegarder\"])\n",[87,748,749],{"class":89,"line":102},[87,750,210],{},[87,752,753],{"class":89,"line":108},[87,754,755],{},"    subgraph \"Boucle While du Tiny Agent (On-Premises)\"\n",[87,757,758],{"class":89,"line":114},[87,759,760],{},"        Initialize[\"Initialiser Agent\u003Cbr/>Charger LLM Local\u003Cbr/>Connecter Serveurs MCP\"]\n",[87,762,763],{"class":89,"line":120},[87,764,135],{},[87,766,767],{"class":89,"line":126},[87,768,769],{},"        subgraph \"Boucle Principale\"\n",[87,771,772],{"class":89,"line":132},[87,773,774],{},"            ParseIntent[\"LLM Analyse Intention\u003Cbr/>Local Qwen2.5-32B\"]\n",[87,776,777],{"class":89,"line":138},[87,778,779],{},"            ToolDecision{\"Outils\u003Cbr/>Nécessaires?\"}\n",[87,781,782],{"class":89,"line":144},[87,783,784],{},"            \n",[87,786,787],{"class":89,"line":150},[87,788,789],{},"            subgraph \"Phase 1 d'Exécution\"\n",[87,791,792],{"class":89,"line":156},[87,793,794],{},"                CallTool[\"Appeler Outil MCP\u003Cbr/>get_weather(lat, lng)\"]\n",[87,796,797],{"class":89,"line":162},[87,798,799],{},"                ExecuteTool[\"Exécuter Outil\u003Cbr/>Récupérer Données Météo\"]\n",[87,801,802],{"class":89,"line":168},[87,803,804],{},"                ToolResult[\"Résultat\u003Cbr/>Température: 72°F\"]\n",[87,806,807],{"class":89,"line":173},[87,808,809],{},"            end\n",[87,811,812],{"class":89,"line":178},[87,813,784],{},[87,815,816],{"class":89,"line":184},[87,817,818],{},"            FeedResult[\"Alimenter Résultat au LLM\u003Cbr/>Poursuivre Raisonnement\"]\n",[87,820,821],{"class":89,"line":190},[87,822,784],{},[87,824,825],{"class":89,"line":196},[87,826,827],{},"            subgraph \"Phase 2 d'Exécution\"\n",[87,829,830],{"class":89,"line":201},[87,831,832],{},"                CallTool2[\"Appeler Autre Outil\u003Cbr/>write_file(weather.txt)\"]\n",[87,834,835],{"class":89,"line":207},[87,836,837],{},"                ExecuteTool2[\"Exécuter Écriture\u003Cbr/>Sauvegarder Données Météo\"]\n",[87,839,840],{"class":89,"line":213},[87,841,842],{},"                ToolResult2[\"Fichier Sauvegardé\u003Cbr/>Desktop/weather.txt\"]\n",[87,844,845],{"class":89,"line":219},[87,846,809],{},[87,848,849],{"class":89,"line":225},[87,850,784],{},[87,852,853],{"class":89,"line":231},[87,854,855],{},"            Complete{\"Tâche Terminée?\"}\n",[87,857,858],{"class":89,"line":237},[87,859,860],{},"            Response[\"Générer Réponse\u003Cbr/>Météo sauvegardée avec succès\"]\n",[87,862,863],{"class":89,"line":242},[87,864,129],{},[87,866,867],{"class":89,"line":247},[87,868,204],{},[87,870,871],{"class":89,"line":253},[87,872,210],{},[87,874,875],{"class":89,"line":259},[87,876,877],{},"    End([\"Tâche Accomplie\"])\n",[87,879,880],{"class":89,"line":265},[87,881,210],{},[87,883,884],{"class":89,"line":271},[87,885,886],{},"    %% Connexions de flux\n",[87,888,889],{"class":89,"line":276},[87,890,891],{},"    Start --> Initialize\n",[87,893,894],{"class":89,"line":281},[87,895,896],{},"    Initialize --> ParseIntent\n",[87,898,899],{"class":89,"line":287},[87,900,901],{},"    ParseIntent --> ToolDecision\n",[87,903,904],{"class":89,"line":293},[87,905,210],{},[87,907,908],{"class":89,"line":299},[87,909,910],{},"    ToolDecision -->|\"Oui - Besoin Météo\"| CallTool\n",[87,912,913],{"class":89,"line":305},[87,914,915],{},"    CallTool --> ExecuteTool\n",[87,917,918],{"class":89,"line":310},[87,919,920],{},"    ExecuteTool --> ToolResult\n",[87,922,923],{"class":89,"line":316},[87,924,925],{},"    ToolResult --> FeedResult\n",[87,927,928],{"class":89,"line":322},[87,929,210],{},[87,931,932],{"class":89,"line":328},[87,933,934],{},"    FeedResult --> ToolDecision\n",[87,936,937],{"class":89,"line":334},[87,938,939],{},"    ToolDecision -->|\"Oui - Besoin Sauvegarde\"| CallTool2\n",[87,941,942],{"class":89,"line":339},[87,943,944],{},"    CallTool2 --> ExecuteTool2\n",[87,946,947],{"class":89,"line":345},[87,948,949],{},"    ExecuteTool2 --> ToolResult2\n",[87,951,952],{"class":89,"line":351},[87,953,954],{},"    ToolResult2 --> FeedResult\n",[87,956,957],{"class":89,"line":356},[87,958,210],{},[87,960,961],{"class":89,"line":362},[87,962,963],{},"    ToolDecision -->|\"Plus d'Outils\"| Complete\n",[87,965,966],{"class":89,"line":368},[87,967,968],{},"    Complete -->|\"Oui\"| Response\n",[87,970,971],{"class":89,"line":374},[87,972,973],{},"    Complete -->|\"Non - Continuer\"| ParseIntent\n",[87,975,976],{"class":89,"line":380},[87,977,210],{},[87,979,980],{"class":89,"line":385},[87,981,982],{},"    Response --> End\n",[87,984,985],{"class":89,"line":391},[87,986,210],{},[87,988,989],{"class":89,"line":396},[87,990,991],{},"    %% Annotation idée clé\n",[87,993,994],{"class":89,"line":402},[87,995,996],{},"    LoopNote[\"Idée Centrale:\u003Cbr/>Agent = Boucle While\u003Cbr/>+ Client MCP\u003Cbr/>+ LLM Local\"]\n",[87,998,999],{"class":89,"line":408},[87,1000,1001],{},"    LoopNote -.-> ParseIntent\n",[87,1003,1004],{"class":89,"line":414},[87,1005,210],{},[87,1007,1008],{"class":89,"line":420},[87,1009,1010],{},"    %% Styles\n",[87,1012,1013],{"class":89,"line":425},[87,1014,1015],{},"    classDef agent stroke:#1976d2,stroke-width:2px\n",[87,1017,1018],{"class":89,"line":431},[87,1019,1020],{},"    classDef tool stroke:#388e3c,stroke-width:2px\n",[87,1022,1023],{"class":89,"line":437},[87,1024,1025],{},"    classDef decision stroke:#f57c00,stroke-width:2px\n",[87,1027,1028],{"class":89,"line":443},[87,1029,1030],{},"    classDef insight stroke:#c2185b,stroke-width:2px\n",[87,1032,1034],{"class":89,"line":1033},63,[87,1035,210],{},[87,1037,1039],{"class":89,"line":1038},64,[87,1040,1041],{},"    class Initialize,ParseIntent,FeedResult,Response agent\n",[87,1043,1045],{"class":89,"line":1044},65,[87,1046,1047],{},"    class CallTool,ExecuteTool,ToolResult,CallTool2,ExecuteTool2,ToolResult2 tool\n",[87,1049,1051],{"class":89,"line":1050},66,[87,1052,1053],{},"    class ToolDecision,Complete decision\n",[87,1055,1057],{"class":89,"line":1056},67,[87,1058,1059],{},"    class LoopNote insight\n",[458,1061,1063,1067],{"className":1062},[461,462,463],[68,1064,1066],{"id":1065},"défis-dimplémentation","Défis d'Implémentation",[73,1068,1069],{},[471,1070,1071],{"href":473},[450,1072,476],{},[458,1074,1076,1079,1085,1088,1108,1114,1120,1123,1143,1149,1155,1158,1184,1190,1216,1222,1225,1251],{"className":1075},[480],[73,1077,1078],{},"Le passage à l'on-premises n'est pas sans défis. Voici les considérations clés :",[547,1080,1082],{"id":1081},"exigences-matérielles",[450,1083,1084],{},"Exigences Matérielles",[73,1086,1087],{},"Contrairement aux fournisseurs cloud avec leurs clusters massifs de GPUs, vous êtes limité par le matériel local :",[491,1089,1090,1096,1102],{},[494,1091,1092,1095],{},[450,1093,1094],{},"Mémoire"," : Les modèles 70B nécessitent ~140GB VRAM pour une inférence confortable",[494,1097,1098,1101],{},[450,1099,1100],{},"Modèles Plus Petits"," : Les modèles 7B-13B peuvent fonctionner sur des GPUs grand public avec 16-24GB VRAM",[494,1103,1104,1107],{},[450,1105,1106],{},"Inférence CPU"," : Possible mais significativement plus lente, particulièrement pour l'utilisation complexe d'outils",[73,1109,1110,1113],{},[450,1111,1112],{},"Approche Pratique"," : Commencez avec des modèles quantifiés (format GGUF) qui peuvent fonctionner sur le matériel disponible. Un modèle 32B bien quantifié surpasse souvent un modèle 70B mal configuré.",[547,1115,1117],{"id":1116},"compromis-de-performance",[450,1118,1119],{},"Compromis de Performance",[73,1121,1122],{},"L'inférence locale introduit une latence que les fournisseurs cloud ont optimisée :",[491,1124,1125,1131,1137],{},[494,1126,1127,1130],{},[450,1128,1129],{},"Latence du Premier Token"," : Les modèles locaux nécessitent un temps d'initialisation",[494,1132,1133,1136],{},[450,1134,1135],{},"Débit"," : Les configurations mono-GPU ne peuvent pas égaler l'inférence distribuée dans le cloud",[494,1138,1139,1142],{},[450,1140,1141],{},"Concurrence"," : Plusieurs sessions d'agents se disputent les mêmes ressources locales",[73,1144,1145,1148],{},[450,1146,1147],{},"Stratégie d'Atténuation"," : Gardez les modèles chargés en mémoire entre les requêtes, utilisez la mise en cache des modèles et envisagez d'exécuter plusieurs petits modèles plutôt qu'un grand.",[547,1150,1152],{"id":1151},"critères-de-sélection-des-modèles",[450,1153,1154],{},"Critères de Sélection des Modèles",[73,1156,1157],{},"Tous les modèles ne sont pas égaux pour le déploiement on-premises :",[491,1159,1160,1166,1172,1178],{},[494,1161,1162,1165],{},[450,1163,1164],{},"Qualité des Appels de Fonction"," : Testez extensivement avec vos outils MCP spécifiques",[494,1167,1168,1171],{},[450,1169,1170],{},"Longueur de Contexte"," : Des contextes plus longs permettent des conversations d'agents plus sophistiquées",[494,1173,1174,1177],{},[450,1175,1176],{},"Tolérance à la Quantification"," : Certains modèles se dégradent significativement une fois quantifiés",[494,1179,1180,1183],{},[450,1181,1182],{},"Licences"," : Assurez-vous des droits d'utilisation commerciale pour les déploiements en entreprise",[73,1185,1186,1189],{},[450,1187,1188],{},"Modèles Recommandés pour l'On-Premises"," :",[491,1191,1192,1198,1204,1210],{},[494,1193,1194,1197],{},[450,1195,1196],{},"Qwen2.5-32B-Instruct"," : Excellent pour les appels de fonction, exigences matérielles raisonnables",[494,1199,1200,1203],{},[450,1201,1202],{},"Llama 3.1-70B-Instruct"," : Si vous avez le matériel, performances exceptionnelles",[494,1205,1206,1209],{},[450,1207,1208],{},"Mistral-Small-3.1-24B"," : Optimisé spécifiquement pour les appels de fonction",[494,1211,1212,1215],{},[450,1213,1214],{},"Gemma 3 27B"," : Bon équilibre entre capacité et efficacité",[547,1217,1219],{"id":1218},"complexité-dintégration",[450,1220,1221],{},"Complexité d'Intégration",[73,1223,1224],{},"Les fournisseurs cloud gèrent la compatibilité des APIs, mais les configurations locales nécessitent plus de configuration :",[491,1226,1227,1233,1239,1245],{},[494,1228,1229,1232],{},[450,1230,1231],{},"Passerelle API"," : Assurer des endpoints compatibles avec OpenAI",[494,1234,1235,1238],{},[450,1236,1237],{},"Équilibrage de Charge"," : Distribuer les requêtes entre plusieurs instances de modèles",[494,1240,1241,1244],{},[450,1242,1243],{},"Surveillance"," : Suivi des performances, utilisation des ressources et taux d'erreur",[494,1246,1247,1250],{},[450,1248,1249],{},"Mises à Jour"," : Gestion des mises à jour de modèles et contrôle de version",[458,1252,1254,1258],{"className":1253},[461,462,463],[68,1255,1257],{"id":1256},"cadre-de-décision-entreprise","Cadre de Décision Entreprise",[73,1259,1260],{},[471,1261,1262],{"href":473},[450,1263,476],{},[458,1265,1267,1270,1276,1279,1552,1558,1563,1574,1579,1590,1596,1602,1605,1631,1634,1654,1660,1663,1687,1700],{"className":1266},[480],[73,1268,1269],{},"La décision entre les agents MCP cloud et on-premises n'est pas purement technique—elle est stratégique. Comprendre les compromis est essentiel pour prendre des décisions architecturales éclairées.",[547,1271,1273],{"id":1272},"comparaison-cloud-vs-on-premises",[450,1274,1275],{},"Comparaison Cloud vs On-Premises",[73,1277,1278],{},"Voici une comparaison complète pour guider votre choix :",[77,1280,1282],{"className":79,"code":1281,"language":81,"meta":82,"style":82},"graph TD\n    subgraph Cloud [\"Agents MCP Cloud\"]\n        CloudAdvantages[\"Avantages\u003Cbr/>• Modèles puissants (70B+)\u003Cbr/>• Calcul illimité\u003Cbr/>• Pas d'investissement matériel\u003Cbr/>• Mise à l'échelle instantanée\u003Cbr/>• Infrastructure gérée\"]\n        \n        CloudRisks[\"Préoccupations de Sécurité\u003Cbr/>• Données hors site\u003Cbr/>• Dépendance fournisseur\u003Cbr/>• Coûts imprévisibles\u003Cbr/>• Défis de conformité\u003Cbr/>• Dépendances API\"]\n        \n        CloudCosts[\"Modèle de Coûts\u003Cbr/>• Paiement par token\u003Cbr/>• 2 000-10 000€/mois\u003Cbr/>• Mise à l'échelle variable\u003Cbr/>• Pas d'investissement initial\"]\n    end\n    \n    subgraph OnPrem [\"Agents MCP On-Premises\"]\n        OnPremAdvantages[\"Bénéfices Sécurité\u003Cbr/>• Souveraineté totale des données\u003Cbr/>• Contrôle total des audits\u003Cbr/>• Conforme aux réglementations\u003Cbr/>• Sans dépendance fournisseur\u003Cbr/>• Fonctionnement hors ligne\"]\n        \n        OnPremChallenges[\"Défis d'Implémentation\u003Cbr/>• Investissement matériel requis\u003Cbr/>• Limites de performance modèles\u003Cbr/>• Complexité opérationnelle\u003Cbr/>• Contraintes d'échelle\u003Cbr/>• Mises à jour manuelles\"]\n        \n        OnPremCosts[\"Structure de Coûts\u003Cbr/>• 10 000-50 000€ initial\u003Cbr/>• Rentabilité 6-18 mois\u003Cbr/>• Coûts opérationnels fixes\u003Cbr/>• Mise à l'échelle prévisible\"]\n    end\n    \n    subgraph Decision [\"Facteurs de Décision\"]\n        DataSensitivity[\"Sensibilité des Données\u003Cbr/>Haute sensibilité → On-Premises\u003Cbr/>Faible sensibilité → Cloud\"]\n        \n        Compliance[\"Exigences de Conformité\u003Cbr/>Réglementation stricte → On-Premises\u003Cbr/>Conformité standard → Cloud\"]\n        \n        TechnicalCapacity[\"Ressources Techniques\u003Cbr/>Équipe IA/ML forte → On-Premises\u003Cbr/>Ressources limitées → Cloud\"]\n        \n        CostModel[\"Préférences de Coûts\u003Cbr/>Coûts prévisibles → On-Premises\u003Cbr/>Coûts variables → Cloud\"]\n    end\n    \n    subgraph Hybrid [\"Architecture Hybride\"]\n        HybridBenefits[\"Combinaison Stratégique\u003Cbr/>• Router données sensibles en local\u003Cbr/>• Utiliser cloud pour tâches complexes\u003Cbr/>• Optimiser coûts dynamiquement\u003Cbr/>• Distribuer risque opérationnel\"]\n    end\n    \n    %% Flux de décision\n    DataSensitivity --> OnPremAdvantages\n    DataSensitivity --> CloudAdvantages\n    \n    Compliance --> OnPremAdvantages\n    Compliance --> CloudAdvantages\n    \n    TechnicalCapacity --> OnPremChallenges\n    TechnicalCapacity --> CloudRisks\n    \n    CostModel --> OnPremCosts\n    CostModel --> CloudCosts\n    \n    %% Connexions hybrides\n    OnPremAdvantages -.-> HybridBenefits\n    CloudAdvantages -.-> HybridBenefits\n    \n    %% Styles\n    classDef cloudStyle stroke:#1976d2,stroke-width:2px\n    classDef onpremStyle stroke:#388e3c,stroke-width:2px\n    classDef decisionStyle stroke:#f57c00,stroke-width:2px\n    classDef hybridStyle stroke:#7b1fa2,stroke-width:2px\n    \n    class Cloud,CloudAdvantages,CloudRisks,CloudCosts cloudStyle\n    class OnPrem,OnPremAdvantages,OnPremChallenges,OnPremCosts onpremStyle\n    class Decision,DataSensitivity,Compliance,TechnicalCapacity,CostModel decisionStyle\n    class Hybrid,HybridBenefits hybridStyle\n",[84,1283,1284,1289,1294,1299,1303,1308,1312,1317,1321,1325,1330,1335,1339,1344,1348,1353,1357,1361,1366,1371,1375,1380,1384,1389,1393,1398,1402,1406,1411,1416,1420,1424,1429,1434,1439,1443,1448,1453,1457,1462,1467,1471,1476,1481,1485,1490,1495,1500,1504,1508,1513,1518,1523,1528,1532,1537,1542,1547],{"__ignoreMap":82},[87,1285,1286],{"class":89,"line":90},[87,1287,1288],{},"graph TD\n",[87,1290,1291],{"class":89,"line":96},[87,1292,1293],{},"    subgraph Cloud [\"Agents MCP Cloud\"]\n",[87,1295,1296],{"class":89,"line":102},[87,1297,1298],{},"        CloudAdvantages[\"Avantages\u003Cbr/>• Modèles puissants (70B+)\u003Cbr/>• Calcul illimité\u003Cbr/>• Pas d'investissement matériel\u003Cbr/>• Mise à l'échelle instantanée\u003Cbr/>• Infrastructure gérée\"]\n",[87,1300,1301],{"class":89,"line":108},[87,1302,135],{},[87,1304,1305],{"class":89,"line":114},[87,1306,1307],{},"        CloudRisks[\"Préoccupations de Sécurité\u003Cbr/>• Données hors site\u003Cbr/>• Dépendance fournisseur\u003Cbr/>• Coûts imprévisibles\u003Cbr/>• Défis de conformité\u003Cbr/>• Dépendances API\"]\n",[87,1309,1310],{"class":89,"line":120},[87,1311,135],{},[87,1313,1314],{"class":89,"line":126},[87,1315,1316],{},"        CloudCosts[\"Modèle de Coûts\u003Cbr/>• Paiement par token\u003Cbr/>• 2 000-10 000€/mois\u003Cbr/>• Mise à l'échelle variable\u003Cbr/>• Pas d'investissement initial\"]\n",[87,1318,1319],{"class":89,"line":132},[87,1320,204],{},[87,1322,1323],{"class":89,"line":138},[87,1324,210],{},[87,1326,1327],{"class":89,"line":144},[87,1328,1329],{},"    subgraph OnPrem [\"Agents MCP On-Premises\"]\n",[87,1331,1332],{"class":89,"line":150},[87,1333,1334],{},"        OnPremAdvantages[\"Bénéfices Sécurité\u003Cbr/>• Souveraineté totale des données\u003Cbr/>• Contrôle total des audits\u003Cbr/>• Conforme aux réglementations\u003Cbr/>• Sans dépendance fournisseur\u003Cbr/>• Fonctionnement hors ligne\"]\n",[87,1336,1337],{"class":89,"line":156},[87,1338,135],{},[87,1340,1341],{"class":89,"line":162},[87,1342,1343],{},"        OnPremChallenges[\"Défis d'Implémentation\u003Cbr/>• Investissement matériel requis\u003Cbr/>• Limites de performance modèles\u003Cbr/>• Complexité opérationnelle\u003Cbr/>• Contraintes d'échelle\u003Cbr/>• Mises à jour manuelles\"]\n",[87,1345,1346],{"class":89,"line":168},[87,1347,135],{},[87,1349,1350],{"class":89,"line":173},[87,1351,1352],{},"        OnPremCosts[\"Structure de Coûts\u003Cbr/>• 10 000-50 000€ initial\u003Cbr/>• Rentabilité 6-18 mois\u003Cbr/>• Coûts opérationnels fixes\u003Cbr/>• Mise à l'échelle prévisible\"]\n",[87,1354,1355],{"class":89,"line":178},[87,1356,204],{},[87,1358,1359],{"class":89,"line":184},[87,1360,210],{},[87,1362,1363],{"class":89,"line":190},[87,1364,1365],{},"    subgraph Decision [\"Facteurs de Décision\"]\n",[87,1367,1368],{"class":89,"line":196},[87,1369,1370],{},"        DataSensitivity[\"Sensibilité des Données\u003Cbr/>Haute sensibilité → On-Premises\u003Cbr/>Faible sensibilité → Cloud\"]\n",[87,1372,1373],{"class":89,"line":201},[87,1374,135],{},[87,1376,1377],{"class":89,"line":207},[87,1378,1379],{},"        Compliance[\"Exigences de Conformité\u003Cbr/>Réglementation stricte → On-Premises\u003Cbr/>Conformité standard → Cloud\"]\n",[87,1381,1382],{"class":89,"line":213},[87,1383,135],{},[87,1385,1386],{"class":89,"line":219},[87,1387,1388],{},"        TechnicalCapacity[\"Ressources Techniques\u003Cbr/>Équipe IA/ML forte → On-Premises\u003Cbr/>Ressources limitées → Cloud\"]\n",[87,1390,1391],{"class":89,"line":225},[87,1392,135],{},[87,1394,1395],{"class":89,"line":231},[87,1396,1397],{},"        CostModel[\"Préférences de Coûts\u003Cbr/>Coûts prévisibles → On-Premises\u003Cbr/>Coûts variables → Cloud\"]\n",[87,1399,1400],{"class":89,"line":237},[87,1401,204],{},[87,1403,1404],{"class":89,"line":242},[87,1405,210],{},[87,1407,1408],{"class":89,"line":247},[87,1409,1410],{},"    subgraph Hybrid [\"Architecture Hybride\"]\n",[87,1412,1413],{"class":89,"line":253},[87,1414,1415],{},"        HybridBenefits[\"Combinaison Stratégique\u003Cbr/>• Router données sensibles en local\u003Cbr/>• Utiliser cloud pour tâches complexes\u003Cbr/>• Optimiser coûts dynamiquement\u003Cbr/>• Distribuer risque opérationnel\"]\n",[87,1417,1418],{"class":89,"line":259},[87,1419,204],{},[87,1421,1422],{"class":89,"line":265},[87,1423,210],{},[87,1425,1426],{"class":89,"line":271},[87,1427,1428],{},"    %% Flux de décision\n",[87,1430,1431],{"class":89,"line":276},[87,1432,1433],{},"    DataSensitivity --> OnPremAdvantages\n",[87,1435,1436],{"class":89,"line":281},[87,1437,1438],{},"    DataSensitivity --> CloudAdvantages\n",[87,1440,1441],{"class":89,"line":287},[87,1442,210],{},[87,1444,1445],{"class":89,"line":293},[87,1446,1447],{},"    Compliance --> OnPremAdvantages\n",[87,1449,1450],{"class":89,"line":299},[87,1451,1452],{},"    Compliance --> CloudAdvantages\n",[87,1454,1455],{"class":89,"line":305},[87,1456,210],{},[87,1458,1459],{"class":89,"line":310},[87,1460,1461],{},"    TechnicalCapacity --> OnPremChallenges\n",[87,1463,1464],{"class":89,"line":316},[87,1465,1466],{},"    TechnicalCapacity --> CloudRisks\n",[87,1468,1469],{"class":89,"line":322},[87,1470,210],{},[87,1472,1473],{"class":89,"line":328},[87,1474,1475],{},"    CostModel --> OnPremCosts\n",[87,1477,1478],{"class":89,"line":334},[87,1479,1480],{},"    CostModel --> CloudCosts\n",[87,1482,1483],{"class":89,"line":339},[87,1484,210],{},[87,1486,1487],{"class":89,"line":345},[87,1488,1489],{},"    %% Connexions hybrides\n",[87,1491,1492],{"class":89,"line":351},[87,1493,1494],{},"    OnPremAdvantages -.-> HybridBenefits\n",[87,1496,1497],{"class":89,"line":356},[87,1498,1499],{},"    CloudAdvantages -.-> HybridBenefits\n",[87,1501,1502],{"class":89,"line":362},[87,1503,210],{},[87,1505,1506],{"class":89,"line":368},[87,1507,1010],{},[87,1509,1510],{"class":89,"line":374},[87,1511,1512],{},"    classDef cloudStyle stroke:#1976d2,stroke-width:2px\n",[87,1514,1515],{"class":89,"line":380},[87,1516,1517],{},"    classDef onpremStyle stroke:#388e3c,stroke-width:2px\n",[87,1519,1520],{"class":89,"line":385},[87,1521,1522],{},"    classDef decisionStyle stroke:#f57c00,stroke-width:2px\n",[87,1524,1525],{"class":89,"line":391},[87,1526,1527],{},"    classDef hybridStyle stroke:#7b1fa2,stroke-width:2px\n",[87,1529,1530],{"class":89,"line":396},[87,1531,210],{},[87,1533,1534],{"class":89,"line":402},[87,1535,1536],{},"    class Cloud,CloudAdvantages,CloudRisks,CloudCosts cloudStyle\n",[87,1538,1539],{"class":89,"line":408},[87,1540,1541],{},"    class OnPrem,OnPremAdvantages,OnPremChallenges,OnPremCosts onpremStyle\n",[87,1543,1544],{"class":89,"line":414},[87,1545,1546],{},"    class Decision,DataSensitivity,Compliance,TechnicalCapacity,CostModel decisionStyle\n",[87,1548,1549],{"class":89,"line":420},[87,1550,1551],{},"    class Hybrid,HybridBenefits hybridStyle\n",[547,1553,1555],{"id":1554},"analyse-des-coûts",[450,1556,1557],{},"Analyse des Coûts",[73,1559,1560,1189],{},[450,1561,1562],{},"Coûts Cloud (Estimés)",[491,1564,1565,1568,1571],{},[494,1566,1567],{},"Interactions complexes d'agents : 50-200 tokens par appel d'outil",[494,1569,1570],{},"Usage entreprise : 10,000+ interactions d'agents quotidiennes",[494,1572,1573],{},"Coûts mensuels : $2,000-$10,000+ selon le modèle et l'usage",[73,1575,1576,1189],{},[450,1577,1578],{},"Coûts On-Premises",[491,1580,1581,1584,1587],{},[494,1582,1583],{},"Matériel : $10,000-$50,000 d'investissement initial",[494,1585,1586],{},"Maintenance : Frais opérationnels continus",[494,1588,1589],{},"Point d'équilibre : Généralement 6-18 mois selon l'usage",[73,1591,1592,1595],{},[450,1593,1594],{},"Approche Hybride"," : Utilisez l'on-premises pour les données sensibles, le cloud pour les pics de charge ou les tâches spécialisées.",[547,1597,1599],{"id":1598},"sécurité-et-conformité",[450,1600,1601],{},"Sécurité et Conformité",[73,1603,1604],{},"L'on-premises offre des avantages significatifs :",[491,1606,1607,1613,1619,1625],{},[494,1608,1609,1612],{},[450,1610,1611],{},"Souveraineté des Données"," : Tout le traitement se fait dans votre infrastructure",[494,1614,1615,1618],{},[450,1616,1617],{},"Pistes d'Audit"," : Visibilité complète sur les actions des agents et les flux de données",[494,1620,1621,1624],{},[450,1622,1623],{},"Conformité"," : Plus facile de respecter GDPR, HIPAA, SOC2",[494,1626,1627,1630],{},[450,1628,1629],{},"Sécurité Personnalisée"," : Intégration avec l'infrastructure de sécurité existante",[73,1632,1633],{},"Mais introduit aussi des responsabilités :",[491,1635,1636,1642,1648],{},[494,1637,1638,1641],{},[450,1639,1640],{},"Sécurité des Modèles"," : S'assurer que les modèles ne sont pas compromis ou biaisés",[494,1643,1644,1647],{},[450,1645,1646],{},"Sécurité de l'Infrastructure"," : Protéger l'infrastructure IA elle-même",[494,1649,1650,1653],{},[450,1651,1652],{},"Contrôle d'Accès"," : Gérer qui peut déployer et modifier les agents",[547,1655,1657],{"id":1656},"maturité-opérationnelle",[450,1658,1659],{},"Maturité Opérationnelle",[73,1661,1662],{},"L'exécution d'IA on-premises nécessite des capacités organisationnelles :",[491,1664,1665,1671,1676,1682],{},[494,1666,1667,1670],{},[450,1668,1669],{},"DevOps pour l'IA"," : Pipelines CI/CD pour le déploiement des modèles",[494,1672,1673,1675],{},[450,1674,1243],{}," : Compréhension des métriques spécifiques à l'IA et des modes de défaillance",[494,1677,1678,1681],{},[450,1679,1680],{},"Mise à l'Échelle"," : Gestion des ressources à mesure que l'utilisation des agents croît",[494,1683,1684,1686],{},[450,1685,1249],{}," : Maintenir les modèles et l'infrastructure à jour",[458,1688,1690,1694],{"className":1689},[461,462,463],[68,1691,1693],{"id":1692},"stratégie-darchitecture-hybride","Stratégie d'Architecture Hybride",[73,1695,1696],{},[471,1697,1698],{"href":473},[450,1699,476],{},[458,1701,1703,1706,1712,1845,1851,1883],{"className":1702},[480],[73,1704,1705],{},"L'approche la plus pragmatique combine souvent les déploiements cloud et on-premises. Une architecture hybride permet aux organisations d'optimiser à la fois pour la sécurité et la capacité tout en maintenant la flexibilité opérationnelle.",[547,1707,1709],{"id":1708},"implémentation-du-routage-intelligent",[450,1710,1711],{},"Implémentation du Routage Intelligent",[77,1713,1715],{"className":611,"code":1714,"language":613,"meta":82,"style":82},"const agent = new Agent({\n  // Local pour les opérations sensibles\n  localProvider: \"http://localhost:1234/v1\",\n  localModel: \"qwen2.5-32b-instruct\",\n  \n  // Cloud pour les tâches complexes\n  cloudProvider: \"nebius\",\n  cloudModel: \"Qwen/Qwen2.5-72B-Instruct\",\n  \n  // Routage basé sur la sensibilité des tâches\n  routingStrategy: \"data-classification\"\n});\n",[84,1716,1717,1735,1740,1756,1772,1777,1782,1798,1814,1818,1823,1837],{"__ignoreMap":82},[87,1718,1719,1721,1724,1726,1728,1731,1733],{"class":89,"line":90},[87,1720,621],{"class":620},[87,1722,1723],{"class":624}," agent ",[87,1725,629],{"class":628},[87,1727,632],{"class":628},[87,1729,1730],{"class":635}," Agent",[87,1732,665],{"class":624},[87,1734,668],{"class":628},[87,1736,1737],{"class":89,"line":96},[87,1738,1739],{"class":693},"  // Local pour les opérations sensibles\n",[87,1741,1742,1745,1747,1749,1751,1753],{"class":89,"line":102},[87,1743,1744],{"class":673},"  localProvider",[87,1746,677],{"class":628},[87,1748,680],{"class":628},[87,1750,684],{"class":683},[87,1752,687],{"class":628},[87,1754,1755],{"class":628},",\n",[87,1757,1758,1761,1763,1765,1768,1770],{"class":89,"line":108},[87,1759,1760],{"class":673},"  localModel",[87,1762,677],{"class":628},[87,1764,680],{"class":628},[87,1766,1767],{"class":683},"qwen2.5-32b-instruct",[87,1769,687],{"class":628},[87,1771,1755],{"class":628},[87,1773,1774],{"class":89,"line":114},[87,1775,1776],{"class":624},"  \n",[87,1778,1779],{"class":89,"line":120},[87,1780,1781],{"class":693},"  // Cloud pour les tâches complexes\n",[87,1783,1784,1787,1789,1791,1794,1796],{"class":89,"line":126},[87,1785,1786],{"class":673},"  cloudProvider",[87,1788,677],{"class":628},[87,1790,680],{"class":628},[87,1792,1793],{"class":683},"nebius",[87,1795,687],{"class":628},[87,1797,1755],{"class":628},[87,1799,1800,1803,1805,1807,1810,1812],{"class":89,"line":132},[87,1801,1802],{"class":673},"  cloudModel",[87,1804,677],{"class":628},[87,1806,680],{"class":628},[87,1808,1809],{"class":683},"Qwen/Qwen2.5-72B-Instruct",[87,1811,687],{"class":628},[87,1813,1755],{"class":628},[87,1815,1816],{"class":89,"line":138},[87,1817,1776],{"class":624},[87,1819,1820],{"class":89,"line":144},[87,1821,1822],{"class":693},"  // Routage basé sur la sensibilité des tâches\n",[87,1824,1825,1828,1830,1832,1835],{"class":89,"line":150},[87,1826,1827],{"class":673},"  routingStrategy",[87,1829,677],{"class":628},[87,1831,680],{"class":628},[87,1833,1834],{"class":683},"data-classification",[87,1836,709],{"class":628},[87,1838,1839,1841,1843],{"class":89,"line":156},[87,1840,714],{"class":628},[87,1842,717],{"class":624},[87,1844,642],{"class":628},[547,1846,1848],{"id":1847},"avantages-hybrides",[450,1849,1850],{},"Avantages Hybrides",[491,1852,1853,1859,1865,1871,1877],{},[494,1854,1855,1858],{},[450,1856,1857],{},"Classification des Données"," : Route automatiquement les données sensibles vers le traitement local",[494,1860,1861,1864],{},[450,1862,1863],{},"Optimisation des Performances"," : Utilise les ressources cloud pour les tâches intensives en calcul",[494,1866,1867,1870],{},[450,1868,1869],{},"Gestion des Coûts"," : Équilibre les coûts fixes on-premises avec l'usage variable du cloud",[494,1872,1873,1876],{},[450,1874,1875],{},"Distribution des Risques"," : Évite les points uniques de défaillance dans chaque modèle de déploiement",[494,1878,1879,1882],{},[450,1880,1881],{},"Migration Progressive"," : Commence en local et étend l'usage cloud à mesure que la confiance augmente",[458,1884,1886,1890],{"className":1885},[461,462,463],[68,1887,1889],{"id":1888},"conclusion-et-prochaines-étapes","Conclusion et Prochaines Étapes",[73,1891,1892],{},[471,1893,1894],{"href":473},[450,1895,476],{},[458,1897,1899,1902,1908,1941,1947,1952,1966,1971,1985,1991,2028],{"className":1898},[480],[73,1900,1901],{},"L'exploration des Agents MCP Tiny On-Premises révèle une vérité convaincante : l'élégance du concept d'\"agent en 50 lignes\" de Hugging Face n'est pas diminuée par le déploiement local—elle est améliorée par les avantages de contrôle et de sécurité que fournit l'infrastructure on-premises.",[547,1903,1905],{"id":1904},"points-clés",[450,1906,1907],{},"Points Clés",[1909,1910,1911,1917,1923,1929,1935],"ol",{},[494,1912,1913,1916],{},[450,1914,1915],{},"Faisabilité Technique"," : L'architecture de l'agent reste identique—seul l'endpoint d'inférence change",[494,1918,1919,1922],{},[450,1920,1921],{},"Puissance du Protocole MCP"," : Vos investissements en outils sont entièrement portables entre cloud et on-premises",[494,1924,1925,1928],{},[450,1926,1927],{},"Avantages Stratégiques"," : Les déploiements on-premises offrent souveraineté des données, avantages de conformité et prévisibilité des coûts",[494,1930,1931,1934],{},[450,1932,1933],{},"Réalité d'Implémentation"," : Les contraintes matérielles nécessitent une sélection soigneuse des modèles, mais des solutions capables existent",[494,1936,1937,1940],{},[450,1938,1939],{},"Optimisation Hybride"," : L'approche la plus pratique combine les deux modèles de déploiement selon la sensibilité des données",[547,1942,1944],{"id":1943},"cadre-de-décision",[450,1945,1946],{},"Cadre de Décision",[73,1948,1949,1189],{},[450,1950,1951],{},"Choisissez l'On-Premises Quand",[491,1953,1954,1957,1960,1963],{},[494,1955,1956],{},"La sensibilité des données est élevée (finance, santé, juridique)",[494,1958,1959],{},"Les exigences de conformité sont strictes (GDPR, HIPAA, SOC2)",[494,1961,1962],{},"Les coûts prévisibles sont préférés aux prix variables",[494,1964,1965],{},"Une équipe technique solide est disponible pour l'implémentation",[73,1967,1968,1189],{},[450,1969,1970],{},"Choisissez le Cloud Quand",[491,1972,1973,1976,1979,1982],{},[494,1974,1975],{},"La mise à l'échelle rapide est essentielle",[494,1977,1978],{},"Les dernières capacités des modèles sont requises",[494,1980,1981],{},"Les ressources techniques sont limitées",[494,1983,1984],{},"Les charges de travail variables rendent l'économie cloud favorable",[547,1986,1988],{"id":1987},"chemin-dimplémentation-recommandé",[450,1989,1990],{},"Chemin d'Implémentation Recommandé",[1909,1992,1993,1999,2005,2011,2016,2022],{},[494,1994,1995,1998],{},[450,1996,1997],{},"Phase d'Évaluation"," : Évaluez votre sensibilité aux données, besoins de conformité et capacités techniques",[494,2000,2001,2004],{},[450,2002,2003],{},"Déploiement Pilote"," : Commencez avec une petite configuration on-premises utilisant des modèles quantifiés (Qwen2.5-32B)",[494,2006,2007,2010],{},[450,2008,2009],{},"Évaluation des Performances"," : Comparez les performances locales vs. cloud pour vos cas d'usage spécifiques",[494,2012,2013,2015],{},[450,2014,1557],{}," : Calculez les points d'équilibre et le coût total de possession",[494,2017,2018,2021],{},[450,2019,2020],{},"Architecture Hybride"," : Concevez un routage intelligent basé sur la classification des données et la complexité des tâches",[494,2023,2024,2027],{},[450,2025,2026],{},"Mise à l'Échelle Progressive"," : Étendez les modèles réussis tout en maintenant les limites de sécurité",[73,2029,2030],{},"L'avenir de l'IA d'entreprise ne consiste pas à choisir entre la commodité du cloud et le contrôle on-premises—il s'agit d'architecturer des systèmes qui combinent intelligemment les deux approches. Les Agents MCP Tiny rendent cette vision pratique, fournissant la simplicité et la portabilité nécessaires pour des déploiements d'IA durables sur toute infrastructure.",[458,2032,2038,2044],{"className":2033},[2034,2035,2036,2037],"text-md","text-end","mt-10","font-bold",[73,2039,2040],{},[471,2041,2042],{"href":473},[450,2043,476],{},[458,2045,2047],{"className":2046},[2035],[73,2048,2049],{},[471,2050,2052],{"href":2051},"/contact",[450,2053,2054],{},"Prêt à explorer les agents IA on-premises ?",[2056,2057,2058],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":82,"searchDepth":96,"depth":96,"links":2060},[2061,2062,2063],{"id":70,"depth":96,"text":71},{"id":466,"depth":96,"text":467},{"id":532,"depth":96,"text":533,"children":2064},[2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075],{"id":549,"depth":102,"text":552},{"id":593,"depth":102,"text":596},{"id":602,"depth":102,"text":605},{"id":725,"depth":102,"text":728},{"id":1272,"depth":102,"text":1275},{"id":1554,"depth":102,"text":1557},{"id":1598,"depth":102,"text":1601},{"id":1656,"depth":102,"text":1659},{"id":1904,"depth":102,"text":1907},{"id":1943,"depth":102,"text":1946},{"id":1987,"depth":102,"text":1990},"2025-06-28","Explorer comment exécuter des agents basés sur MCP entièrement on-premises en utilisant des LLMs locaux, en examinant les compromis entre la commodité du cloud et le contrôle local pour les déploiements d'IA en entreprise.","md",{"src":2080},"/blog/mcp/mcp-cover.png",{},true,{"title":27,"description":2077},"epMsG1Ni4vE1sze094ppzqcTx_LgZOojqXuq61W9IDg",[2086,3277],{"id":2087,"title":31,"authors":2088,"badge":2092,"body":2095,"date":3271,"description":3272,"extension":2078,"image":3273,"meta":3274,"navigation":2082,"path":32,"seo":3275,"stem":33,"__hash__":3276},"posts_fr/fr/blog/6. overvibing.md",[2089],{"name":55,"description":2090,"to":57,"avatar":2091},"Freelance, MCP Servers, Développement Full-Stack, Architecture",{"src":59},{"label":2093,"color":2094,"variant":63},"Développement Agentique, Overvibing","success",{"type":65,"value":2096,"toc":3256},[2097,2114,2120,2126,2310,2325,2328,2354,2369,2379,2394,2545,2560,2596,2601,2624,2639,2645,2716,2722,2764,2777,2781,2790,2796,3031,3048,3063,3095,3110,3161,3176,3212,3227,3243,3253],[458,2098,2100],{"className":2099},[480],[73,2101,2102,2105,2106,2109,2110,2113],{},[450,2103,2104],{},"Bankly",", un système bancaire backend construit en seulement deux jours en utilisant ",[450,2107,2108],{},"Apollo GraphQL"," et ",[450,2111,2112],{},"Prisma",". Conçu comme un test technique personnel et une preuve de concept qui démontre comment les flux de travail agentiques et le développement assisté par l'IA peuvent accélérer la livraison de logiciels modernes tout en maintenant la qualité et la structure.",[68,2115,2117],{"id":2116},"chronologie-du-développement",[450,2118,2119],{},"Chronologie du Développement",[458,2121,2123],{"className":2122},[480],[73,2124,2125],{},"Voici la progression complète commit par commit montrant comment l'AWP a permis un développement systématique sans perdre d'élan :",[77,2127,2129],{"className":79,"code":2128,"language":81,"meta":82,"style":82},"---\ntitle: Chronologie du Développement de Bankly - 24-25 Juin 2025 @michaelwybraniec\n---\ngitGraph\n    commit id: \"Diagrammes ER\" tag: \"3.1.2\" type: HIGHLIGHT\n    commit id: \"Modèles Prisma\" tag: \"3.1.1\"\n    commit id: \"Politique AWP → Protocole\" tag: \"9.1\" type: REVERSE\n    commit id: \"BD Sécurisée Transaction\" tag: \"3.3\"\n    commit id: \"Dépendances\" tag: \"1.3\"\n    commit id: \"API GraphQL\" tag: \"4.4\" type: HIGHLIGHT\n    commit id: \"ESLint + Outillage\" tag: \"1.4\"\n    commit id: \"User Stories\" tag: \"5.1\"\n    commit id: \"Producteur Kafka\" tag: \"5.1\" type: HIGHLIGHT\n    commit id: \"Émission d'Événements\" tag: \"5.2\"\n    commit id: \"Étapes Kafka Terminées\" tag: \"5.0\"\n    commit id: \"Procédures AWP\" tag: \"9.2\"\n    branch pre-prod\n    checkout pre-prod\n    commit id: \"Tests Unitaires\" tag: \"8.1\"\n    commit id: \"Docker Compose\" tag: \"10.1\"\n    commit id: \"Release Sémantique\" tag: \"7.4\" type: HIGHLIGHT\n    commit id: \"Winston + Prometheus\" tag: \"10.3\" type: HIGHLIGHT\n    commit id: \"Contrôles Santé\" tag: \"10.3\"\n    commit id: \"Événements d'Audit\" tag: \"6.1\"\n    commit id: \"Actions GitHub\" tag: \"7.4\"\n    commit id: \"Docs Observabilité\" tag: \"10.5\"\n    commit id: \"Structure Projet\" tag: \"11\"\n    checkout main\n    merge pre-prod tag: \"v0.9.0\" type: HIGHLIGHT\n\n%%{init: {\n        \"gitGraph\": {\n            \"titleTopMargin\": 80,\n            \"diagramPadding\": 20\n        }\n    }}%%\n",[84,2130,2131,2136,2141,2145,2150,2155,2160,2165,2170,2175,2180,2185,2190,2195,2200,2205,2210,2215,2220,2225,2230,2235,2240,2245,2250,2255,2260,2265,2270,2275,2280,2285,2290,2295,2300,2305],{"__ignoreMap":82},[87,2132,2133],{"class":89,"line":90},[87,2134,2135],{},"---\n",[87,2137,2138],{"class":89,"line":96},[87,2139,2140],{},"title: Chronologie du Développement de Bankly - 24-25 Juin 2025 @michaelwybraniec\n",[87,2142,2143],{"class":89,"line":102},[87,2144,2135],{},[87,2146,2147],{"class":89,"line":108},[87,2148,2149],{},"gitGraph\n",[87,2151,2152],{"class":89,"line":114},[87,2153,2154],{},"    commit id: \"Diagrammes ER\" tag: \"3.1.2\" type: HIGHLIGHT\n",[87,2156,2157],{"class":89,"line":120},[87,2158,2159],{},"    commit id: \"Modèles Prisma\" tag: \"3.1.1\"\n",[87,2161,2162],{"class":89,"line":126},[87,2163,2164],{},"    commit id: \"Politique AWP → Protocole\" tag: \"9.1\" type: REVERSE\n",[87,2166,2167],{"class":89,"line":132},[87,2168,2169],{},"    commit id: \"BD Sécurisée Transaction\" tag: \"3.3\"\n",[87,2171,2172],{"class":89,"line":138},[87,2173,2174],{},"    commit id: \"Dépendances\" tag: \"1.3\"\n",[87,2176,2177],{"class":89,"line":144},[87,2178,2179],{},"    commit id: \"API GraphQL\" tag: \"4.4\" type: HIGHLIGHT\n",[87,2181,2182],{"class":89,"line":150},[87,2183,2184],{},"    commit id: \"ESLint + Outillage\" tag: \"1.4\"\n",[87,2186,2187],{"class":89,"line":156},[87,2188,2189],{},"    commit id: \"User Stories\" tag: \"5.1\"\n",[87,2191,2192],{"class":89,"line":162},[87,2193,2194],{},"    commit id: \"Producteur Kafka\" tag: \"5.1\" type: HIGHLIGHT\n",[87,2196,2197],{"class":89,"line":168},[87,2198,2199],{},"    commit id: \"Émission d'Événements\" tag: \"5.2\"\n",[87,2201,2202],{"class":89,"line":173},[87,2203,2204],{},"    commit id: \"Étapes Kafka Terminées\" tag: \"5.0\"\n",[87,2206,2207],{"class":89,"line":178},[87,2208,2209],{},"    commit id: \"Procédures AWP\" tag: \"9.2\"\n",[87,2211,2212],{"class":89,"line":184},[87,2213,2214],{},"    branch pre-prod\n",[87,2216,2217],{"class":89,"line":190},[87,2218,2219],{},"    checkout pre-prod\n",[87,2221,2222],{"class":89,"line":196},[87,2223,2224],{},"    commit id: \"Tests Unitaires\" tag: \"8.1\"\n",[87,2226,2227],{"class":89,"line":201},[87,2228,2229],{},"    commit id: \"Docker Compose\" tag: \"10.1\"\n",[87,2231,2232],{"class":89,"line":207},[87,2233,2234],{},"    commit id: \"Release Sémantique\" tag: \"7.4\" type: HIGHLIGHT\n",[87,2236,2237],{"class":89,"line":213},[87,2238,2239],{},"    commit id: \"Winston + Prometheus\" tag: \"10.3\" type: HIGHLIGHT\n",[87,2241,2242],{"class":89,"line":219},[87,2243,2244],{},"    commit id: \"Contrôles Santé\" tag: \"10.3\"\n",[87,2246,2247],{"class":89,"line":225},[87,2248,2249],{},"    commit id: \"Événements d'Audit\" tag: \"6.1\"\n",[87,2251,2252],{"class":89,"line":231},[87,2253,2254],{},"    commit id: \"Actions GitHub\" tag: \"7.4\"\n",[87,2256,2257],{"class":89,"line":237},[87,2258,2259],{},"    commit id: \"Docs Observabilité\" tag: \"10.5\"\n",[87,2261,2262],{"class":89,"line":242},[87,2263,2264],{},"    commit id: \"Structure Projet\" tag: \"11\"\n",[87,2266,2267],{"class":89,"line":247},[87,2268,2269],{},"    checkout main\n",[87,2271,2272],{"class":89,"line":253},[87,2273,2274],{},"    merge pre-prod tag: \"v0.9.0\" type: HIGHLIGHT\n",[87,2276,2277],{"class":89,"line":259},[87,2278,2279],{"emptyLinePlaceholder":2082},"\n",[87,2281,2282],{"class":89,"line":265},[87,2283,2284],{},"%%{init: {\n",[87,2286,2287],{"class":89,"line":271},[87,2288,2289],{},"        \"gitGraph\": {\n",[87,2291,2292],{"class":89,"line":276},[87,2293,2294],{},"            \"titleTopMargin\": 80,\n",[87,2296,2297],{"class":89,"line":281},[87,2298,2299],{},"            \"diagramPadding\": 20\n",[87,2301,2302],{"class":89,"line":287},[87,2303,2304],{},"        }\n",[87,2306,2307],{"class":89,"line":293},[87,2308,2309],{},"    }}%%\n",[458,2311,2313,2319],{"className":2312},[461,462,463],[68,2314,2316],{"id":2315},"vibe-coding",[450,2317,2318],{},"Vibe-Coding",[73,2320,2321],{},[471,2322,2323],{"href":473},[450,2324,476],{},[73,2326,2327],{},"Comment a-t-il été construit ? En utilisant le Vibe-Coding avec la Stratégie de Flux de Travail Agentique.",[458,2329,2331,2337,2351],{"className":2330},[480],[73,2332,2333,2336],{},[450,2334,2335],{},"Le Vibecoding avec Flux de Travail Agentique"," signifie :",[491,2338,2339,2342,2345,2348],{},[494,2340,2341],{},"Travailler dans un état de flux de haute créativité et de rapidité",[494,2343,2344],{},"Laisser les co-pilotes IA gérer les tâches dans un cadre structuré",[494,2346,2347],{},"Éviter l'épuisement cognitif ou le \"over-vibing\" grâce à des limites systématiques",[494,2349,2350],{},"Maintenir la clarté et le contexte tout au long du processus de développement",[73,2352,2353],{},"Le marché du travail évolue, et les ingénieurs doivent s'adapter. L'IA n'est plus optionnelle—c'est un multiplicateur. Mais l'ingénierie à grande échelle avec l'IA nécessite maturité, structure et conscience des risques.",[458,2355,2357,2363],{"className":2356},[461,462,463],[68,2358,2360],{"id":2359},"over-vibing",[450,2361,2362],{},"Over-Vibing",[73,2364,2365],{},[471,2366,2367],{"href":473},[450,2368,476],{},[458,2370,2372],{"className":2371},[480],[73,2373,2374,2375,2378],{},"J'appelle ce risque ",[450,2376,2377],{},"\"over-vibing\"","—un état où l'on pousse trop loin, trop vite, et perd le contexte. Les outils d'IA (en particulier les LLM) souffrent de la dérive du contexte. Les humains aussi. Lorsque vous êtes dans le flux mais perdez de vue l'image globale, la productivité peut rapidement se transformer en dette technique. Pour gérer ce risque, j'ai créé un \"AWP\" qui maintient la structure tout en préservant l'élan créatif.",[458,2380,2382,2388],{"className":2381},[461,462,463],[68,2383,2385],{"id":2384},"awp-protocole-de-flux-de-travail-agentique",[450,2386,2387],{},"AWP : Protocole de Flux de Travail Agentique",[73,2389,2390],{},[471,2391,2392],{"href":473},[450,2393,476],{},[458,2395,2397,2416],{"className":2396},[480],[73,2398,2399,2400,2403,2404,2407,2408,2411,2412,2415],{},"Le secret derrière le développement rapide de Bankly réside dans une méthodologie que j'appelle ",[450,2401,2402],{},"\"Vibecoding avec Flux de Travail Agentique\"",". Cette approche combine des états de flux de haute créativité avec une collaboration IA structurée, évitant les pièges de l'automatisation incontrôlée ou du \"over-vibing\". ",[450,2405,2406],{},"La preuve est dans les commits"," : Bankly a été construit les ",[450,2409,2410],{},"24-25 juin 2025"," en deux jours avec ",[450,2413,2414],{},"plus de 35 commits structurés"," suivant le Protocole de Flux de Travail Agentique (AWP). Chaque commit représente une étape délibérée dans le processus de développement, de la configuration initiale aux fonctionnalités de pré-production.",[77,2417,2419],{"className":79,"code":2418,"language":81,"meta":82,"style":82},"---\ntitle: AWP - Protocole de Flux de Travail Agentique\n---\ngraph TD\n    subgraph Planification\n        A[Définir les Tâches] --> B[Itérer les Tâches]\n    end\n    \n    subgraph Développement\n        C[Revoir la Portée] --> D[Développement]\n        D --> E[Vérifier le Contexte]\n        E --> F[Exécuter les Tests]\n    end\n    \n    subgraph Documentation\n        G[Documentation] --> H[Vérification Finale]\n    end\n    \n    subgraph Contrôle de Version\n        I[Revue Git] --> J[Tâche Suivante]\n    end\n    \n    B --> C\n    F --> G\n    H --> I\n    J --> B\n    E --> C\n",[84,2420,2421,2425,2430,2434,2438,2443,2448,2452,2456,2461,2466,2471,2476,2480,2484,2489,2494,2498,2502,2507,2512,2516,2520,2525,2530,2535,2540],{"__ignoreMap":82},[87,2422,2423],{"class":89,"line":90},[87,2424,2135],{},[87,2426,2427],{"class":89,"line":96},[87,2428,2429],{},"title: AWP - Protocole de Flux de Travail Agentique\n",[87,2431,2432],{"class":89,"line":102},[87,2433,2135],{},[87,2435,2436],{"class":89,"line":108},[87,2437,1288],{},[87,2439,2440],{"class":89,"line":114},[87,2441,2442],{},"    subgraph Planification\n",[87,2444,2445],{"class":89,"line":120},[87,2446,2447],{},"        A[Définir les Tâches] --> B[Itérer les Tâches]\n",[87,2449,2450],{"class":89,"line":126},[87,2451,204],{},[87,2453,2454],{"class":89,"line":132},[87,2455,210],{},[87,2457,2458],{"class":89,"line":138},[87,2459,2460],{},"    subgraph Développement\n",[87,2462,2463],{"class":89,"line":144},[87,2464,2465],{},"        C[Revoir la Portée] --> D[Développement]\n",[87,2467,2468],{"class":89,"line":150},[87,2469,2470],{},"        D --> E[Vérifier le Contexte]\n",[87,2472,2473],{"class":89,"line":156},[87,2474,2475],{},"        E --> F[Exécuter les Tests]\n",[87,2477,2478],{"class":89,"line":162},[87,2479,204],{},[87,2481,2482],{"class":89,"line":168},[87,2483,210],{},[87,2485,2486],{"class":89,"line":173},[87,2487,2488],{},"    subgraph Documentation\n",[87,2490,2491],{"class":89,"line":178},[87,2492,2493],{},"        G[Documentation] --> H[Vérification Finale]\n",[87,2495,2496],{"class":89,"line":184},[87,2497,204],{},[87,2499,2500],{"class":89,"line":190},[87,2501,210],{},[87,2503,2504],{"class":89,"line":196},[87,2505,2506],{},"    subgraph Contrôle de Version\n",[87,2508,2509],{"class":89,"line":201},[87,2510,2511],{},"        I[Revue Git] --> J[Tâche Suivante]\n",[87,2513,2514],{"class":89,"line":207},[87,2515,204],{},[87,2517,2518],{"class":89,"line":213},[87,2519,210],{},[87,2521,2522],{"class":89,"line":219},[87,2523,2524],{},"    B --> C\n",[87,2526,2527],{"class":89,"line":225},[87,2528,2529],{},"    F --> G\n",[87,2531,2532],{"class":89,"line":231},[87,2533,2534],{},"    H --> I\n",[87,2536,2537],{"class":89,"line":237},[87,2538,2539],{},"    J --> B\n",[87,2541,2542],{"class":89,"line":242},[87,2543,2544],{},"    E --> C\n",[458,2546,2548,2554],{"className":2547},[461,462,463],[68,2549,2551],{"id":2550},"mcp-outils-sldc-agentiques",[450,2552,2553],{},"MCP : Outils SLDC Agentiques",[73,2555,2556],{},[471,2557,2558],{"href":473},[450,2559,476],{},[458,2561,2563,2577,2582],{"className":2562},[480],[73,2564,2565,2568,2569,2572,2573,2576],{},[450,2566,2567],{},"MCP SLDC Agentique"," (Cycle de Développement Logiciel) est un ",[450,2570,2571],{},"protocole open-source"," conçu pour aider les équipes et les agents IA à maintenir la ",[450,2574,2575],{},"clarté, la transparence et le flux"," tout au long du développement.",[73,2578,2579],{},[450,2580,2581],{},"Avantages Clés :",[491,2583,2584,2587,2590,2593],{},[494,2585,2586],{},"Toujours savoir quelle est la prochaine étape",[494,2588,2589],{},"Restaurer le contexte après les pauses ou les réinitialisations",[494,2591,2592],{},"Maintenir la documentation et le code synchronisés",[494,2594,2595],{},"Équilibrer efficacement la collaboration humain-IA",[73,2597,2598],{},[450,2599,2600],{},"Considérations Clés en 2025 :",[458,2602,2604],{"className":2603},[480],[491,2605,2606,2612,2618],{},[494,2607,2608,2611],{},[450,2609,2610],{},"VIBE-CODING"," : Flux créatif productif en développement",[494,2613,2614,2617],{},[450,2615,2616],{},"OVER-VIBING"," : Perte de contrôle du projet due à une automatisation excessive ou à une dérive",[494,2619,2620,2623],{},[450,2621,2622],{},"Collaboration Agentique"," : Attribution de rôles et de responsabilités structurés aux humains et aux IA",[458,2625,2627,2633],{"className":2626},[461,462,463],[68,2628,2630],{"id":2629},"exemples-de-flux-de-travail",[450,2631,2632],{},"Exemples de Flux de Travail",[73,2634,2635],{},[471,2636,2637],{"href":473},[450,2638,476],{},[458,2640,2642],{"className":2641},[480],[73,2643,2644],{},"Voici un diagramme simplifié de la boucle de développement :",[77,2646,2648],{"className":79,"code":2647,"language":81,"meta":82,"style":82},"---\ntitle: SLDC Agentique - Boucle de Développement\n---\nflowchart TD\n    Start([\"Début Étape (ex., 4.2)\"])\n    Code[\"Implémenter Fonctionnalité/Tâche\"]\n    Update[\"mcp:update\u003Cbr/>Mettre à jour README.md & mcp-agentic-sldc.yml\u003Cbr/>Marquer l'étape comme terminée\"]\n    Commit[\"mcp:commit\u003Cbr/>Commit avec message Conventional Commit\"]\n    Next[\"mcp:next\u003Cbr/>Passer à l'étape suivante\"]\n    Review[\"Revoir Progression\u003Cbr/>(Si blocages, les signaler)\"]\n    Done([\"Étape Terminée\"])\n\n    Start --> Code --> Update --> Commit --> Next --> Review --> Done\n    Review -- \"Si pas prêt\" --> Start\n",[84,2649,2650,2654,2659,2663,2667,2672,2677,2682,2687,2692,2697,2702,2706,2711],{"__ignoreMap":82},[87,2651,2652],{"class":89,"line":90},[87,2653,2135],{},[87,2655,2656],{"class":89,"line":96},[87,2657,2658],{},"title: SLDC Agentique - Boucle de Développement\n",[87,2660,2661],{"class":89,"line":102},[87,2662,2135],{},[87,2664,2665],{"class":89,"line":108},[87,2666,741],{},[87,2668,2669],{"class":89,"line":114},[87,2670,2671],{},"    Start([\"Début Étape (ex., 4.2)\"])\n",[87,2673,2674],{"class":89,"line":120},[87,2675,2676],{},"    Code[\"Implémenter Fonctionnalité/Tâche\"]\n",[87,2678,2679],{"class":89,"line":126},[87,2680,2681],{},"    Update[\"mcp:update\u003Cbr/>Mettre à jour README.md & mcp-agentic-sldc.yml\u003Cbr/>Marquer l'étape comme terminée\"]\n",[87,2683,2684],{"class":89,"line":132},[87,2685,2686],{},"    Commit[\"mcp:commit\u003Cbr/>Commit avec message Conventional Commit\"]\n",[87,2688,2689],{"class":89,"line":138},[87,2690,2691],{},"    Next[\"mcp:next\u003Cbr/>Passer à l'étape suivante\"]\n",[87,2693,2694],{"class":89,"line":144},[87,2695,2696],{},"    Review[\"Revoir Progression\u003Cbr/>(Si blocages, les signaler)\"]\n",[87,2698,2699],{"class":89,"line":150},[87,2700,2701],{},"    Done([\"Étape Terminée\"])\n",[87,2703,2704],{"class":89,"line":156},[87,2705,2279],{"emptyLinePlaceholder":2082},[87,2707,2708],{"class":89,"line":162},[87,2709,2710],{},"    Start --> Code --> Update --> Commit --> Next --> Review --> Done\n",[87,2712,2713],{"class":89,"line":168},[87,2714,2715],{},"    Review -- \"Si pas prêt\" --> Start\n",[458,2717,2719],{"className":2718},[480],[73,2720,2721],{},"Et comment retrouver le contexte après une pause :",[77,2723,2725],{"className":79,"code":2724,"language":81,"meta":82,"style":82},"---\ntitle: SLDC Agentique - Retrouver le contexte\n---\nflowchart TD\n    Done --> MemoryLoss[\"Perte de Mémoire ?\"]\n    MemoryLoss -- \"Oui\" --> Recall --> Start\n    MemoryLoss -- \"Non\" --> Start\n    Recall[\"Consulter mcp-agentic-sldc.yml\u003Cbr/>Restaurer contexte, voir progression, actions suivantes\"]\n",[84,2726,2727,2731,2736,2740,2744,2749,2754,2759],{"__ignoreMap":82},[87,2728,2729],{"class":89,"line":90},[87,2730,2135],{},[87,2732,2733],{"class":89,"line":96},[87,2734,2735],{},"title: SLDC Agentique - Retrouver le contexte\n",[87,2737,2738],{"class":89,"line":102},[87,2739,2135],{},[87,2741,2742],{"class":89,"line":108},[87,2743,741],{},[87,2745,2746],{"class":89,"line":114},[87,2747,2748],{},"    Done --> MemoryLoss[\"Perte de Mémoire ?\"]\n",[87,2750,2751],{"class":89,"line":120},[87,2752,2753],{},"    MemoryLoss -- \"Oui\" --> Recall --> Start\n",[87,2755,2756],{"class":89,"line":126},[87,2757,2758],{},"    MemoryLoss -- \"Non\" --> Start\n",[87,2760,2761],{"class":89,"line":132},[87,2762,2763],{},"    Recall[\"Consulter mcp-agentic-sldc.yml\u003Cbr/>Restaurer contexte, voir progression, actions suivantes\"]\n",[458,2765,2767,2771],{"className":2766},[461,462,463],[68,2768,2770],{"id":2769},"prochaines-étapes","Prochaines étapes",[73,2772,2773],{},[471,2774,2775],{"href":473},[450,2776,476],{},[547,2778,2780],{"id":2779},"mcp","MCP",[73,2782,2783],{},[450,2784,2785,2786,2789],{},"Le Fichier ",[84,2787,2788],{},"mcp-agentic-sldc.yml"," : Votre Feuille de Route Vivante",[458,2791,2793],{"className":2792},[480],[73,2794,2795],{},"Comme nous sommes en phase initiale, chaque projet utilisant le SLDC Agentique avec le Protocole de Flux de Travail Agentique devrait inclure un fichier structuré comme cet exemple :",[77,2797,2801],{"className":2798,"code":2799,"language":2800,"meta":82,"style":82},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","author: Michael Wybraniec\ngoal: Construire une API backend moderne pour la banque\noverview:\n  - Configuration\n  - Schéma & Modèles\n  - Auth & Permissions\n  - Tests & Documentation\noutcome: Une API bancaire prête à être étendue, construite avec GraphQL et Prisma\nsteps:\n  - number: 1\n    name: Configurer le projet\n    owner: human\n    done: true\n  - number: 2\n    name: Définir le schéma GraphQL\n    owner: ai\n    done: true\n  - number: 3\n    name: Connecter les modèles Prisma\n    owner: ai\n    done: true\n  - number: 4\n    name: Auth & middleware\n    owner: human\n    done: false\n","yaml",[84,2802,2803,2813,2823,2831,2839,2846,2853,2860,2870,2877,2890,2900,2910,2921,2932,2941,2950,2958,2969,2978,2986,2994,3005,3014,3022],{"__ignoreMap":82},[87,2804,2805,2808,2810],{"class":89,"line":90},[87,2806,2807],{"class":673},"author",[87,2809,677],{"class":628},[87,2811,2812],{"class":683}," Michael Wybraniec\n",[87,2814,2815,2818,2820],{"class":89,"line":96},[87,2816,2817],{"class":673},"goal",[87,2819,677],{"class":628},[87,2821,2822],{"class":683}," Construire une API backend moderne pour la banque\n",[87,2824,2825,2828],{"class":89,"line":102},[87,2826,2827],{"class":673},"overview",[87,2829,2830],{"class":628},":\n",[87,2832,2833,2836],{"class":89,"line":108},[87,2834,2835],{"class":628},"  -",[87,2837,2838],{"class":683}," Configuration\n",[87,2840,2841,2843],{"class":89,"line":114},[87,2842,2835],{"class":628},[87,2844,2845],{"class":683}," Schéma & Modèles\n",[87,2847,2848,2850],{"class":89,"line":120},[87,2849,2835],{"class":628},[87,2851,2852],{"class":683}," Auth & Permissions\n",[87,2854,2855,2857],{"class":89,"line":126},[87,2856,2835],{"class":628},[87,2858,2859],{"class":683}," Tests & Documentation\n",[87,2861,2862,2865,2867],{"class":89,"line":132},[87,2863,2864],{"class":673},"outcome",[87,2866,677],{"class":628},[87,2868,2869],{"class":683}," Une API bancaire prête à être étendue, construite avec GraphQL et Prisma\n",[87,2871,2872,2875],{"class":89,"line":138},[87,2873,2874],{"class":673},"steps",[87,2876,2830],{"class":628},[87,2878,2879,2881,2884,2886],{"class":89,"line":144},[87,2880,2835],{"class":628},[87,2882,2883],{"class":673}," number",[87,2885,677],{"class":628},[87,2887,2889],{"class":2888},"sbssI"," 1\n",[87,2891,2892,2895,2897],{"class":89,"line":150},[87,2893,2894],{"class":673},"    name",[87,2896,677],{"class":628},[87,2898,2899],{"class":683}," Configurer le projet\n",[87,2901,2902,2905,2907],{"class":89,"line":156},[87,2903,2904],{"class":673},"    owner",[87,2906,677],{"class":628},[87,2908,2909],{"class":683}," human\n",[87,2911,2912,2915,2917],{"class":89,"line":162},[87,2913,2914],{"class":673},"    done",[87,2916,677],{"class":628},[87,2918,2920],{"class":2919},"sfNiH"," true\n",[87,2922,2923,2925,2927,2929],{"class":89,"line":168},[87,2924,2835],{"class":628},[87,2926,2883],{"class":673},[87,2928,677],{"class":628},[87,2930,2931],{"class":2888}," 2\n",[87,2933,2934,2936,2938],{"class":89,"line":173},[87,2935,2894],{"class":673},[87,2937,677],{"class":628},[87,2939,2940],{"class":683}," Définir le schéma GraphQL\n",[87,2942,2943,2945,2947],{"class":89,"line":178},[87,2944,2904],{"class":673},[87,2946,677],{"class":628},[87,2948,2949],{"class":683}," ai\n",[87,2951,2952,2954,2956],{"class":89,"line":184},[87,2953,2914],{"class":673},[87,2955,677],{"class":628},[87,2957,2920],{"class":2919},[87,2959,2960,2962,2964,2966],{"class":89,"line":190},[87,2961,2835],{"class":628},[87,2963,2883],{"class":673},[87,2965,677],{"class":628},[87,2967,2968],{"class":2888}," 3\n",[87,2970,2971,2973,2975],{"class":89,"line":196},[87,2972,2894],{"class":673},[87,2974,677],{"class":628},[87,2976,2977],{"class":683}," Connecter les modèles Prisma\n",[87,2979,2980,2982,2984],{"class":89,"line":201},[87,2981,2904],{"class":673},[87,2983,677],{"class":628},[87,2985,2949],{"class":683},[87,2987,2988,2990,2992],{"class":89,"line":207},[87,2989,2914],{"class":673},[87,2991,677],{"class":628},[87,2993,2920],{"class":2919},[87,2995,2996,2998,3000,3002],{"class":89,"line":213},[87,2997,2835],{"class":628},[87,2999,2883],{"class":673},[87,3001,677],{"class":628},[87,3003,3004],{"class":2888}," 4\n",[87,3006,3007,3009,3011],{"class":89,"line":219},[87,3008,2894],{"class":673},[87,3010,677],{"class":628},[87,3012,3013],{"class":683}," Auth & middleware\n",[87,3015,3016,3018,3020],{"class":89,"line":225},[87,3017,2904],{"class":673},[87,3019,677],{"class":628},[87,3021,2909],{"class":683},[87,3023,3024,3026,3028],{"class":89,"line":231},[87,3025,2914],{"class":673},[87,3027,677],{"class":628},[87,3029,3030],{"class":2919}," false\n",[458,3032,3034],{"className":3033},[480],[73,3035,3036,3037,3040,3041,3040,3044,3047],{},"Le YAML définit également des procédures comme ",[84,3038,3039],{},"update",", ",[84,3042,3043],{},"commit",[84,3045,3046],{},"next",", et des règles pour les transferts humain-IA.",[458,3049,3051,3057],{"className":3050},[461,462,463],[547,3052,3054],{"id":3053},"meilleures-pratiques",[450,3055,3056],{},"Meilleures Pratiques",[73,3058,3059],{},[471,3060,3061],{"href":473},[450,3062,476],{},[458,3064,3066,3069],{"className":3065},[480],[73,3067,3068],{},"Comme le Vibe-Coding est nouveau, ainsi que tous les concepts, vous gardez le contrôle total, que vous le vouliez ou non. Par conséquent, gardez cette liste à l'esprit :",[491,3070,3071,3074,3077,3080,3083,3089,3092],{},[494,3072,3073],{},"Utiliser des commits conventionnels liés à chaque étape",[494,3075,3076],{},"Maintenir README.md et le YAML SLDC toujours à jour",[494,3078,3079],{},"Définir la propriété : Humain vs IA",[494,3081,3082],{},"Permettre un transfert structuré entre agents",[494,3084,3085,3086],{},"Récupérer d'une perte de mémoire avec une seule commande ",[84,3087,3088],{},"check",[494,3090,3091],{},"Maintenir une architecture de code modulaire et testable",[494,3093,3094],{},"Documenter les décisions et compromis au fur et à mesure",[458,3096,3098,3104],{"className":3097},[461,462,463],[547,3099,3101],{"id":3100},"pourquoi-ça-marche",[450,3102,3103],{},"Pourquoi Ça Marche ?",[73,3105,3106],{},[471,3107,3108],{"href":473},[450,3109,476],{},[458,3111,3113,3120,3154],{"className":3112},[480],[73,3114,3115,3116,3119],{},"Bankly a été complété en ",[450,3117,3118],{},"2 jours"," parce que :",[491,3121,3122,3125,3128,3131,3134,3137,3143],{},[494,3123,3124],{},"La feuille de route était claire et structurée via le protocole AWP",[494,3126,3127],{},"Le travail était modulaire et agentique avec une propriété définie",[494,3129,3130],{},"L'IA gérait les tâches structurées comme le schéma, la génération de modèles et la configuration",[494,3132,3133],{},"L'attention humaine restait sur l'architecture, la logique et la revue",[494,3135,3136],{},"Le contexte n'a jamais été perdu grâce au protocole SLDC",[494,3138,3139,3142],{},[450,3140,3141],{},"35+ commits"," montrent une progression systématique sans dérive fonctionnelle",[494,3144,3145,3146,3149,3150,3153],{},"Le ",[450,3147,3148],{},"Jour 1"," s'est concentré sur les fonctionnalités de base, le ",[450,3151,3152],{},"Jour 2"," sur la préparation à la production",[73,3155,3156,3157,3160],{},"Ce n'est pas juste de la productivité—c'est une ",[450,3158,3159],{},"vélocité durable",". Le système prévient l'épuisement tout en maintenant la qualité et en permettant une itération rapide.",[458,3162,3164,3170],{"className":3163},[461,462,463],[68,3165,3167],{"id":3166},"réflexions-finales",[450,3168,3169],{},"Réflexions Finales",[73,3171,3172],{},[471,3173,3174],{"href":473},[450,3175,476],{},[458,3177,3179,3182,3209],{"className":3178},[480],[73,3180,3181],{},"MCP SLDC Agentique ou mon AWP - Protocole de Flux de Travail Agentique - n'est pas juste un outil—c'est une philosophie pour le développement moderne :",[491,3183,3184,3194,3200,3206],{},[494,3185,3186,3187,3190,3191],{},"Construire ",[450,3188,3189],{},"plus rapidement",", mais rester ",[450,3192,3193],{},"ancré",[494,3195,3196,3197],{},"Collaborer avec l'IA, mais maintenir la ",[450,3198,3199],{},"stratégie et la propriété",[494,3201,3202,3203],{},"Utiliser la clarté et le processus pour ",[450,3204,3205],{},"éviter l'épuisement et la confusion",[494,3207,3208],{},"La structure est la nouvelle vitesse dans un monde assisté par l'IA",[73,3210,3211],{},"Que vous fassiez du Vibe-Coding en solo ou que vous gériez une équipe d'agents, la collaboration structurée est la clé d'une livraison de logiciels durable et de haute qualité.",[458,3213,3215,3221],{"className":3214},[461,462,463],[68,3216,3218],{"id":3217},"participez",[450,3219,3220],{},"Participez !",[73,3222,3223],{},[471,3224,3225],{"href":473},[450,3226,476],{},[458,3228,3230],{"className":3229},[480],[73,3231,3232,3233,3235,3236,3242],{},"Contribuez au ",[450,3234,2567],{}," et rejoignez le mouvement vers un développement centré sur l'humain et assisté par l'IA -> ",[471,3237,3241],{"href":3238,"rel":3239},"https://one-front.com/contact",[3240],"nofollow","ici",".",[458,3244,3247],{"className":3245},[2034,3246,2036,2037],"text-center",[73,3248,3249],{},[471,3250,3251],{"href":473},[450,3252,476],{},[2056,3254,3255],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":82,"searchDepth":96,"depth":96,"links":3257},[3258,3259,3260,3261,3262,3263,3264,3269,3270],{"id":2116,"depth":96,"text":2119},{"id":2315,"depth":96,"text":2318},{"id":2359,"depth":96,"text":2362},{"id":2384,"depth":96,"text":2387},{"id":2550,"depth":96,"text":2553},{"id":2629,"depth":96,"text":2632},{"id":2769,"depth":96,"text":2770,"children":3265},[3266,3267,3268],{"id":2779,"depth":102,"text":2780},{"id":3053,"depth":102,"text":3056},{"id":3100,"depth":102,"text":3103},{"id":3166,"depth":96,"text":3169},{"id":3217,"depth":96,"text":3220},"2025-06-29","Découvrez comment Bankly, un système bancaire backend, a été construit en seulement deux jours en utilisant Apollo GraphQL, Prisma et le Flux de Travail Agentique - un protocole pour le développement durable assisté par l'IA.",{"src":2080},{},{"title":31,"description":3272},"YK4sakb9zslMRc8p8ii8F05oAMn1YxZECH7H7RpY94E",{"id":3278,"title":15,"authors":3279,"badge":3284,"body":3287,"date":5316,"description":5317,"extension":2078,"image":5318,"meta":5319,"navigation":2082,"path":16,"seo":5320,"stem":17,"__hash__":5321},"posts_fr/fr/blog/1. mcp-aouth.md",[3280],{"name":55,"description":3281,"to":57,"avatar":3282},"Freelance, MCP Servers, Full-Stack Development, Architecture",{"src":3283},"https://media.licdn.com/dms/image/v2/D4D03AQF3mn-R1ERoNg/profile-displayphoto-crop_800_800/B4DZeoMSehHMAI-/0/1750873484401?e=1756339200&v=beta&t=D2AWIO__-FP4J-iWELIG6djNIvq0WOe8x9uBYpKvFZA",{"label":3285,"color":3286,"variant":63},"Architecture, Security","primary",{"type":65,"value":3288,"toc":5298},[3289,3309,3333,3348,3397,3412,3464,3475,3594,3609,3723,3738,3776,4304,4319,4325,4399,4414,4425,4557,4572,4681,4696,4851,5029,5061,5067,5076,5137,5146,5161,5286,5295],[73,3290,3291,3295,3296,3295,3300,3295,3304],{},[471,3292,3294],{"href":3293},"/blog","Retour aux articles"," | ",[471,3297,3299],{"href":3298},"/blog/architecture","Architecture MCP",[471,3301,3303],{"href":3302},"/blog/mcp-security","Sécurité MCP",[471,3305,3308],{"href":3306,"rel":3307},"https://datatracker.ietf.org/doc/html/rfc8693",[3240],"RFC 8693 Token Exchange",[458,3310,3312],{"className":3311},[480],[73,3313,3314,3315,3318,3319,3322,3323,3328,3329,3332],{},"L'architecture d'autorisation du Model Context Protocol (MCP) peut être considérablement simplifiée en traitant les serveurs MCP comme des ",[450,3316,3317],{},"serveurs de ressources OAuth"," plutôt que comme des serveurs d'autorisation. Cette approche révolutionnaire, proposée par ",[450,3320,3321],{},"dasiths"," dans la ",[471,3324,3327],{"href":3325,"rel":3326},"https://github.com/modelcontextprotocol/modelcontextprotocol/discussions/381",[3240],"discussion GitHub",", permet aux développeurs de tirer parti des solutions d'identité existantes comme ",[450,3330,3331],{},"Okta, Auth0, Microsoft Entra ID"," tout en réduisant la complexité d'implémentation et en améliorant l'adoption en entreprise.",[458,3334,3336,3342],{"className":3335},[461,462,463],[68,3337,3339],{"id":3338},"le-problème-avec-lapproche-actuelle",[450,3340,3341],{},"Le Problème avec l'Approche Actuelle",[73,3343,3344],{},[471,3345,3346],{"href":473},[450,3347,476],{},[458,3349,3351,3358],{"className":3350},[480],[73,3352,3353,3354,3357],{},"L'implémentation actuelle du brouillon d'autorisation MCP traite chaque serveur MCP comme un ",[450,3355,3356],{},"serveur d'autorisation OAuth",". Cela signifie que chaque développeur de serveur MCP doit implémenter conformément aux spécifications :",[491,3359,3360,3370,3380,3383],{},[494,3361,3362,3369],{},[450,3363,3364],{},[471,3365,3368],{"href":3366,"rel":3367},"https://datatracker.ietf.org/doc/html/rfc8414",[3240],"RFC 8414"," - OAuth 2.0 Authorization Server Metadata",[494,3371,3372,3379],{},[450,3373,3374],{},[471,3375,3378],{"href":3376,"rel":3377},"https://datatracker.ietf.org/doc/html/rfc7591",[3240],"RFC 7591"," - OAuth 2.0 Dynamic Client Registration Protocol",[494,3381,3382],{},"Les endpoints d'autorisation et de tokens",[494,3384,3385,3386,3389,3390,3393,3394,3242],{},"La gestion des sessions utilisateurs\nCette approche crée une ",[450,3387,3388],{},"complexité inutile"," et constitue un obstacle majeur à l'adoption, comme l'a souligné ",[450,3391,3392],{},"gao-sun"," qui a testé cette implémentation avec ",[450,3395,3396],{},"Logto, Keycloak et Auth0",[458,3398,3400,3406],{"className":3399},[461,462,463],[68,3401,3403],{"id":3402},"la-solution-serveur-de-ressources-oauth",[450,3404,3405],{},"La Solution : Serveur de Ressources OAuth",[73,3407,3408],{},[471,3409,3410],{"href":473},[450,3411,476],{},[458,3413,3415,3441],{"className":3414},[480],[73,3416,3417,3418,3421,3422,3430,3431,3434,3435,3440],{},"En traitant le serveur MCP comme un ",[450,3419,3420],{},"serveur de ressources OAuth"," conformément au ",[450,3423,3424,3429],{},[471,3425,3428],{"href":3426,"rel":3427},"https://datatracker.ietf.org/doc/html/rfc9728",[3240],"RFC 9728"," - OAuth 2.0 Protected Resource Metadata",", nous déléguons l'authentification et l'autorisation à des fournisseurs d'identité existants. Cette approche transforme le serveur MCP en un service ",[450,3432,3433],{},"sans état"," en ce qui concerne les préoccupations d'authentification, utilisant le ",[450,3436,3437],{},[471,3438,3308],{"href":3306,"rel":3439},[3240]," pour les scénarios de délégation.",[73,3442,3443,3444,3451,3452,3455,3456,3459,3460,3242],{},"Selon la ",[450,3445,3446],{},[471,3447,3450],{"href":3448,"rel":3449},"https://github.com/modelcontextprotocol/modelcontextprotocol/blob/63ccd1a416de4ffe7c24d8257f8f3c849e4ea0f8/docs/specification/draft/basic/authorization.mdx",[3240],"spécification officielle MCP",", les serveurs MCP ",[450,3453,3454],{},"DOIVENT"," implémenter OAuth 2.0 Protected Resource Metadata pour indiquer l'emplacement des serveurs d'autorisation via l'en-tête ",[84,3457,3458],{},"WWW-Authenticate"," lors du retour d'un ",[3461,3462,3463],"em",{},"401 Unauthorized",[458,3465,3467,3472],{"className":3466},[480],[73,3468,3469],{},[450,3470,3471],{},"Diagramme 1 : Flux de découverte et d'autorisation MCP avec serveur de ressources OAuth",[73,3473,3474],{},"Ce diagramme illustre le processus complet de découverte des métadonnées et d'autorisation entre un client MCP, un serveur MCP agissant comme serveur de ressources OAuth, et un serveur d'autorisation externe. Le flux commence par une requête non autorisée et se termine par une communication MCP sécurisée avec un token d'accès valide.",[77,3476,3478],{"className":79,"code":3477,"language":81,"meta":82,"style":82},"sequenceDiagram\n    participant C as Client MCP\n    participant M as Serveur MCP (Serveur de Ressources)\n    participant A as Serveur d'Autorisation\n\n    C->>M: Requête MCP sans token\n    M-->>C: HTTP 401 Unauthorized avec en-tête WWW-Authenticate\n    Note over C: Extraire resource_metadata\u003Cbr />du WWW-Authenticate\n\n    C->>M: GET /.well-known/oauth-protected-resource\n    M-->>C: Métadonnées de ressource avec URL serveur d'autorisation\n    Note over C: Valider métadonnées RS,\u003Cbr />construire URL métadonnées AS\n\n    C->>A: GET /.well-known/oauth-authorization-server\n    A-->>C: Métadonnées serveur d'autorisation\n\n    Note over C,A: Flux d'autorisation OAuth 2.1 se déroule ici\n\n    C->>A: Requête de token\n    A-->>C: Token d'accès\n\n    C->>M: Requête MCP avec token d'accès\n    M-->>C: Réponse MCP\n    Note over C,M: Communication MCP continue avec token valide\n",[84,3479,3480,3485,3490,3495,3500,3504,3509,3514,3519,3523,3528,3533,3538,3542,3547,3552,3556,3561,3565,3570,3575,3579,3584,3589],{"__ignoreMap":82},[87,3481,3482],{"class":89,"line":90},[87,3483,3484],{},"sequenceDiagram\n",[87,3486,3487],{"class":89,"line":96},[87,3488,3489],{},"    participant C as Client MCP\n",[87,3491,3492],{"class":89,"line":102},[87,3493,3494],{},"    participant M as Serveur MCP (Serveur de Ressources)\n",[87,3496,3497],{"class":89,"line":108},[87,3498,3499],{},"    participant A as Serveur d'Autorisation\n",[87,3501,3502],{"class":89,"line":114},[87,3503,2279],{"emptyLinePlaceholder":2082},[87,3505,3506],{"class":89,"line":120},[87,3507,3508],{},"    C->>M: Requête MCP sans token\n",[87,3510,3511],{"class":89,"line":126},[87,3512,3513],{},"    M-->>C: HTTP 401 Unauthorized avec en-tête WWW-Authenticate\n",[87,3515,3516],{"class":89,"line":132},[87,3517,3518],{},"    Note over C: Extraire resource_metadata\u003Cbr />du WWW-Authenticate\n",[87,3520,3521],{"class":89,"line":138},[87,3522,2279],{"emptyLinePlaceholder":2082},[87,3524,3525],{"class":89,"line":144},[87,3526,3527],{},"    C->>M: GET /.well-known/oauth-protected-resource\n",[87,3529,3530],{"class":89,"line":150},[87,3531,3532],{},"    M-->>C: Métadonnées de ressource avec URL serveur d'autorisation\n",[87,3534,3535],{"class":89,"line":156},[87,3536,3537],{},"    Note over C: Valider métadonnées RS,\u003Cbr />construire URL métadonnées AS\n",[87,3539,3540],{"class":89,"line":162},[87,3541,2279],{"emptyLinePlaceholder":2082},[87,3543,3544],{"class":89,"line":168},[87,3545,3546],{},"    C->>A: GET /.well-known/oauth-authorization-server\n",[87,3548,3549],{"class":89,"line":173},[87,3550,3551],{},"    A-->>C: Métadonnées serveur d'autorisation\n",[87,3553,3554],{"class":89,"line":178},[87,3555,2279],{"emptyLinePlaceholder":2082},[87,3557,3558],{"class":89,"line":184},[87,3559,3560],{},"    Note over C,A: Flux d'autorisation OAuth 2.1 se déroule ici\n",[87,3562,3563],{"class":89,"line":190},[87,3564,2279],{"emptyLinePlaceholder":2082},[87,3566,3567],{"class":89,"line":196},[87,3568,3569],{},"    C->>A: Requête de token\n",[87,3571,3572],{"class":89,"line":201},[87,3573,3574],{},"    A-->>C: Token d'accès\n",[87,3576,3577],{"class":89,"line":207},[87,3578,2279],{"emptyLinePlaceholder":2082},[87,3580,3581],{"class":89,"line":213},[87,3582,3583],{},"    C->>M: Requête MCP avec token d'accès\n",[87,3585,3586],{"class":89,"line":219},[87,3587,3588],{},"    M-->>C: Réponse MCP\n",[87,3590,3591],{"class":89,"line":225},[87,3592,3593],{},"    Note over C,M: Communication MCP continue avec token valide\n",[458,3595,3597,3603],{"className":3596},[461,462,463],[68,3598,3600],{"id":3599},"avantages-de-cette-approche",[450,3601,3602],{},"Avantages de Cette Approche",[73,3604,3605],{},[471,3606,3607],{"href":473},[450,3608,476],{},[458,3610,3618,3666],{"className":3611},[3612,3613,3614,3615,3616,3617],"grid","grid-cols-1","md:grid-cols-2","items-start","w-full","gap-x-8",[458,3619,3621,3628,3635,3646,3652,3655],{"className":3620},[480],[3622,3623,3625],"h4",{"id":3624},"adoption-entreprise",[450,3626,3627],{},"🏢 Adoption Entreprise",[73,3629,3630,3631,3634],{},"Cette approche augmente considérablement l'",[450,3632,3633],{},"adoptabilité de MCP dans les scénarios d'entreprise"," où des serveurs d'autorisation OAuth sont déjà déployés. Les organisations peuvent :",[491,3636,3637,3640,3643],{},[494,3638,3639],{},"Utiliser leurs solutions d'identité existantes",[494,3641,3642],{},"Appliquer leurs politiques de sécurité établies",[494,3644,3645],{},"Intégrer MCP dans leur architecture de sécurité actuelle",[3622,3647,3649],{"id":3648},"réduction-de-complexité",[450,3650,3651],{},"⚡ Réduction de Complexité",[73,3653,3654],{},"Les développeurs de serveurs MCP n'ont plus besoin de :",[491,3656,3657,3660,3663],{},[494,3658,3659],{},"Implémenter des flux d'autorisation complexes",[494,3661,3662],{},"Gérer les sessions et tokens liés",[494,3664,3665],{},"Maintenir des bases de données d'utilisateurs",[458,3667,3669,3675,3696,3702,3709],{"className":3668},[480],[3622,3670,3672],{"id":3671},"sécurité-renforcée",[450,3673,3674],{},"🔒 Sécurité Renforcée",[491,3676,3677,3683,3689],{},[494,3678,3679,3682],{},[450,3680,3681],{},"Réduction de la surface d'attaque"," en cas de vulnérabilité",[494,3684,3685,3688],{},[450,3686,3687],{},"Architecture sans état"," pour les préoccupations d'auth",[494,3690,3691,3692,3695],{},"Possibilité d'utiliser des ",[450,3693,3694],{},"flux d'échange de tokens"," pour agir au nom de l'utilisateur",[3622,3697,3699],{"id":3698},"flexibilité-client",[450,3700,3701],{},"🔄 Flexibilité Client",[73,3703,3704,3705,3708],{},"Les clients MCP peuvent tirer parti de ",[450,3706,3707],{},"n'importe quel flux OAuth supporté"," pour récupérer un token :",[491,3710,3711,3714,3717,3720],{},[494,3712,3713],{},"Client credentials",[494,3715,3716],{},"Authorization code",[494,3718,3719],{},"Device code",[494,3721,3722],{},"Token exchange",[458,3724,3726,3732],{"className":3725},[461,462,463],[68,3727,3729],{"id":3728},"scénario-dexemple-échange-de-tokens",[450,3730,3731],{},"Scénario d'Exemple : Échange de Tokens",[73,3733,3734],{},[471,3735,3736],{"href":473},[450,3737,476],{},[458,3739,3741,3766],{"className":3740},[480],[73,3742,3743,3744,3747,3748,3750,3751,3421,3754,3761,3762,3765],{},"Considérons une organisation avec une ",[450,3745,3746],{},"multitude d'APIs REST"," développées au fil des années, comme mentionné par ",[450,3749,3321],{}," dans sa proposition. Ces APIs sont protégées par l'authentification ",[450,3752,3753],{},"JWT bearer",[450,3755,3756],{},[471,3757,3760],{"href":3758,"rel":3759},"https://datatracker.ietf.org/doc/html/rfc6750",[3240],"RFC 6750"," et disposent de serveurs d'autorisation OAuth existants (",[450,3763,3764],{},"Okta, Auth0, Microsoft Entra ID, Keycloak",").",[73,3767,3145,3768,3771,3772,3775],{},[450,3769,3770],{},"chemin le plus simple pour adopter MCP"," serait de tirer parti de leur solution d'auth existante et de traiter le serveur MCP comme un simple service de niveau intermédiaire qui doit consommer leurs APIs existantes en utilisant le ",[450,3773,3774],{},"Token Exchange Flow"," du RFC 8693.",[77,3777,3779],{"className":611,"code":3778,"language":613,"meta":82,"style":82},"// Exemple d'implémentation côté serveur MCP inspirée de MCP Auth par gao-sun\nclass MCPResourceServer {\n  async handleRequest(request: MCPRequest, accessToken: string) {\n    // 1. Valider le token avec le serveur d'autorisation (RFC 7662 Token Introspection)\n    const validation = await this.validateToken(accessToken);\n    \n    if (!validation.valid) {\n      throw new UnauthorizedError();\n    }\n    \n    // 2. Échange de token pour accéder aux APIs internes (RFC 8693)\n    const exchangedToken = await this.exchangeToken(\n      accessToken, \n      'urn:ietf:params:oauth:token-type:access_token',\n      'https://api.internal.company.com'\n    );\n    \n    // 3. Appel à l'API avec le token échangé\n    return await this.callInternalAPI(exchangedToken);\n  }\n  \n  // Métadonnées de ressource protégée (RFC 9728) - Endpoint /.well-known/oauth-protected-resource\n  async getResourceMetadata() {\n    return {\n      \"authorization_servers\": [\"https://auth.company.com\"],\n      \"scopes_supported\": [\"mcp:read\", \"mcp:write\", \"mcp:admin\"],\n      \"bearer_methods_supported\": [\"header\"],\n      \"resource_documentation\": \"https://docs.company.com/mcp-api\"\n    };\n  }\n  \n  // Gestion de l'en-tête WWW-Authenticate selon la spécification MCP\n  async handleUnauthorized(response: Response) {\n    response.status = 401;\n    response.headers.set('WWW-Authenticate', \n      'Bearer realm=\"MCP Server\", resource_metadata=\"https://mcp.company.com/.well-known/oauth-protected-resource\"'\n    );\n    response.headers.set('MCP-Protocol-Version', '2024-11-05');\n    return response;\n  }\n}\n",[84,3780,3781,3786,3798,3831,3836,3866,3870,3894,3909,3914,3918,3923,3942,3952,3965,3975,3982,3986,3991,4012,4017,4021,4026,4037,4043,4070,4112,4136,4154,4159,4163,4167,4172,4193,4210,4236,4245,4251,4286,4295,4299],{"__ignoreMap":82},[87,3782,3783],{"class":89,"line":90},[87,3784,3785],{"class":693},"// Exemple d'implémentation côté serveur MCP inspirée de MCP Auth par gao-sun\n",[87,3787,3788,3791,3795],{"class":89,"line":96},[87,3789,3790],{"class":620},"class",[87,3792,3794],{"class":3793},"sBMFI"," MCPResourceServer",[87,3796,3797],{"class":628}," {\n",[87,3799,3800,3803,3806,3808,3812,3814,3817,3819,3822,3824,3827,3829],{"class":89,"line":102},[87,3801,3802],{"class":620},"  async",[87,3804,3805],{"class":673}," handleRequest",[87,3807,665],{"class":628},[87,3809,3811],{"class":3810},"sHdIc","request",[87,3813,677],{"class":628},[87,3815,3816],{"class":3793}," MCPRequest",[87,3818,690],{"class":628},[87,3820,3821],{"class":3810}," accessToken",[87,3823,677],{"class":628},[87,3825,3826],{"class":3793}," string",[87,3828,717],{"class":628},[87,3830,3797],{"class":628},[87,3832,3833],{"class":89,"line":108},[87,3834,3835],{"class":693},"    // 1. Valider le token avec le serveur d'autorisation (RFC 7662 Token Introspection)\n",[87,3837,3838,3841,3844,3847,3851,3854,3857,3859,3862,3864],{"class":89,"line":114},[87,3839,3840],{"class":620},"    const",[87,3842,3843],{"class":624}," validation",[87,3845,3846],{"class":628}," =",[87,3848,3850],{"class":3849},"s7zQu"," await",[87,3852,3853],{"class":628}," this.",[87,3855,3856],{"class":635},"validateToken",[87,3858,665],{"class":673},[87,3860,3861],{"class":624},"accessToken",[87,3863,717],{"class":673},[87,3865,642],{"class":628},[87,3867,3868],{"class":89,"line":120},[87,3869,210],{"class":673},[87,3871,3872,3875,3878,3881,3884,3886,3889,3892],{"class":89,"line":126},[87,3873,3874],{"class":3849},"    if",[87,3876,3877],{"class":673}," (",[87,3879,3880],{"class":628},"!",[87,3882,3883],{"class":624},"validation",[87,3885,3242],{"class":628},[87,3887,3888],{"class":624},"valid",[87,3890,3891],{"class":673},") ",[87,3893,668],{"class":628},[87,3895,3896,3899,3901,3904,3907],{"class":89,"line":132},[87,3897,3898],{"class":3849},"      throw",[87,3900,632],{"class":628},[87,3902,3903],{"class":635}," UnauthorizedError",[87,3905,3906],{"class":673},"()",[87,3908,642],{"class":628},[87,3910,3911],{"class":89,"line":138},[87,3912,3913],{"class":628},"    }\n",[87,3915,3916],{"class":89,"line":144},[87,3917,210],{"class":673},[87,3919,3920],{"class":89,"line":150},[87,3921,3922],{"class":693},"    // 2. Échange de token pour accéder aux APIs internes (RFC 8693)\n",[87,3924,3925,3927,3930,3932,3934,3936,3939],{"class":89,"line":156},[87,3926,3840],{"class":620},[87,3928,3929],{"class":624}," exchangedToken",[87,3931,3846],{"class":628},[87,3933,3850],{"class":3849},[87,3935,3853],{"class":628},[87,3937,3938],{"class":635},"exchangeToken",[87,3940,3941],{"class":673},"(\n",[87,3943,3944,3947,3949],{"class":89,"line":162},[87,3945,3946],{"class":624},"      accessToken",[87,3948,690],{"class":628},[87,3950,3951],{"class":673}," \n",[87,3953,3954,3957,3960,3963],{"class":89,"line":168},[87,3955,3956],{"class":628},"      '",[87,3958,3959],{"class":683},"urn:ietf:params:oauth:token-type:access_token",[87,3961,3962],{"class":628},"'",[87,3964,1755],{"class":628},[87,3966,3967,3969,3972],{"class":89,"line":173},[87,3968,3956],{"class":628},[87,3970,3971],{"class":683},"https://api.internal.company.com",[87,3973,3974],{"class":628},"'\n",[87,3976,3977,3980],{"class":89,"line":178},[87,3978,3979],{"class":673},"    )",[87,3981,642],{"class":628},[87,3983,3984],{"class":89,"line":184},[87,3985,210],{"class":673},[87,3987,3988],{"class":89,"line":190},[87,3989,3990],{"class":693},"    // 3. Appel à l'API avec le token échangé\n",[87,3992,3993,3996,3998,4000,4003,4005,4008,4010],{"class":89,"line":196},[87,3994,3995],{"class":3849},"    return",[87,3997,3850],{"class":3849},[87,3999,3853],{"class":628},[87,4001,4002],{"class":635},"callInternalAPI",[87,4004,665],{"class":673},[87,4006,4007],{"class":624},"exchangedToken",[87,4009,717],{"class":673},[87,4011,642],{"class":628},[87,4013,4014],{"class":89,"line":201},[87,4015,4016],{"class":628},"  }\n",[87,4018,4019],{"class":89,"line":207},[87,4020,1776],{"class":624},[87,4022,4023],{"class":89,"line":213},[87,4024,4025],{"class":693},"  // Métadonnées de ressource protégée (RFC 9728) - Endpoint /.well-known/oauth-protected-resource\n",[87,4027,4028,4030,4033,4035],{"class":89,"line":219},[87,4029,3802],{"class":620},[87,4031,4032],{"class":673}," getResourceMetadata",[87,4034,3906],{"class":628},[87,4036,3797],{"class":628},[87,4038,4039,4041],{"class":89,"line":225},[87,4040,3995],{"class":3849},[87,4042,3797],{"class":628},[87,4044,4045,4048,4051,4053,4055,4058,4060,4063,4065,4068],{"class":89,"line":231},[87,4046,4047],{"class":628},"      \"",[87,4049,4050],{"class":673},"authorization_servers",[87,4052,687],{"class":628},[87,4054,677],{"class":628},[87,4056,4057],{"class":673}," [",[87,4059,687],{"class":628},[87,4061,4062],{"class":683},"https://auth.company.com",[87,4064,687],{"class":628},[87,4066,4067],{"class":673},"]",[87,4069,1755],{"class":628},[87,4071,4072,4074,4077,4079,4081,4083,4085,4088,4090,4092,4094,4097,4099,4101,4103,4106,4108,4110],{"class":89,"line":237},[87,4073,4047],{"class":628},[87,4075,4076],{"class":673},"scopes_supported",[87,4078,687],{"class":628},[87,4080,677],{"class":628},[87,4082,4057],{"class":673},[87,4084,687],{"class":628},[87,4086,4087],{"class":683},"mcp:read",[87,4089,687],{"class":628},[87,4091,690],{"class":628},[87,4093,680],{"class":628},[87,4095,4096],{"class":683},"mcp:write",[87,4098,687],{"class":628},[87,4100,690],{"class":628},[87,4102,680],{"class":628},[87,4104,4105],{"class":683},"mcp:admin",[87,4107,687],{"class":628},[87,4109,4067],{"class":673},[87,4111,1755],{"class":628},[87,4113,4114,4116,4119,4121,4123,4125,4127,4130,4132,4134],{"class":89,"line":242},[87,4115,4047],{"class":628},[87,4117,4118],{"class":673},"bearer_methods_supported",[87,4120,687],{"class":628},[87,4122,677],{"class":628},[87,4124,4057],{"class":673},[87,4126,687],{"class":628},[87,4128,4129],{"class":683},"header",[87,4131,687],{"class":628},[87,4133,4067],{"class":673},[87,4135,1755],{"class":628},[87,4137,4138,4140,4143,4145,4147,4149,4152],{"class":89,"line":247},[87,4139,4047],{"class":628},[87,4141,4142],{"class":673},"resource_documentation",[87,4144,687],{"class":628},[87,4146,677],{"class":628},[87,4148,680],{"class":628},[87,4150,4151],{"class":683},"https://docs.company.com/mcp-api",[87,4153,709],{"class":628},[87,4155,4156],{"class":89,"line":253},[87,4157,4158],{"class":628},"    };\n",[87,4160,4161],{"class":89,"line":259},[87,4162,4016],{"class":628},[87,4164,4165],{"class":89,"line":265},[87,4166,1776],{"class":624},[87,4168,4169],{"class":89,"line":271},[87,4170,4171],{"class":693},"  // Gestion de l'en-tête WWW-Authenticate selon la spécification MCP\n",[87,4173,4174,4176,4179,4181,4184,4186,4189,4191],{"class":89,"line":276},[87,4175,3802],{"class":620},[87,4177,4178],{"class":673}," handleUnauthorized",[87,4180,665],{"class":628},[87,4182,4183],{"class":3810},"response",[87,4185,677],{"class":628},[87,4187,4188],{"class":3793}," Response",[87,4190,717],{"class":628},[87,4192,3797],{"class":628},[87,4194,4195,4198,4200,4203,4205,4208],{"class":89,"line":281},[87,4196,4197],{"class":624},"    response",[87,4199,3242],{"class":628},[87,4201,4202],{"class":624},"status",[87,4204,3846],{"class":628},[87,4206,4207],{"class":2888}," 401",[87,4209,642],{"class":628},[87,4211,4212,4214,4216,4219,4221,4224,4226,4228,4230,4232,4234],{"class":89,"line":287},[87,4213,4197],{"class":624},[87,4215,3242],{"class":628},[87,4217,4218],{"class":624},"headers",[87,4220,3242],{"class":628},[87,4222,4223],{"class":635},"set",[87,4225,665],{"class":673},[87,4227,3962],{"class":628},[87,4229,3458],{"class":683},[87,4231,3962],{"class":628},[87,4233,690],{"class":628},[87,4235,3951],{"class":673},[87,4237,4238,4240,4243],{"class":89,"line":293},[87,4239,3956],{"class":628},[87,4241,4242],{"class":683},"Bearer realm=\"MCP Server\", resource_metadata=\"https://mcp.company.com/.well-known/oauth-protected-resource\"",[87,4244,3974],{"class":628},[87,4246,4247,4249],{"class":89,"line":299},[87,4248,3979],{"class":673},[87,4250,642],{"class":628},[87,4252,4253,4255,4257,4259,4261,4263,4265,4267,4270,4272,4274,4277,4280,4282,4284],{"class":89,"line":305},[87,4254,4197],{"class":624},[87,4256,3242],{"class":628},[87,4258,4218],{"class":624},[87,4260,3242],{"class":628},[87,4262,4223],{"class":635},[87,4264,665],{"class":673},[87,4266,3962],{"class":628},[87,4268,4269],{"class":683},"MCP-Protocol-Version",[87,4271,3962],{"class":628},[87,4273,690],{"class":628},[87,4275,4276],{"class":628}," '",[87,4278,4279],{"class":683},"2024-11-05",[87,4281,3962],{"class":628},[87,4283,717],{"class":673},[87,4285,642],{"class":628},[87,4287,4288,4290,4293],{"class":89,"line":310},[87,4289,3995],{"class":3849},[87,4291,4292],{"class":624}," response",[87,4294,642],{"class":628},[87,4296,4297],{"class":89,"line":316},[87,4298,4016],{"class":628},[87,4300,4301],{"class":89,"line":322},[87,4302,4303],{"class":628},"}\n",[458,4305,4307,4313],{"className":4306},[461,462,463],[68,4308,4310],{"id":4309},"types-de-grants-oauth-supportés",[450,4311,4312],{},"Types de Grants OAuth Supportés",[73,4314,4315],{},[471,4316,4317],{"href":473},[450,4318,476],{},[458,4320,4322],{"className":4321},[480],[73,4323,4324],{},"Selon le type de client et le cas d'usage, différents grants OAuth peuvent être utilisés avec cette approche :",[4326,4327,4328,4345],"table",{},[4329,4330,4331],"thead",{},[4332,4333,4334,4340],"tr",{},[4335,4336,4337],"th",{},[450,4338,4339],{},"Type de Grant",[4335,4341,4342],{},[450,4343,4344],{},"Type de Client / Cas d'Usage",[4346,4347,4348,4359,4369,4379,4389],"tbody",{},[4332,4349,4350,4356],{},[4351,4352,4353],"td",{},[450,4354,4355],{},"Authorization Code",[4351,4357,4358],{},"Applications web traditionnelles avec backend et applications natives (mobile/desktop) pour SSO via navigateur système",[4332,4360,4361,4366],{},[4351,4362,4363],{},[450,4364,4365],{},"Client Credentials",[4351,4367,4368],{},"Clients comme services web agissant en leur propre nom",[4332,4370,4371,4376],{},[4351,4372,4373],{},[450,4374,4375],{},"Device Code",[4351,4377,4378],{},"Appareils sans navigateur ou avec saisie contrainte (Smart TV, console média, imprimante, etc.)",[4332,4380,4381,4386],{},[4351,4382,4383],{},[450,4384,4385],{},"Token Exchange",[4351,4387,4388],{},"Applications et services obtenant un token d'accès dans des scénarios de délégation et d'impersonation",[4332,4390,4391,4396],{},[4351,4392,4393],{},[450,4394,4395],{},"JWT Bearer",[4351,4397,4398],{},"Client possédant un JWT d'un domaine de sécurité l'échangeant contre un token OAuth 2.0 dans un autre domaine",[458,4400,4402,4408],{"className":4401},[461,462,463],[68,4403,4405],{"id":4404},"flux-dautorisation-complet",[450,4406,4407],{},"Flux d'Autorisation Complet",[73,4409,4410],{},[471,4411,4412],{"href":473},[450,4413,476],{},[458,4415,4417,4422],{"className":4416},[480],[73,4418,4419],{},[450,4420,4421],{},"Diagramme 2 : Flux d'autorisation OAuth 2.1 complet avec interaction utilisateur",[73,4423,4424],{},"Ce diagramme détaille le processus d'autorisation OAuth 2.1 incluant l'interaction avec l'agent utilisateur (navigateur). Il montre comment un client MCP obtient l'autorisation de l'utilisateur via le navigateur, utilise PKCE pour la sécurité, et échange le code d'autorisation contre un token d'accès pour établir une communication sécurisée avec le serveur MCP.",[77,4426,4428],{"className":79,"code":4427,"language":81,"meta":82,"style":82},"sequenceDiagram\n    participant B as Agent Utilisateur (Navigateur)\n    participant C as Client MCP\n    participant M as Serveur MCP (Serveur de Ressources)\n    participant A as Serveur d'Autorisation\n\n    C->>M: Requête MCP sans token\n    M->>C: HTTP 401 Unauthorized avec en-tête WWW-Authenticate\n    Note over C: Extraire l'URL resource_metadata du WWW-Authenticate\n\n    C->>A: GET /.well-known/oauth-authorization-server\n    A->>C: Réponse métadonnées serveur d'autorisation\n\n    alt Enregistrement client dynamique\n        C->>A: POST /register\n        A->>C: Identifiants Client\n    end\n\n    Note over C: Générer paramètres PKCE\n    C->>B: Ouvrir navigateur avec URL d'autorisation + code_challenge\n    B->>A: Requête d'autorisation\n    Note over A: L'utilisateur autorise\n    A->>B: Redirection vers callback avec code d'autorisation\n    B->>C: Callback code d'autorisation\n    C->>A: Requête token + code_verifier\n    A->>C: Token d'accès (+ token de rafraîchissement)\n    C->>M: Requête MCP avec token d'accès\n    M-->>C: Réponse MCP\n",[84,4429,4430,4434,4439,4443,4447,4451,4455,4459,4464,4469,4473,4477,4482,4486,4491,4496,4501,4505,4509,4514,4519,4524,4529,4534,4539,4544,4549,4553],{"__ignoreMap":82},[87,4431,4432],{"class":89,"line":90},[87,4433,3484],{},[87,4435,4436],{"class":89,"line":96},[87,4437,4438],{},"    participant B as Agent Utilisateur (Navigateur)\n",[87,4440,4441],{"class":89,"line":102},[87,4442,3489],{},[87,4444,4445],{"class":89,"line":108},[87,4446,3494],{},[87,4448,4449],{"class":89,"line":114},[87,4450,3499],{},[87,4452,4453],{"class":89,"line":120},[87,4454,2279],{"emptyLinePlaceholder":2082},[87,4456,4457],{"class":89,"line":126},[87,4458,3508],{},[87,4460,4461],{"class":89,"line":132},[87,4462,4463],{},"    M->>C: HTTP 401 Unauthorized avec en-tête WWW-Authenticate\n",[87,4465,4466],{"class":89,"line":138},[87,4467,4468],{},"    Note over C: Extraire l'URL resource_metadata du WWW-Authenticate\n",[87,4470,4471],{"class":89,"line":144},[87,4472,2279],{"emptyLinePlaceholder":2082},[87,4474,4475],{"class":89,"line":150},[87,4476,3546],{},[87,4478,4479],{"class":89,"line":156},[87,4480,4481],{},"    A->>C: Réponse métadonnées serveur d'autorisation\n",[87,4483,4484],{"class":89,"line":162},[87,4485,2279],{"emptyLinePlaceholder":2082},[87,4487,4488],{"class":89,"line":168},[87,4489,4490],{},"    alt Enregistrement client dynamique\n",[87,4492,4493],{"class":89,"line":173},[87,4494,4495],{},"        C->>A: POST /register\n",[87,4497,4498],{"class":89,"line":178},[87,4499,4500],{},"        A->>C: Identifiants Client\n",[87,4502,4503],{"class":89,"line":184},[87,4504,204],{},[87,4506,4507],{"class":89,"line":190},[87,4508,2279],{"emptyLinePlaceholder":2082},[87,4510,4511],{"class":89,"line":196},[87,4512,4513],{},"    Note over C: Générer paramètres PKCE\n",[87,4515,4516],{"class":89,"line":201},[87,4517,4518],{},"    C->>B: Ouvrir navigateur avec URL d'autorisation + code_challenge\n",[87,4520,4521],{"class":89,"line":207},[87,4522,4523],{},"    B->>A: Requête d'autorisation\n",[87,4525,4526],{"class":89,"line":213},[87,4527,4528],{},"    Note over A: L'utilisateur autorise\n",[87,4530,4531],{"class":89,"line":219},[87,4532,4533],{},"    A->>B: Redirection vers callback avec code d'autorisation\n",[87,4535,4536],{"class":89,"line":225},[87,4537,4538],{},"    B->>C: Callback code d'autorisation\n",[87,4540,4541],{"class":89,"line":231},[87,4542,4543],{},"    C->>A: Requête token + code_verifier\n",[87,4545,4546],{"class":89,"line":237},[87,4547,4548],{},"    A->>C: Token d'accès (+ token de rafraîchissement)\n",[87,4550,4551],{"class":89,"line":242},[87,4552,3583],{},[87,4554,4555],{"class":89,"line":247},[87,4556,3588],{},[458,4558,4560,4566],{"className":4559},[461,462,463],[68,4561,4563],{"id":4562},"considérations-de-sécurité",[450,4564,4565],{},"Considérations de Sécurité",[73,4567,4568],{},[471,4569,4570],{"href":473},[450,4571,476],{},[458,4573,4575,4610],{"className":4574},[3612,3613,3614,3615,3616,3617],[458,4576,4578,4584],{"className":4577},[480],[3622,4579,4581],{"id":4580},"bonnes-pratiques",[450,4582,4583],{},"🔐 Bonnes Pratiques",[491,4585,4586,4592,4598,4604],{},[494,4587,4588,4591],{},[450,4589,4590],{},"PKCE requis"," pour tous les clients et serveurs d'autorisation MCP",[494,4593,4594,4597],{},[450,4595,4596],{},"Stockage sécurisé des tokens"," suivant les meilleures pratiques OAuth 2.0",[494,4599,4600,4603],{},[450,4601,4602],{},"Validation des URI de redirection"," pour prévenir les vulnérabilités de redirection ouverte",[494,4605,4606,4609],{},[450,4607,4608],{},"HTTPS obligatoire"," pour tous les endpoints d'autorisation",[458,4611,4613,4619],{"className":4612},[480],[3622,4614,4616],{"id":4615},"️-gestion-derreurs",[450,4617,4618],{},"⚠️ Gestion d'Erreurs",[4326,4620,4621,4640],{},[4329,4622,4623],{},[4332,4624,4625,4630,4635],{},[4335,4626,4627],{},[450,4628,4629],{},"Code de Statut",[4335,4631,4632],{},[450,4633,4634],{},"Description",[4335,4636,4637],{},[450,4638,4639],{},"Usage",[4346,4641,4642,4655,4668],{},[4332,4643,4644,4649,4652],{},[4351,4645,4646],{},[450,4647,4648],{},"401",[4351,4650,4651],{},"Non autorisé",[4351,4653,4654],{},"Autorisation requise ou token invalide",[4332,4656,4657,4662,4665],{},[4351,4658,4659],{},[450,4660,4661],{},"403",[4351,4663,4664],{},"Interdit",[4351,4666,4667],{},"Scopes invalides ou permissions insuffisantes",[4332,4669,4670,4675,4678],{},[4351,4671,4672],{},[450,4673,4674],{},"400",[4351,4676,4677],{},"Requête incorrecte",[4351,4679,4680],{},"Requête d'autorisation malformée",[458,4682,4684,4690],{"className":4683},[461,462,463],[68,4685,4687],{"id":4686},"impact-sur-lécosystème-mcp",[450,4688,4689],{},"Impact sur l'Écosystème MCP",[73,4691,4692],{},[471,4693,4694],{"href":473},[450,4695,476],{},[458,4697,4699,4705,4710,4719,4732,4738,4743,4779,4784,4811,4817],{"className":4698},[480],[73,4700,4701,4702,4704],{},"Cette approche révolutionnaire simplifie considérablement l'intégration des serveurs d'autorisation, permettant de se connecter directement aux fournisseurs comme ",[450,4703,3764],{}," et autres sans avoir à développer un serveur d'autorisation from scratch.",[73,4706,4707],{},[450,4708,4709],{},"Moins de code boilerplate. Plus de développement. MCP devient plus adapté aux entreprises.",[73,4711,4712,4713,4715,4716],{},"Comme l'a annoncé ",[450,4714,3321],{}," : ",[3461,4717,4718],{},"\"Big thank you to everyone who spent their valuable time providing input, reviewing the PR and waiting patiently while this change was discussed over the past 4 weeks. It was a massive community effort.\"",[73,4720,4721,4722,4728,4729,3242],{},"Cette nouvelle spécification est maintenant disponible dans le ",[450,4723,4724],{},[471,4725,4727],{"href":3448,"rel":4726},[3240],"draft officiel MCP - Section Authorization"," et incluse dans la spécification du ",[450,4730,4731],{},"18 juin 2025",[547,4733,4735],{"id":4734},"exigences-de-la-spécification-mcp",[450,4736,4737],{},"Exigences de la Spécification MCP",[73,4739,4740,4741,1189],{},"Selon la spécification officielle, les serveurs MCP agissant comme serveurs de ressources ",[450,4742,3454],{},[1909,4744,4745,4754,4763,4771],{},[494,4746,4747,3877,4750,717],{},[450,4748,4749],{},"Implémenter OAuth 2.0 Protected Resource Metadata",[471,4751,4753],{"href":3426,"rel":4752},[3240],"RFC9728",[494,4755,4756,3459,4761],{},[450,4757,4758,4759],{},"Utiliser l'en-tête ",[84,4760,3458],{},[3461,4762,3463],{},[494,4764,4765],{},[450,4766,4767,4768],{},"Supporter l'endpoint ",[84,4769,4770],{},"/.well-known/oauth-protected-resource",[494,4772,4773,4778],{},[450,4774,4775,4776],{},"Inclure le champ ",[84,4777,4050],{}," avec au moins un serveur d'autorisation",[73,4780,4781,4782,1189],{},"Les clients MCP ",[450,4783,3454],{},[1909,4785,4786,4794,4803],{},[494,4787,4788,4793],{},[450,4789,4790,4791],{},"Parser les en-têtes ",[84,4792,3458],{}," et répondre aux réponses HTTP 401",[494,4795,4796,3877,4799,717],{},[450,4797,4798],{},"Suivre le protocole OAuth 2.0 Authorization Server Metadata",[471,4800,4802],{"href":3366,"rel":4801},[3240],"RFC8414",[494,4804,4805,4810],{},[450,4806,4807,4808],{},"Inclure l'en-tête ",[84,4809,4269],{}," dans les requêtes",[547,4812,4814],{"id":4813},"mises-à-jour-des-sdks-en-cours",[450,4815,4816],{},"Mises à jour des SDKs en cours :",[491,4818,4819,4829,4839],{},[494,4820,4821,4828],{},[450,4822,4823],{},[471,4824,4827],{"href":4825,"rel":4826},"https://github.com/modelcontextprotocol/python-sdk/pull/686",[3240],"Python SDK"," - Support pour la nouvelle spécification d'autorisation",[494,4830,4831,4838],{},[450,4832,4833],{},[471,4834,4837],{"href":4835,"rel":4836},"https://github.com/modelcontextprotocol/csharp-sdk/pull/377",[3240],"C# SDK"," - Intégration ASP.NET Core native AuthN/AuthZ",[494,4840,4841,4848,4849],{},[450,4842,4843],{},[471,4844,4847],{"href":4845,"rel":4846},"https://github.com/gao-sun/mcp-auth",[3240],"MCP Auth"," - Implémentation de référence par ",[450,4850,3392],{},[77,4852,4856],{"className":4853,"code":4854,"language":4855,"meta":82,"style":82},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Exemple de métadonnées de ressource protégée (RFC 9728)\n{\n  \"authorization_servers\": [\n    \"https://auth.company.com\"\n  ],\n  \"resource_metadata\": {\n    \"resource\": \"https://mcp.company.com\",\n    \"authorization_servers\": [\"https://auth.company.com\"],\n    \"scopes_supported\": [\"mcp:read\", \"mcp:write\", \"mcp:admin\"],\n    \"bearer_methods_supported\": [\"header\"],\n    \"resource_documentation\": \"https://docs.company.com/mcp-api\"\n  }\n}\n","json",[84,4857,4858,4863,4867,4881,4890,4895,4908,4928,4949,4985,5005,5021,5025],{"__ignoreMap":82},[87,4859,4860],{"class":89,"line":90},[87,4861,4862],{"class":693},"// Exemple de métadonnées de ressource protégée (RFC 9728)\n",[87,4864,4865],{"class":89,"line":96},[87,4866,668],{"class":628},[87,4868,4869,4872,4874,4876,4878],{"class":89,"line":102},[87,4870,4871],{"class":628},"  \"",[87,4873,4050],{"class":620},[87,4875,687],{"class":628},[87,4877,677],{"class":628},[87,4879,4880],{"class":628}," [\n",[87,4882,4883,4886,4888],{"class":89,"line":108},[87,4884,4885],{"class":628},"    \"",[87,4887,4062],{"class":683},[87,4889,709],{"class":628},[87,4891,4892],{"class":89,"line":114},[87,4893,4894],{"class":628},"  ],\n",[87,4896,4897,4899,4902,4904,4906],{"class":89,"line":120},[87,4898,4871],{"class":628},[87,4900,4901],{"class":620},"resource_metadata",[87,4903,687],{"class":628},[87,4905,677],{"class":628},[87,4907,3797],{"class":628},[87,4909,4910,4912,4915,4917,4919,4921,4924,4926],{"class":89,"line":126},[87,4911,4885],{"class":628},[87,4913,4914],{"class":3793},"resource",[87,4916,687],{"class":628},[87,4918,677],{"class":628},[87,4920,680],{"class":628},[87,4922,4923],{"class":683},"https://mcp.company.com",[87,4925,687],{"class":628},[87,4927,1755],{"class":628},[87,4929,4930,4932,4934,4936,4938,4940,4942,4944,4946],{"class":89,"line":132},[87,4931,4885],{"class":628},[87,4933,4050],{"class":3793},[87,4935,687],{"class":628},[87,4937,677],{"class":628},[87,4939,4057],{"class":628},[87,4941,687],{"class":628},[87,4943,4062],{"class":683},[87,4945,687],{"class":628},[87,4947,4948],{"class":628},"],\n",[87,4950,4951,4953,4955,4957,4959,4961,4963,4965,4967,4969,4971,4973,4975,4977,4979,4981,4983],{"class":89,"line":138},[87,4952,4885],{"class":628},[87,4954,4076],{"class":3793},[87,4956,687],{"class":628},[87,4958,677],{"class":628},[87,4960,4057],{"class":628},[87,4962,687],{"class":628},[87,4964,4087],{"class":683},[87,4966,687],{"class":628},[87,4968,690],{"class":628},[87,4970,680],{"class":628},[87,4972,4096],{"class":683},[87,4974,687],{"class":628},[87,4976,690],{"class":628},[87,4978,680],{"class":628},[87,4980,4105],{"class":683},[87,4982,687],{"class":628},[87,4984,4948],{"class":628},[87,4986,4987,4989,4991,4993,4995,4997,4999,5001,5003],{"class":89,"line":144},[87,4988,4885],{"class":628},[87,4990,4118],{"class":3793},[87,4992,687],{"class":628},[87,4994,677],{"class":628},[87,4996,4057],{"class":628},[87,4998,687],{"class":628},[87,5000,4129],{"class":683},[87,5002,687],{"class":628},[87,5004,4948],{"class":628},[87,5006,5007,5009,5011,5013,5015,5017,5019],{"class":89,"line":150},[87,5008,4885],{"class":628},[87,5010,4142],{"class":3793},[87,5012,687],{"class":628},[87,5014,677],{"class":628},[87,5016,680],{"class":628},[87,5018,4151],{"class":683},[87,5020,709],{"class":628},[87,5022,5023],{"class":89,"line":156},[87,5024,4016],{"class":628},[87,5026,5027],{"class":89,"line":162},[87,5028,4303],{"class":628},[77,5030,5034],{"className":5031,"code":5032,"language":5033,"meta":82,"style":82},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// En-tête WWW-Authenticate pour découverte (RFC 9728)\nHTTP/1.1 401 Unauthorized\nWWW-Authenticate: Bearer realm=\"MCP Server\",\n                  resource_metadata=\"https://mcp.company.com/.well-known/oauth-protected-resource\"\nMCP-Protocol-Version: 2024-11-05\n","http",[84,5035,5036,5041,5046,5051,5056],{"__ignoreMap":82},[87,5037,5038],{"class":89,"line":90},[87,5039,5040],{},"// En-tête WWW-Authenticate pour découverte (RFC 9728)\n",[87,5042,5043],{"class":89,"line":96},[87,5044,5045],{},"HTTP/1.1 401 Unauthorized\n",[87,5047,5048],{"class":89,"line":102},[87,5049,5050],{},"WWW-Authenticate: Bearer realm=\"MCP Server\",\n",[87,5052,5053],{"class":89,"line":108},[87,5054,5055],{},"                  resource_metadata=\"https://mcp.company.com/.well-known/oauth-protected-resource\"\n",[87,5057,5058],{"class":89,"line":114},[87,5059,5060],{},"MCP-Protocol-Version: 2024-11-05\n",[547,5062,5064],{"id":5063},"flux-de-découverte-officiel-mcp",[450,5065,5066],{},"Flux de Découverte Officiel MCP",[73,5068,3443,5069,5075],{},[450,5070,5071],{},[471,5072,5074],{"href":3448,"rel":5073},[3240],"spécification MCP 2.3.4",", le processus de découverte suit ce flux précis :",[1909,5077,5078,5084,5096,5105,5113,5118,5125,5131],{},[494,5079,5080,5083],{},[450,5081,5082],{},"Client MCP"," fait une requête sans token",[494,5085,5086,5089,5090,5093,5094],{},[450,5087,5088],{},"Serveur MCP"," répond avec ",[84,5091,5092],{},"HTTP 401"," et en-tête ",[84,5095,3458],{},[494,5097,5098,5101,5102,5104],{},[450,5099,5100],{},"Client"," extrait l'URL ",[84,5103,4901],{}," de l'en-tête",[494,5106,5107,5109,5110,5112],{},[450,5108,5100],{}," récupère ",[84,5111,4770],{}," du serveur MCP",[494,5114,5115,5117],{},[450,5116,5100],{}," utilise ces métadonnées pour construire l'URL du serveur d'autorisation",[494,5119,5120,5109,5122],{},[450,5121,5100],{},[84,5123,5124],{},"/.well-known/oauth-authorization-server",[494,5126,5127,5130],{},[450,5128,5129],{},"Flux OAuth 2.1"," standard se déroule",[494,5132,5133,5136],{},[450,5134,5135],{},"Communication MCP"," reprend avec le token valide",[73,5138,5139,5140,5142,5143,5145],{},"Cette approche, validée par ",[450,5141,3392],{}," avec des tests sur ",[450,5144,3396],{},", est maintenant la méthode recommandée dans l'écosystème MCP.",[458,5147,5149,5155],{"className":5148},[461,462,463],[68,5150,5152],{"id":5151},"conclusion",[450,5153,5154],{},"Conclusion",[73,5156,5157],{},[471,5158,5159],{"href":473},[450,5160,476],{},[458,5162,5164,5176,5181,5208,5214,5252,5258,5265,5279],{"className":5163},[480],[73,5165,5166,5167,5169,5170,5172,5173,5175],{},"L'adoption de l'approche ",[450,5168,3420],{}," pour les serveurs MCP marque un tournant décisif dans l'évolution de l'écosystème MCP vers une architecture plus mature et adaptée aux entreprises. Cette nouvelle spécification, fruit d'un effort communautaire de 4 semaines dirigé par ",[450,5171,3321],{}," et validé par ",[450,5174,3392],{},", transforme radicalement la façon dont nous concevons l'authentification et l'autorisation dans MCP.",[73,5177,5178],{},[450,5179,5180],{},"Pourquoi agir maintenant ?",[491,5182,5183,5190,5196,5202],{},[494,5184,5185,5186,5189],{},"✅ ",[450,5187,5188],{},"Spécification officialisée"," dans MCP 2.3.4 (18 juin 2025)",[494,5191,5185,5192,5195],{},[450,5193,5194],{},"SDKs en cours de mise à jour"," (Python, C#, JavaScript)",[494,5197,5185,5198,5201],{},[450,5199,5200],{},"Implémentations de référence disponibles"," (MCP Auth par gao-sun)",[494,5203,5185,5204,5207],{},[450,5205,5206],{},"Support confirmé"," pour Okta, Auth0, Microsoft Entra ID, Keycloak",[547,5209,5211],{"id":5210},"prochaines-étapes-recommandées",[450,5212,5213],{},"🚀 Prochaines Étapes Recommandées",[1909,5215,5216,5227,5237,5243],{},[494,5217,5218,4715,5221,5224,5225],{},[450,5219,5220],{},"Explorez l'implémentation de référence",[471,5222,4847],{"href":4845,"rel":5223},[3240]," par ",[450,5226,3392],{},[494,5228,5229,4715,5232],{},[450,5230,5231],{},"Consultez la spécification officielle",[471,5233,5236],{"href":5234,"rel":5235},"https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/draft/basic/authorization.mdx",[3240],"MCP Authorization Draft",[494,5238,5239,5242],{},[450,5240,5241],{},"Testez avec votre fournisseur d'identité"," existant (Okta, Auth0, etc.)",[494,5244,5245,4715,5248],{},[450,5246,5247],{},"Rejoignez la discussion communautaire",[471,5249,5251],{"href":3325,"rel":5250},[3240],"GitHub Discussions",[547,5253,5255],{"id":5254},"besoin-daide-pour-implémenter-mcp-dans-votre-organisation",[450,5256,5257],{},"💡 Besoin d'Aide pour Implémenter MCP dans Votre Organisation ?",[73,5259,5260,5261,5264],{},"En tant qu'",[450,5262,5263],{},"architecte spécialisé en MCP et OAuth",", je peux vous accompagner dans :",[491,5266,5267,5270,5273,5276],{},[494,5268,5269],{},"Migration vers l'architecture serveur de ressources OAuth",[494,5271,5272],{},"Intégration avec vos systèmes d'identité existants",[494,5274,5275],{},"Formation de vos équipes sur les meilleures pratiques MCP",[494,5277,5278],{},"Audit de sécurité et architecture review",[73,5280,5281],{},[450,5282,5283],{},[471,5284,5285],{"href":2051},"Contactez-moi pour discuter de votre projet MCP →",[458,5287,5289],{"className":5288},[2034,3246,2036,2037],[73,5290,5291],{},[471,5292,5293],{"href":473},[450,5294,476],{},[2056,5296,5297],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":82,"searchDepth":96,"depth":96,"links":5299},[5300,5301,5302,5303,5304,5305,5306,5307,5312],{"id":3338,"depth":96,"text":3341},{"id":3402,"depth":96,"text":3405},{"id":3599,"depth":96,"text":3602},{"id":3728,"depth":96,"text":3731},{"id":4309,"depth":96,"text":4312},{"id":4404,"depth":96,"text":4407},{"id":4562,"depth":96,"text":4565},{"id":4686,"depth":96,"text":4689,"children":5308},[5309,5310,5311],{"id":4734,"depth":102,"text":4737},{"id":4813,"depth":102,"text":4816},{"id":5063,"depth":102,"text":5066},{"id":5151,"depth":96,"text":5154,"children":5313},[5314,5315],{"id":5210,"depth":102,"text":5213},{"id":5254,"depth":102,"text":5257},"2025-06-27","Traiter le serveur MCP comme un serveur de ressources OAuth plutôt qu'un serveur d'autorisation permet une architecture plus simple, sans état et adaptée aux entreprises.",{"src":2080},{},{"title":15,"description":5317},"Fw37KPtU629WGmkjjPlU_Be2Pl4UELIht35YqKmB8iM",1779118049495]