[{"data":1,"prerenderedAt":5573},["ShallowReactive",2],{"navigation_fr":3,"posts_fr:/fr/blog/commercial-architecture-chain":55,"blog-alt-locales:commercial-architecture-chain:fr":2398,"posts_fr:/fr/blog/commercial-architecture-chain:surround":2401},[4],{"title":5,"path":6,"stem":7,"children":8,"page":54},"Fr","/fr","fr",[9],{"title":10,"path":11,"stem":12,"children":13,"page":54},"Blog","/fr/blog","fr/blog",[14,18,22,26,30,34,38,42,46,50],{"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},"Commercial architecture est une chaîne, pas une pricing page","/fr/blog/commercial-architecture-chain","fr/blog/commercial-architecture-chain",{"title":47,"path":48,"stem":49},"Qualité : Comment protéger les Frontends alimentés par l'IA ?","/fr/blog/qa-front","fr/blog/qa-front",{"title":51,"path":52,"stem":53},"Consultation et Stratégie IT","/fr/blog/strategy","fr/blog/strategy",false,{"id":56,"title":43,"authors":57,"badge":64,"body":68,"date":2390,"description":2391,"extension":2392,"image":2393,"meta":2395,"navigation":2113,"path":44,"seo":2396,"stem":45,"__hash__":2397},"posts_fr/fr/blog/commercial-architecture-chain.md",[58],{"name":59,"description":60,"to":61,"avatar":62},"Michael Wybraniec","Conception système, automatisation GenAI & architecture","https://www.linkedin.com/in/one-front/",{"src":63},"https://media.licdn.com/dms/image/v2/D4D03AQEGvIVcrTTS2g/profile-displayphoto-shrink_800_800/B4DZbtSf7LIEAc-/0/1747737772225?e=1753315200&v=beta&t=EOviZQkM396PoGctVjDCdlG8U3vN5UKWiIeNQ8IFUgQ",{"label":65,"color":66,"variant":67},"Architecture, RevOps","primary","soft",{"type":69,"value":70,"toc":2367},"minimark",[71,74,110,132,186,189,204,214,225,231,244,254,446,464,466,481,491,609,622,628,737,749,751,766,776,783,793,818,908,914,920,932,1093,1099,1105,1129,1135,1141,1162,1168,1178,1203,1209,1215,1231,1237,1251,1267,1273,1283,1291,1307,1309,1324,1334,1394,1436,1499,1516,1536,1614,1616,1631,1637,1729,1735,1762,1785,1787,1802,1824,1826,1841,1851,1900,2030,2070,2079,2081,2096,2102,2191,2193,2208,2214,2220,2228,2230,2245,2251,2292,2298,2300,2315,2330,2350,2363],[72,73],"br",{},[75,76,79,88,103],"div",{"className":77},[78],"text-justify",[80,81,82,83,87],"p",{},"La plupart des équipes publient une ",[84,85,86],"strong",{},"pricing page"," et appellent ça monetization. Puis elles ajoutent Stripe. Puis quelqu’un hardcode “Pro gets feature X” dans trois routes API. Puis ops a besoin d’un compte complimentary et quelqu’un ouvre un hotfix. Puis la facture vendor arrive et personne ne sait quel tenant a brûlé la marge.",[80,89,90,91,94,95,98,99,102],{},"Ce pattern est courant parce que le raccourci soft-launch — “pricing + FinOps + growth” — sonne complet. C’est ",[84,92,93],{},"nécessaire mais incomplet",". Un vrai modèle commercial n’est pas un document, une page ou une intégration billing. C’est un ",[84,96,97],{},"system of capabilities"," avec des owners nommés, une séquence claire et un unique product ",[84,100,101],{},"catalog"," comme source of truth.",[80,104,105,106,109],{},"Cet article est ",[84,107,108],{},"project-agnostic"," : une commercial architecture portable qu’une équipe SaaS ou multi-tenant peut réutiliser. Même idée que l’architecture de domaine ailleurs sur ce blog — boundaries first, enforce at the edge, n’invente pas une seconde vérité dans le payment provider.",[75,111,116,123],{"className":112},[113,114,115],"flex","justify-between","items-center",[117,118,120],"h2",{"id":119},"tldr",[84,121,122],{},"TL;DR",[80,124,125],{},[126,127,129],"a",{"href":128},"#top",[84,130,131],{},"⤴",[75,133,135],{"className":134},[78],[136,137,138,146,152,158,169,175],"ul",{},[139,140,141,142,145],"li",{},"Monetization est une ",[84,143,144],{},"chain"," : catalog → agreement → provision → entitlements → meter → bill → cash (+ FinOps cost loop).",[139,147,148,151],{},[84,149,150],{},"One catalog"," alimente pricing, admin, entitlements et billing — jamais une seconde plan list dans le MoR.",[139,153,154,157],{},[84,155,156],{},"Entitlements ≠ feature flags"," ; deny avec un upgrade path clair.",[139,159,160,161,164,165,168],{},"Ship ",[84,162,163],{},"Encode"," (catalog + enforce + gates + admin) avant ",[84,166,167],{},"Charge"," ; legalize avant le premier paiement réel.",[139,170,171,174],{},[84,172,173],{},"Cost ≠ revenue"," — FinOps et pricing sont des ledgers séparés.",[139,176,177,178,181,182,185],{},"Prends le ",[84,179,180],{},"cheat sheet"," et la liste ",[84,183,184],{},"Start Monday"," à la fin.",[187,188],"hr",{},[75,190,192,198],{"className":191},[113,114,115],[117,193,195],{"id":194},"_1-la-chain-ce-que-best-veut-dire",[84,196,197],{},"1. La chain (ce que “best” veut dire)",[80,199,200],{},[126,201,202],{"href":128},[84,203,131],{},[75,205,207],{"className":206},[78],[80,208,209,210,213],{},"Les stacks leaders de billing et entitlements (Stripe Billing / Chargebee-class, couches entitlement + meter, pratique FinOps côté coût) traitent la monetization comme ",[84,211,212],{},"one governed chain",". Le marketing peut commencer par une pricing page. L’architecture commence ici :",[215,216,222],"pre",{"className":217,"code":219,"language":220,"meta":221},[218],"language-text","Catalog (what we sell)\n  → Quote / order / subscription (commercial agreement)\n    → Provisioning (tenant exists)\n      → Entitlements (what runtime may do)\n        → Metering (what was used)\n          → Rating & billing (what we invoice)\n            → Cash & revenue ops (collected, recognized)\n","text","",[223,224,219],"code",{"__ignoreMap":221},[75,226,228],{"className":227},[78],[80,229,230],{},"Chaque flèche est un handoff. Si tu sautes un maillon — billing sans entitlements, ou entitlements sans catalog — l’équipe suivante invente sa propre vérité. Résultat : trois plan lists — site, folklore admin, Stripe.",[75,232,234],{"className":233},[78],[80,235,236,239,240,243],{},[84,237,238],{},"Nuance :"," entitlements et metering ne sont pas seulement left-to-right. Les caps ",[84,241,242],{},"lisent souvent les meters"," (“allow if usage is under the limit”), donc les meters nourrissent entitlements, billing et FinOps. Garde la chain à sept étapes comme récit principal ; le cap check est un feedback edge, pas une excuse pour fusionner “entitle + meter + bill” en un seul blob.",[75,245,247],{"className":246},[78],[80,248,249,250,253],{},"Il y a aussi un ",[84,251,252],{},"parallel cost loop",". Revenue demande “qu’ont-ils payé ?” Cost demande “qu’avons-nous payé pour les servir ?” Confondre les deux, c’est underprice pour toujours ou couper des features dans la panique sans data.",[215,255,259],{"className":256,"code":257,"language":258,"meta":221,"style":221},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nheader: Commercial architecture - revenue chain and FinOps cost loop\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Revenue chain\"\n  - color: \"#F59E0B\"\n    text: \"Cost loop (FinOps)\"\n---\nflowchart TB\n  subgraph Revenue[\"Revenue chain\"]\n    direction LR\n    A[Catalog] --> B[Agreement]\n    B --> C[Provision]\n    C --> D[Entitlements]\n    D --> E[Metering]\n    E --> F[Billing]\n    F --> G[Cash / RevOps]\n    E -.->|caps / fair use| D\n  end\n  subgraph Cost[\"Cost loop (FinOps)\"]\n    direction LR\n    H[Allocate spend] --> I[Unit economics]\n    I --> J[Budgets / kill-switches]\n    J --> K[Price or package change]\n  end\n  E -.-> H\n  K -.-> A\n  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n  class A,B,C,D,E,F,G revenue\n  class H,I,J,K cost\n","mermaid",[223,260,261,269,275,281,287,293,299,305,310,316,322,328,334,340,346,352,358,364,370,376,382,387,393,399,405,410,416,422,428,434,440],{"__ignoreMap":221},[262,263,266],"span",{"class":264,"line":265},"line",1,[262,267,268],{},"---\n",[262,270,272],{"class":264,"line":271},2,[262,273,274],{},"header: Commercial architecture - revenue chain and FinOps cost loop\n",[262,276,278],{"class":264,"line":277},3,[262,279,280],{},"legend:\n",[262,282,284],{"class":264,"line":283},4,[262,285,286],{},"  - color: \"#3B82F6\"\n",[262,288,290],{"class":264,"line":289},5,[262,291,292],{},"    text: \"Revenue chain\"\n",[262,294,296],{"class":264,"line":295},6,[262,297,298],{},"  - color: \"#F59E0B\"\n",[262,300,302],{"class":264,"line":301},7,[262,303,304],{},"    text: \"Cost loop (FinOps)\"\n",[262,306,308],{"class":264,"line":307},8,[262,309,268],{},[262,311,313],{"class":264,"line":312},9,[262,314,315],{},"flowchart TB\n",[262,317,319],{"class":264,"line":318},10,[262,320,321],{},"  subgraph Revenue[\"Revenue chain\"]\n",[262,323,325],{"class":264,"line":324},11,[262,326,327],{},"    direction LR\n",[262,329,331],{"class":264,"line":330},12,[262,332,333],{},"    A[Catalog] --> B[Agreement]\n",[262,335,337],{"class":264,"line":336},13,[262,338,339],{},"    B --> C[Provision]\n",[262,341,343],{"class":264,"line":342},14,[262,344,345],{},"    C --> D[Entitlements]\n",[262,347,349],{"class":264,"line":348},15,[262,350,351],{},"    D --> E[Metering]\n",[262,353,355],{"class":264,"line":354},16,[262,356,357],{},"    E --> F[Billing]\n",[262,359,361],{"class":264,"line":360},17,[262,362,363],{},"    F --> G[Cash / RevOps]\n",[262,365,367],{"class":264,"line":366},18,[262,368,369],{},"    E -.->|caps / fair use| D\n",[262,371,373],{"class":264,"line":372},19,[262,374,375],{},"  end\n",[262,377,379],{"class":264,"line":378},20,[262,380,381],{},"  subgraph Cost[\"Cost loop (FinOps)\"]\n",[262,383,385],{"class":264,"line":384},21,[262,386,327],{},[262,388,390],{"class":264,"line":389},22,[262,391,392],{},"    H[Allocate spend] --> I[Unit economics]\n",[262,394,396],{"class":264,"line":395},23,[262,397,398],{},"    I --> J[Budgets / kill-switches]\n",[262,400,402],{"class":264,"line":401},24,[262,403,404],{},"    J --> K[Price or package change]\n",[262,406,408],{"class":264,"line":407},25,[262,409,375],{},[262,411,413],{"class":264,"line":412},26,[262,414,415],{},"  E -.-> H\n",[262,417,419],{"class":264,"line":418},27,[262,420,421],{},"  K -.-> A\n",[262,423,425],{"class":264,"line":424},28,[262,426,427],{},"  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,429,431],{"class":264,"line":430},29,[262,432,433],{},"  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n",[262,435,437],{"class":264,"line":436},30,[262,438,439],{},"  class A,B,C,D,E,F,G revenue\n",[262,441,443],{"class":264,"line":442},31,[262,444,445],{},"  class H,I,J,K cost\n",[75,447,449],{"className":448},[78],[80,450,451,452,455,456,459,460,463],{},"Les meters alimentent ",[84,453,454],{},"entitlements"," (caps), ",[84,457,458],{},"invoices"," (plus tard) et ",[84,461,462],{},"FinOps"," (toujours). Tu peux meter pour caps et fair use bien avant de charger une carte. Les flèches en pointillés sont du feedback : usage informe allow/deny et cost ; cost informe packaging.",[187,465],{},[75,467,469,475],{"className":468},[113,114,115],[117,470,472],{"id":471},"_2-qui-possède-quoi-actors",[84,473,474],{},"2. Qui possède quoi (actors)",[80,476,477],{},[126,478,479],{"href":128},[84,480,131],{},[75,482,484],{"className":483},[78],[80,485,486,487,490],{},"FinOps n’est qu’",[84,488,489],{},"un"," actor — et seulement côté coût. La chain casse quand tout est déversé sur “pricing”, “billing” ou “engineering will add a flag”. Nomme les owners, même si une personne porte trois hats au début.",[492,493,494,507],"table",{},[495,496,497],"thead",{},[498,499,500,504],"tr",{},[501,502,503],"th",{},"Actor",[501,505,506],{},"Owns in the chain",[508,509,510,521,531,541,551,561,571,585,595],"tbody",{},[498,511,512,518],{},[513,514,515],"td",{},[84,516,517],{},"Product / packaging",[513,519,520],{},"Catalog: plans, SKUs, limits, trials",[498,522,523,528],{},[513,524,525],{},[84,526,527],{},"GTM / growth",[513,529,530],{},"Who may join; invite vs open; soft-launch vs paywall",[498,532,533,538],{},[513,534,535],{},[84,536,537],{},"Platform / engineering",[513,539,540],{},"Provisioning, entitlements at request time, metering events",[498,542,543,548],{},[513,544,545],{},[84,546,547],{},"Ops / admin",[513,549,550],{},"Live overrides, caps, complimentary access, kill-switches + audit",[498,552,553,558],{},[513,554,555],{},[84,556,557],{},"Billing / finance",[513,559,560],{},"Subscriptions, invoices, renewals, revenue recognition",[498,562,563,568],{},[513,564,565],{},[84,566,567],{},"Customer (buyer)",[513,569,570],{},"Plan, usage, invoices (portal)",[498,572,573,577],{},[513,574,575],{},[84,576,462],{},[513,578,579,580,584],{},"What ",[581,582,583],"em",{},"we"," pay; margin; budgets; cost kill-switches",[498,586,587,592],{},[513,588,589],{},[84,590,591],{},"Legal / compliance",[513,593,594],{},"Tax, merchant-of-record vs Connect, entity — before “charge” go-live",[498,596,597,606],{},[513,598,599,602,603],{},[84,600,601],{},"RevOps / CS"," ",[581,604,605],{},"(later)",[513,607,608],{},"Activate, expand, churn, support load",[75,610,612],{"className":611},[78],[80,613,614,617,618,621],{},[84,615,616],{},"RevOps"," aligne sales, marketing et customer success autour du revenue lifecycle — qui possède activation, expansion, renewal et signaux de churn. Ça compte surtout ",[84,619,620],{},"après Charge",". Au début, ce sont souvent des runbooks founder + CS, pas une équipe dédiée ni une surface produit.",[75,623,625],{"className":624},[78],[80,626,627],{},"Deux chemins, même système — ledgers distincts :",[215,629,631],{"className":256,"code":630,"language":258,"meta":221,"style":221},"---\nheader: Actors on revenue vs cost ledgers\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Revenue ledger\"\n  - color: \"#F59E0B\"\n    text: \"Cost ledger\"\n---\nflowchart LR\n  subgraph Rev[\"Revenue ledger\"]\n    direction LR\n    P[Product] --> GTM[GTM] --> PL[Platform] --> OPS[Ops] --> BIL[Billing] --> CU[Customer]\n  end\n  subgraph Cost[\"Cost ledger\"]\n    direction LR\n    U[Usage / infra] --> FO[FinOps] --> FB[Package / price / gates]\n  end\n  PL -.-> U\n  FB -.-> P\n  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n  class P,GTM,PL,OPS,BIL,CU revenue\n  class U,FO,FB cost\n",[223,632,633,637,642,646,650,655,659,664,668,673,678,682,687,691,696,700,705,709,714,719,723,727,732],{"__ignoreMap":221},[262,634,635],{"class":264,"line":265},[262,636,268],{},[262,638,639],{"class":264,"line":271},[262,640,641],{},"header: Actors on revenue vs cost ledgers\n",[262,643,644],{"class":264,"line":277},[262,645,280],{},[262,647,648],{"class":264,"line":283},[262,649,286],{},[262,651,652],{"class":264,"line":289},[262,653,654],{},"    text: \"Revenue ledger\"\n",[262,656,657],{"class":264,"line":295},[262,658,298],{},[262,660,661],{"class":264,"line":301},[262,662,663],{},"    text: \"Cost ledger\"\n",[262,665,666],{"class":264,"line":307},[262,667,268],{},[262,669,670],{"class":264,"line":312},[262,671,672],{},"flowchart LR\n",[262,674,675],{"class":264,"line":318},[262,676,677],{},"  subgraph Rev[\"Revenue ledger\"]\n",[262,679,680],{"class":264,"line":324},[262,681,327],{},[262,683,684],{"class":264,"line":330},[262,685,686],{},"    P[Product] --> GTM[GTM] --> PL[Platform] --> OPS[Ops] --> BIL[Billing] --> CU[Customer]\n",[262,688,689],{"class":264,"line":336},[262,690,375],{},[262,692,693],{"class":264,"line":342},[262,694,695],{},"  subgraph Cost[\"Cost ledger\"]\n",[262,697,698],{"class":264,"line":348},[262,699,327],{},[262,701,702],{"class":264,"line":354},[262,703,704],{},"    U[Usage / infra] --> FO[FinOps] --> FB[Package / price / gates]\n",[262,706,707],{"class":264,"line":360},[262,708,375],{},[262,710,711],{"class":264,"line":366},[262,712,713],{},"  PL -.-> U\n",[262,715,716],{"class":264,"line":372},[262,717,718],{},"  FB -.-> P\n",[262,720,721],{"class":264,"line":378},[262,722,427],{},[262,724,725],{"class":264,"line":384},[262,726,433],{},[262,728,729],{"class":264,"line":389},[262,730,731],{},"  class P,GTM,PL,OPS,BIL,CU revenue\n",[262,733,734],{"class":264,"line":395},[262,735,736],{},"  class U,FO,FB cost\n",[75,738,740],{"className":739},[78],[80,741,742,745,746,748],{},[84,743,744],{},"Pricing / catalog / billing"," vivent sur le revenue ledger. ",[84,747,462],{}," sur le cost ledger. Ni l’un ni l’autre ne remplace l’autre. Quand la margin casse, FinOps informe Product ; quand un tenant dépasse un limit, Platform enforce et Ops peut override — avec audit trail, pas un DM Slack et un deploy oublié.",[187,750],{},[75,752,754,760],{"className":753},[113,114,115],[117,755,757],{"id":756},"_3-hard-rules-et-comment-les-implémenter",[84,758,759],{},"3. Hard rules — et comment les implémenter",[80,761,762],{},[126,763,764],{"href":128},[84,765,131],{},[75,767,769],{"className":768},[78],[80,770,771,772,775],{},"Ces rules font la différence entre “on a du pricing” et “on a une commercial architecture”. Les sauter, c’est reconstruire le même chaos tous les six mois. Sous chaque rule : une ",[84,773,774],{},"strategy"," shippable sans attendre la billing suite parfaite.",[777,778,780],"h3",{"id":779},"_31-one-product-catalog",[84,781,782],{},"3.1 One product catalog",[75,784,786],{"className":785},[78],[80,787,788,789,792],{},"Plans, SKUs, limits et trial rules vivent dans ",[84,790,791],{},"une"," source of truth. Pricing page, admin et billing la lisent tous.",[75,794,796],{"className":795},[78],[80,797,798,801,802,805,806,809,810,813,814,817],{},[84,799,800],{},"Strategy :"," mets le catalog en code versionné ou petite table DB — ",[223,803,804],{},"plan_id",", display name, limits, trial days, module defaults. La ",[223,807,808],{},"/pricing"," publique et le copy i18n ",[84,811,812],{},"importent"," ce modèle ; elles ne redéfinissent pas les tiers. Quand le billing arrive, crée les produits MoR ",[84,815,816],{},"depuis"," les catalog IDs (map 1:1), jamais l’inverse.",[215,819,821],{"className":256,"code":820,"language":258,"meta":221,"style":221},"---\nheader: One catalog as source of truth\nlegend:\n  - color: \"#10B981\"\n    text: \"Catalog SoT\"\n  - color: \"#3B82F6\"\n    text: \"Surfaces that read the catalog\"\n---\nflowchart TB\n  CAT[(Catalog SoT)]\n  CAT --> WEB[Pricing page]\n  CAT --> ADM[Admin console]\n  CAT --> RES[Entitlement resolver]\n  CAT --> MOR[Billing MoR 1:1 SKUs]\n  classDef sot fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n  classDef consumer fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  class CAT sot\n  class WEB,ADM,RES,MOR consumer\n",[223,822,823,827,832,836,841,846,850,855,859,863,868,873,878,883,888,893,898,903],{"__ignoreMap":221},[262,824,825],{"class":264,"line":265},[262,826,268],{},[262,828,829],{"class":264,"line":271},[262,830,831],{},"header: One catalog as source of truth\n",[262,833,834],{"class":264,"line":277},[262,835,280],{},[262,837,838],{"class":264,"line":283},[262,839,840],{},"  - color: \"#10B981\"\n",[262,842,843],{"class":264,"line":289},[262,844,845],{},"    text: \"Catalog SoT\"\n",[262,847,848],{"class":264,"line":295},[262,849,286],{},[262,851,852],{"class":264,"line":301},[262,853,854],{},"    text: \"Surfaces that read the catalog\"\n",[262,856,857],{"class":264,"line":307},[262,858,268],{},[262,860,861],{"class":264,"line":312},[262,862,315],{},[262,864,865],{"class":264,"line":318},[262,866,867],{},"  CAT[(Catalog SoT)]\n",[262,869,870],{"class":264,"line":324},[262,871,872],{},"  CAT --> WEB[Pricing page]\n",[262,874,875],{"class":264,"line":330},[262,876,877],{},"  CAT --> ADM[Admin console]\n",[262,879,880],{"class":264,"line":336},[262,881,882],{},"  CAT --> RES[Entitlement resolver]\n",[262,884,885],{"class":264,"line":342},[262,886,887],{},"  CAT --> MOR[Billing MoR 1:1 SKUs]\n",[262,889,890],{"class":264,"line":348},[262,891,892],{},"  classDef sot fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,894,895],{"class":264,"line":354},[262,896,897],{},"  classDef consumer fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,899,900],{"class":264,"line":360},[262,901,902],{},"  class CAT sot\n",[262,904,905],{"class":264,"line":366},[262,906,907],{},"  class WEB,ADM,RES,MOR consumer\n",[777,909,911],{"id":910},"_32-entitlements-feature-flags",[84,912,913],{},"3.2 Entitlements ≠ feature flags",[75,915,917],{"className":916},[78],[80,918,919],{},"Flags = rollout. Entitlements = vérité commercial + security au request time.",[75,921,923],{"className":922},[78],[80,924,925,927,928,931],{},[84,926,800],{}," un resolver — ",[223,929,930],{},"tenant → plan + overrides → { modules, caps }",". Appelle-le depuis l’API middleware ou une policy layer partagée sur chaque path payant/coûteux. Garde les flags type LaunchDarkly pour “ce code path est-il live ?”, pas pour “ce tenant est-il sur Pro ?”.",[215,933,935],{"className":256,"code":934,"language":258,"meta":221,"style":221},"---\nheader: Feature flags vs entitlement resolver\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Request / resolve inputs\"\n  - color: \"#8B5CF6\"\n    text: \"Decision\"\n  - color: \"#10B981\"\n    text: \"Allow\"\n  - color: \"#EF4444\"\n    text: \"Deny / not shipped\"\n---\nflowchart TD\n  R[API request] --> F{Feature flag: code live?}\n  F -->|No| X[Not shipped]\n  F -->|Yes| V[Entitlement resolver]\n  V --> C[Catalog defaults]\n  V --> O[Tenant overrides]\n  V --> M[Monetization / kill-switch mode]\n  C --> D{Allowed?}\n  O --> D\n  M --> D\n  D -->|Yes| OK[Proceed + meter if needed]\n  D -->|No| DENY[Structured deny + upgrade CTA]\n  classDef ok fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n  classDef deny fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n  classDef decide fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n  classDef input fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  class OK ok\n  class DENY,X deny\n  class F,D decide\n  class R,V,C,O,M input\n",[223,936,937,941,946,950,954,959,964,969,973,978,983,988,992,997,1002,1007,1012,1017,1022,1027,1032,1037,1042,1047,1052,1057,1062,1067,1072,1077,1082,1087],{"__ignoreMap":221},[262,938,939],{"class":264,"line":265},[262,940,268],{},[262,942,943],{"class":264,"line":271},[262,944,945],{},"header: Feature flags vs entitlement resolver\n",[262,947,948],{"class":264,"line":277},[262,949,280],{},[262,951,952],{"class":264,"line":283},[262,953,286],{},[262,955,956],{"class":264,"line":289},[262,957,958],{},"    text: \"Request / resolve inputs\"\n",[262,960,961],{"class":264,"line":295},[262,962,963],{},"  - color: \"#8B5CF6\"\n",[262,965,966],{"class":264,"line":301},[262,967,968],{},"    text: \"Decision\"\n",[262,970,971],{"class":264,"line":307},[262,972,840],{},[262,974,975],{"class":264,"line":312},[262,976,977],{},"    text: \"Allow\"\n",[262,979,980],{"class":264,"line":318},[262,981,982],{},"  - color: \"#EF4444\"\n",[262,984,985],{"class":264,"line":324},[262,986,987],{},"    text: \"Deny / not shipped\"\n",[262,989,990],{"class":264,"line":330},[262,991,268],{},[262,993,994],{"class":264,"line":336},[262,995,996],{},"flowchart TD\n",[262,998,999],{"class":264,"line":342},[262,1000,1001],{},"  R[API request] --> F{Feature flag: code live?}\n",[262,1003,1004],{"class":264,"line":348},[262,1005,1006],{},"  F -->|No| X[Not shipped]\n",[262,1008,1009],{"class":264,"line":354},[262,1010,1011],{},"  F -->|Yes| V[Entitlement resolver]\n",[262,1013,1014],{"class":264,"line":360},[262,1015,1016],{},"  V --> C[Catalog defaults]\n",[262,1018,1019],{"class":264,"line":366},[262,1020,1021],{},"  V --> O[Tenant overrides]\n",[262,1023,1024],{"class":264,"line":372},[262,1025,1026],{},"  V --> M[Monetization / kill-switch mode]\n",[262,1028,1029],{"class":264,"line":378},[262,1030,1031],{},"  C --> D{Allowed?}\n",[262,1033,1034],{"class":264,"line":384},[262,1035,1036],{},"  O --> D\n",[262,1038,1039],{"class":264,"line":389},[262,1040,1041],{},"  M --> D\n",[262,1043,1044],{"class":264,"line":395},[262,1045,1046],{},"  D -->|Yes| OK[Proceed + meter if needed]\n",[262,1048,1049],{"class":264,"line":401},[262,1050,1051],{},"  D -->|No| DENY[Structured deny + upgrade CTA]\n",[262,1053,1054],{"class":264,"line":407},[262,1055,1056],{},"  classDef ok fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,1058,1059],{"class":264,"line":412},[262,1060,1061],{},"  classDef deny fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n",[262,1063,1064],{"class":264,"line":418},[262,1065,1066],{},"  classDef decide fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[262,1068,1069],{"class":264,"line":424},[262,1070,1071],{},"  classDef input fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,1073,1074],{"class":264,"line":430},[262,1075,1076],{},"  class OK ok\n",[262,1078,1079],{"class":264,"line":436},[262,1080,1081],{},"  class DENY,X deny\n",[262,1083,1084],{"class":264,"line":442},[262,1085,1086],{},"  class F,D decide\n",[262,1088,1090],{"class":264,"line":1089},32,[262,1091,1092],{},"  class R,V,C,O,M input\n",[777,1094,1096],{"id":1095},"_33-denied-ux-fait-partie-du-engine",[84,1097,1098],{},"3.3 Denied UX fait partie du engine",[75,1100,1102],{"className":1101},[78],[80,1103,1104],{},"Un échec d’entitlement renvoie un message upgrade / denied clair, jamais un silent fail.",[75,1106,1108],{"className":1107},[78],[80,1109,1110,1112,1113,1115,1116,1115,1119,1115,1122,1115,1125,1128],{},[84,1111,800],{}," deny payload standard — ",[223,1114,223],{},", ",[223,1117,1118],{},"limit",[223,1120,1121],{},"current",[223,1123,1124],{},"upgrade_to",[223,1126,1127],{},"cta_url"," optionnel. L’UI mappe les codes vers le copy (“Storage full — upgrade to Plus”). Log les denials avec tenant + capability pour product/FinOps. Jamais un 403 brut avec body vide.",[777,1130,1132],{"id":1131},"_34-meter-before-you-bill",[84,1133,1134],{},"3.4 Meter before you bill",[75,1136,1138],{"className":1137},[78],[80,1139,1140],{},"Même les produits seat/subscription font du metering pour caps, fair use et FinOps.",[75,1142,1144],{"className":1143},[78],[80,1145,1146,1148,1149,1115,1152,1115,1155,1115,1158,1161],{},[84,1147,800],{}," émets des usage events aux edges qui coûtent (email, storage, AI tokens, maps, outbound sync). Stocke ",[223,1150,1151],{},"tenant_id",[223,1153,1154],{},"metric",[223,1156,1157],{},"quantity",[223,1159,1160],{},"at",". Commence append-only + totaux admin — pas de math d’invoice encore. Les caps liront les mêmes meters plus tard ; le billing les rate plus tard.",[777,1163,1165],{"id":1164},"_35-overrides-sont-first-class",[84,1166,1167],{},"3.5 Overrides sont first-class",[75,1169,1171],{"className":1170},[78],[80,1172,1173,1174,1177],{},"Complimentary access, custom caps, extend trial — avec ",[84,1175,1176],{},"audit",".",[75,1179,1181],{"className":1180},[78],[80,1182,1183,1185,1186,1115,1189,1115,1192,1115,1195,1198,1199,1202],{},[84,1184,800],{}," modèle les overrides comme data sur le tenant — ",[223,1187,1188],{},"plan_override",[223,1190,1191],{},"cap_overrides",[223,1193,1194],{},"complimentary_until",[223,1196,1197],{},"notes",". L’admin UI écrit ; chaque write append ",[223,1200,1201],{},"who / when / what / before / after",". Le resolver merge catalog defaults ← overrides. Pas de hotfix branch pour “donne-leur Plus”.",[777,1204,1206],{"id":1205},"_36-growth-is-gated",[84,1207,1208],{},"3.6 Growth is gated",[75,1210,1212],{"className":1211},[78],[80,1213,1214],{},"Invite vs open, monetization mode, cost kill-switches — sans redeploy.",[75,1216,1218],{"className":1217},[78],[80,1219,1220,1222,1223,1226,1227,1230],{},[84,1221,800],{}," table de global settings (ou config service) — ",[223,1224,1225],{},"registration_mode"," (invite / open), ",[223,1228,1229],{},"monetization_mode"," (soft_launch / trial_enforced / paid_enforced), kill-switches par capability coûteuse. Enforce à la création de tenant et sur les features chères. Defaults = soft-launch d’aujourd’hui ; passer en paid est un settings change, pas un release train.",[777,1232,1234],{"id":1233},"_37-cost-et-revenue-sont-des-ledgers-séparés",[84,1235,1236],{},"3.7 Cost et revenue sont des ledgers séparés",[75,1238,1240],{"className":1239},[78],[80,1241,1242,1243,1246,1247,1250],{},"FinOps (ce que ",[581,1244,1245],{},"nous"," payons) ne remplace jamais Pricing (ce qu’",[581,1248,1249],{},"ils"," paient).",[75,1252,1254],{"className":1253},[78],[80,1255,1256,1258,1259,1262,1263,1266],{},[84,1257,800],{}," deux vues — ",[84,1260,1261],{},"revenue"," (plan, MRR, invoices) et ",[84,1264,1265],{},"cost"," (vendor invoices + usage alloué). Unit economics = cost per tenant vs price per tenant. Quand la margin casse, change package/price ou kill-switch — ne “fixe” pas en prétendant que le cost est une plan feature.",[777,1268,1270],{"id":1269},"_38-legalize-before-charge",[84,1271,1272],{},"3.8 Legalize before charge",[75,1274,1276],{"className":1275},[78],[80,1277,1278,1279,1282],{},"Entity, tax/VAT, MoR vs Connect (ou équivalent) en policy écrite ",[84,1280,1281],{},"avant"," le billing go-live.",[75,1284,1286],{"className":1285},[78],[80,1287,1288,1290],{},[84,1289,800],{}," un go-live memo court — qui vend, qui facture, traitement VAT, MoR vs marketplace Connect, quand les books commencent à reconnaître le revenue. Bloque le checkout production tant que le memo n’existe pas. Product peut finir Encode en parallèle ; Charge attend le memo, pas un théâtre légal parfait pour toujours.",[75,1292,1294],{"className":1293},[78],[80,1295,1296,1299,1300,1303,1304,1306],{},[84,1297,1298],{},"Commercial object (général) :"," souvent le ",[84,1301,1302],{},"tenant / account / workspace"," est le SKU primaire. Les seats peuvent venir plus tard. Forcer “per user” comme seul modèle tôt verrouille le packaging dans une forme qui peut ne pas matcher value (ou cost). ",[84,1305,800],{}," price et entitle le tenant d’abord ; ajoute des seat SKUs quand le cost ou value par seat est prouvé.",[187,1308],{},[75,1310,1312,1318],{"className":1311},[113,114,115],[117,1313,1315],{"id":1314},"_4-capability-map-trois-layers",[84,1316,1317],{},"4. Capability map (trois layers)",[80,1319,1320],{},[126,1321,1322],{"href":128},[84,1323,131],{},[75,1325,1327],{"className":1326},[78],[80,1328,1329,1330,1333],{},"Tu n’as pas besoin de dix product epics le jour un. Tu as besoin de trois layers distincts en ",[84,1331,1332],{},"design",", même si le delivery est compressé.",[492,1335,1336,1349],{},[495,1337,1338],{},[498,1339,1340,1343,1346],{},[501,1341,1342],{},"Layer",[501,1344,1345],{},"Capabilities",[501,1347,1348],{},"Question",[508,1350,1351,1364,1381],{},[498,1352,1353,1358,1361],{},[513,1354,1355],{},[84,1356,1357],{},"Define",[513,1359,1360],{},"Product catalog & packaging",[513,1362,1363],{},"What SKUs/plans exist? Limits? Trial?",[498,1365,1366,1371,1374],{},[513,1367,1368],{},[84,1369,1370],{},"Enforce",[513,1372,1373],{},"Entitlements, growth/policy gates, admin overrides",[513,1375,1376,1377,1380],{},"What may ",[581,1378,1379],{},"this tenant"," do right now? Who may join? Can ops change it live?",[498,1382,1383,1388,1391],{},[513,1384,1385],{},[84,1386,1387],{},"Monetize & operate",[513,1389,1390],{},"Metering, billing, customer portal, FinOps, money-flow/compliance, RevOps",[513,1392,1393],{},"How do we charge, show usage, protect margin, stay legal?",[215,1395,1397],{"className":256,"code":1396,"language":258,"meta":221,"style":221},"---\nheader: Capability layers - Define, Enforce, Monetize\n---\nflowchart TB\n  D[\"1. Define - catalog and packaging\"]\n  E[\"2. Enforce - entitlements, gates, admin\"]\n  M[\"3. Monetize - meter, bill, portal, FinOps\"]\n  D --> E --> M\n",[223,1398,1399,1403,1408,1412,1416,1421,1426,1431],{"__ignoreMap":221},[262,1400,1401],{"class":264,"line":265},[262,1402,268],{},[262,1404,1405],{"class":264,"line":271},[262,1406,1407],{},"header: Capability layers - Define, Enforce, Monetize\n",[262,1409,1410],{"class":264,"line":277},[262,1411,268],{},[262,1413,1414],{"class":264,"line":283},[262,1415,315],{},[262,1417,1418],{"class":264,"line":289},[262,1419,1420],{},"  D[\"1. Define - catalog and packaging\"]\n",[262,1422,1423],{"class":264,"line":295},[262,1424,1425],{},"  E[\"2. Enforce - entitlements, gates, admin\"]\n",[262,1427,1428],{"class":264,"line":301},[262,1429,1430],{},"  M[\"3. Monetize - meter, bill, portal, FinOps\"]\n",[262,1432,1433],{"class":264,"line":307},[262,1434,1435],{},"  D --> E --> M\n",[75,1437,1439,1447,1461,1466,1480,1489],{"className":1438},[78],[80,1440,1441,1443,1444,1446],{},[84,1442,1357],{}," est volontairement ennuyeux : plans et limits versionnables. Si ",[223,1445,808],{}," est un tableau hand-written qui diverge du runtime, tu n’as pas de catalog — tu as du marketing.",[80,1448,1449,1452,1453,1456,1457,1460],{},[84,1450,1451],{},"Define — solution :"," un module ",[223,1454,1455],{},"Catalog"," exporté vers web, API et (plus tard) jobs de sync billing. Snapshot ou version ID à chaque entitlement resolution pour que l’audit sache ",[581,1458,1459],{},"quel"," catalog s’applique.",[80,1462,1463,1465],{},[84,1464,1370],{}," est où la vérité commercial rencontre le request path. Resolve plan → modules/caps allowed → allow ou deny. Soft-launch peut encore vouloir dire “pilots get broad access”, mais via override ou mode explicite — pas “enforcement doesn’t exist yet”.",[80,1467,1468,1471,1472,1475,1476,1479],{},[84,1469,1470],{},"Enforce — solution :"," middleware / policy helper sur chaque route coûteuse ; global growth settings + per-tenant overrides ; pilot = ",[223,1473,1474],{},"complimentary"," ou ",[223,1477,1478],{},"monetization_mode = soft_launch",", pas l’absence de checks.",[80,1481,1482,1484,1485,1488],{},[84,1483,1387],{}," est où vivent money et margin. Ça vient ",[84,1486,1487],{},"après"," Define + Enforce sauf contrainte légale de billing d’abord — et même alors, catalog + entitlements restent le product SoT.",[80,1490,1491,1494,1495,1498],{},[84,1492,1493],{},"Monetize — solution :"," produits MoR clonés depuis catalog IDs ; webhooks mettent à jour ",[223,1496,1497],{},"tenant.plan"," / paid flags ; portal lit le même catalog + meters. FinOps commence en spreadsheet + vendor dashboards ; budgets in-app seulement quand les meters existent.",[75,1500,1502],{"className":1501},[78],[80,1503,1504,1507,1508,1511,1512,1515],{},[84,1505,1506],{},"Sequence rule :"," n’implémente pas billing / portal avant ",[84,1509,1510],{},"Define + Enforce",". La ",[84,1513,1514],{},"legal / money-flow policy"," vient avant le billing go-live. Billing ne doit pas inventer une seconde plan list.",[75,1517,1519],{"className":1518},[78],[80,1520,1521,1524,1525,1528,1529,1532,1533,1177],{},[84,1522,1523],{},"After you charge :"," les subscription webhooks (ou équivalent) sont le SoT du ",[581,1526,1527],{},"paid state"," — ils mettent à jour plan / entitlements. Le billing provider mappe ",[84,1530,1531],{},"1:1 au catalog",". SoT du “ont-ils payé” ; pas SoT de ce qu’un plan ",[581,1534,1535],{},"signifie",[215,1537,1539],{"className":256,"code":1538,"language":258,"meta":221,"style":221},"---\nheader: Checkout - catalog meaning vs MoR paid state\n---\nsequenceDiagram\n  participant Buyer\n  participant App\n  participant MoR as Billing MoR\n  participant Cat as Catalog\n  participant Ent as Entitlements\n  Buyer->>App: Checkout\n  App->>Cat: Resolve plan SKU\n  App->>MoR: Create or confirm subscription\n  MoR-->>App: Webhook paid / renewed / canceled\n  App->>Ent: Update tenant plan from webhook\n  Note over Cat,Ent: MoR equals paid state - Catalog equals plan meaning\n",[223,1540,1541,1545,1550,1554,1559,1564,1569,1574,1579,1584,1589,1594,1599,1604,1609],{"__ignoreMap":221},[262,1542,1543],{"class":264,"line":265},[262,1544,268],{},[262,1546,1547],{"class":264,"line":271},[262,1548,1549],{},"header: Checkout - catalog meaning vs MoR paid state\n",[262,1551,1552],{"class":264,"line":277},[262,1553,268],{},[262,1555,1556],{"class":264,"line":283},[262,1557,1558],{},"sequenceDiagram\n",[262,1560,1561],{"class":264,"line":289},[262,1562,1563],{},"  participant Buyer\n",[262,1565,1566],{"class":264,"line":295},[262,1567,1568],{},"  participant App\n",[262,1570,1571],{"class":264,"line":301},[262,1572,1573],{},"  participant MoR as Billing MoR\n",[262,1575,1576],{"class":264,"line":307},[262,1577,1578],{},"  participant Cat as Catalog\n",[262,1580,1581],{"class":264,"line":312},[262,1582,1583],{},"  participant Ent as Entitlements\n",[262,1585,1586],{"class":264,"line":318},[262,1587,1588],{},"  Buyer->>App: Checkout\n",[262,1590,1591],{"class":264,"line":324},[262,1592,1593],{},"  App->>Cat: Resolve plan SKU\n",[262,1595,1596],{"class":264,"line":330},[262,1597,1598],{},"  App->>MoR: Create or confirm subscription\n",[262,1600,1601],{"class":264,"line":336},[262,1602,1603],{},"  MoR-->>App: Webhook paid / renewed / canceled\n",[262,1605,1606],{"class":264,"line":342},[262,1607,1608],{},"  App->>Ent: Update tenant plan from webhook\n",[262,1610,1611],{"class":264,"line":348},[262,1612,1613],{},"  Note over Cat,Ent: MoR equals paid state - Catalog equals plan meaning\n",[187,1615],{},[75,1617,1619,1625],{"className":1618},[113,114,115],[117,1620,1622],{"id":1621},"_5-anti-patterns-et-le-fix",[84,1623,1624],{},"5. Anti-patterns — et le fix",[80,1626,1627],{},[126,1628,1629],{"href":128},[84,1630,131],{},[75,1632,1634],{"className":1633},[78],[80,1635,1636],{},"Si la chain est la cible, ces raccourcis la cassent. Chaque anti-pattern a un recovery move :",[492,1638,1639,1649],{},[495,1640,1641],{},[498,1642,1643,1646],{},[501,1644,1645],{},"Anti-pattern",[501,1647,1648],{},"Fix",[508,1650,1651,1661,1671,1681,1699,1709,1719],{},[498,1652,1653,1658],{},[513,1654,1655],{},[84,1656,1657],{},"Pricing page as the product",[513,1659,1660],{},"Drive the page from the catalog; delete duplicate hard-coded tiers",[498,1662,1663,1668],{},[513,1664,1665],{},[84,1666,1667],{},"Payment provider as second catalog",[513,1669,1670],{},"MoR SKUs = catalog IDs only; regenerate from catalog, never edit live in the dashboard as SoT",[498,1672,1673,1678],{},[513,1674,1675],{},[84,1676,1677],{},"Feature flags as entitlements",[513,1679,1680],{},"Split: flags for rollout, entitlement resolver for commercial allow/deny",[498,1682,1683,1688],{},[513,1684,1685],{},[84,1686,1687],{},"Hard-coded limits in random routes",[513,1689,1690,1691,1694,1695,1698],{},"Central caps table + one ",[223,1692,1693],{},"assertCap()"," / ",[223,1696,1697],{},"assertModule()"," helper",[498,1700,1701,1706],{},[513,1702,1703],{},[84,1704,1705],{},"Billing before catalog + entitlements",[513,1707,1708],{},"Freeze checkout; finish Encode; then map MoR 1:1",[498,1710,1711,1716],{},[513,1712,1713],{},[84,1714,1715],{},"Silent denial",[513,1717,1718],{},"Structured deny codes + upgrade CTA on API and UI",[498,1720,1721,1726],{},[513,1722,1723],{},[84,1724,1725],{},"Productizing everything early",[513,1727,1728],{},"Keep FinOps/RevOps as runbooks until meters and charge path exist",[75,1730,1732],{"className":1731},[78],[80,1733,1734],{},"Ordre de recovery quand c’est déjà le bordel :",[215,1736,1738],{"className":256,"code":1737,"language":258,"meta":221,"style":221},"---\nheader: Recovery order when commercial architecture is a mess\n---\nflowchart LR\n  A[Extract catalog] --> B[One resolver] --> C[Centralize checks] --> D[Admin overrides] --> E[Webhooks = paid SoT]\n",[223,1739,1740,1744,1749,1753,1757],{"__ignoreMap":221},[262,1741,1742],{"class":264,"line":265},[262,1743,268],{},[262,1745,1746],{"class":264,"line":271},[262,1747,1748],{},"header: Recovery order when commercial architecture is a mess\n",[262,1750,1751],{"class":264,"line":277},[262,1752,268],{},[262,1754,1755],{"class":264,"line":283},[262,1756,672],{},[262,1758,1759],{"class":264,"line":289},[262,1760,1761],{},"  A[Extract catalog] --> B[One resolver] --> C[Centralize checks] --> D[Admin overrides] --> E[Webhooks = paid SoT]\n",[75,1763,1765],{"className":1764},[78],[80,1766,1767,1770,1771,1774,1775,1774,1778,1774,1781,1784],{},[84,1768,1769],{},"Extract"," depuis pricing page et dashboards MoR → ",[84,1772,1773],{},"wire one resolver"," → ",[84,1776,1777],{},"centralise les hard-coded checks",[84,1779,1780],{},"admin overrides",[84,1782,1783],{},"seulement alors"," fais confiance aux webhooks comme paid-state SoT.",[187,1786],{},[75,1788,1790,1796],{"className":1789},[113,114,115],[117,1791,1793],{"id":1792},"_6-ce-que-done-donne-comme-sensation-en-ops",[84,1794,1795],{},"6. Ce que “done” donne comme sensation en ops",[80,1797,1798],{},[126,1799,1800],{"href":128},[84,1801,131],{},[75,1803,1805,1808,1817],{"className":1804},[78],[80,1806,1807],{},"L’architecture reste abstraite tant qu’ops ne peut pas bouger sans engineering.",[80,1809,1810,1811,1813,1814,1816],{},"World-class, ça ressemble à ça : un pilot a besoin de complimentary Plus trente jours — ops flip un flag, pose une expiry, audit log who/why. Spike de vendor cost — quelqu’un toggle un kill-switch sur une intégration chère sans deploy du vendredi soir. Soft-launch se ferme — ",[223,1812,1225],{}," et ",[223,1815,1229],{}," changent, et create-tenant / upgrade paths suivent tout de suite.",[80,1818,1819,1820,1823],{},"Si l’un de ces gestes exige encore un hotfix branch, la chain est incomplète. Admin n’est pas un UI nice-to-have ; c’est comment les ",[84,1821,1822],{},"overrides deviennent first-class"," au lieu d’exceptions tribales.",[187,1825],{},[75,1827,1829,1835],{"className":1828},[113,114,115],[117,1830,1832],{"id":1831},"_7-minimum-path-qui-reste-standard-shaped",[84,1833,1834],{},"7. Minimum path qui reste “standard-shaped”",[80,1836,1837],{},[126,1838,1839],{"href":128},[84,1840,131],{},[75,1842,1844],{"className":1843},[78],[80,1845,1846,1847,1850],{},"La capacité est finie. Tu peux quand même garder des ",[84,1848,1849],{},"boundaries"," en combinant le delivery. L’erreur n’est pas de ship Encode dans un milestone — c’est de ship Encode + Stripe comme un blob indifférencié.",[492,1852,1853,1866],{},[495,1854,1855],{},[498,1856,1857,1860],{},[501,1858,1859],{},"Delivery slice",[501,1861,1862,1863,1865],{},"Keep separate in ",[581,1864,1332],{}," (even if shipped together)",[508,1867,1868,1877,1890],{},[498,1869,1870,1874],{},[513,1871,1872],{},[84,1873,163],{},[513,1875,1876],{},"Catalog + entitlements + growth gates + admin overrides",[498,1878,1879,1883],{},[513,1880,1881],{},[84,1882,167],{},[513,1884,1885,1886,1889],{},"Money-flow / compliance policy ",[84,1887,1888],{},"then"," billing (catalog ↔ subscriptions ↔ entitlements)",[498,1891,1892,1897],{},[513,1893,1894],{},[84,1895,1896],{},"Scale",[513,1898,1899],{},"Metering depth + customer portal (+ optional in-app FinOps)",[215,1901,1903],{"className":256,"code":1902,"language":258,"meta":221,"style":221},"---\nheader: Encode, Charge, Scale delivery path\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Encode\"\n  - color: \"#10B981\"\n    text: \"Charge\"\n  - color: \"#8B5CF6\"\n    text: \"Scale\"\n---\nflowchart LR\n  subgraph Encode\n    A1[Catalog] --- A2[Entitlements] --- A3[Gates] --- A4[Admin]\n  end\n  subgraph Charge\n    B1[Legalize] --> B2[Subscribe] --> B3[Webhooks update plan]\n  end\n  subgraph Scale\n    C1[Meters] --> C2[Portal] --> C3[Optional FinOps UI]\n  end\n  Encode --> Charge --> Scale\n  classDef encode fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  classDef charge fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n  classDef scale fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n  class A1,A2,A3,A4 encode\n  class B1,B2,B3 charge\n  class C1,C2,C3 scale\n",[223,1904,1905,1909,1914,1918,1922,1927,1931,1936,1940,1945,1949,1953,1958,1963,1967,1972,1977,1981,1986,1991,1995,2000,2005,2010,2015,2020,2025],{"__ignoreMap":221},[262,1906,1907],{"class":264,"line":265},[262,1908,268],{},[262,1910,1911],{"class":264,"line":271},[262,1912,1913],{},"header: Encode, Charge, Scale delivery path\n",[262,1915,1916],{"class":264,"line":277},[262,1917,280],{},[262,1919,1920],{"class":264,"line":283},[262,1921,286],{},[262,1923,1924],{"class":264,"line":289},[262,1925,1926],{},"    text: \"Encode\"\n",[262,1928,1929],{"class":264,"line":295},[262,1930,840],{},[262,1932,1933],{"class":264,"line":301},[262,1934,1935],{},"    text: \"Charge\"\n",[262,1937,1938],{"class":264,"line":307},[262,1939,963],{},[262,1941,1942],{"class":264,"line":312},[262,1943,1944],{},"    text: \"Scale\"\n",[262,1946,1947],{"class":264,"line":318},[262,1948,268],{},[262,1950,1951],{"class":264,"line":324},[262,1952,672],{},[262,1954,1955],{"class":264,"line":330},[262,1956,1957],{},"  subgraph Encode\n",[262,1959,1960],{"class":264,"line":336},[262,1961,1962],{},"    A1[Catalog] --- A2[Entitlements] --- A3[Gates] --- A4[Admin]\n",[262,1964,1965],{"class":264,"line":342},[262,1966,375],{},[262,1968,1969],{"class":264,"line":348},[262,1970,1971],{},"  subgraph Charge\n",[262,1973,1974],{"class":264,"line":354},[262,1975,1976],{},"    B1[Legalize] --> B2[Subscribe] --> B3[Webhooks update plan]\n",[262,1978,1979],{"class":264,"line":360},[262,1980,375],{},[262,1982,1983],{"class":264,"line":366},[262,1984,1985],{},"  subgraph Scale\n",[262,1987,1988],{"class":264,"line":372},[262,1989,1990],{},"    C1[Meters] --> C2[Portal] --> C3[Optional FinOps UI]\n",[262,1992,1993],{"class":264,"line":378},[262,1994,375],{},[262,1996,1997],{"class":264,"line":384},[262,1998,1999],{},"  Encode --> Charge --> Scale\n",[262,2001,2002],{"class":264,"line":389},[262,2003,2004],{},"  classDef encode fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,2006,2007],{"class":264,"line":395},[262,2008,2009],{},"  classDef charge fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,2011,2012],{"class":264,"line":401},[262,2013,2014],{},"  classDef scale fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[262,2016,2017],{"class":264,"line":407},[262,2018,2019],{},"  class A1,A2,A3,A4 encode\n",[262,2021,2022],{"class":264,"line":412},[262,2023,2024],{},"  class B1,B2,B3 charge\n",[262,2026,2027],{"class":264,"line":418},[262,2028,2029],{},"  class C1,C2,C3 scale\n",[75,2031,2033,2038,2047,2053,2059,2064],{"className":2032},[78],[80,2034,2035,2037],{},[84,2036,163],{}," est la barre soft-launch qui reste industry-shaped : one catalog, enforce sur le request path, gate growth, ops override avec audit. Tu peux ne pas encore charger — et c’est ok.",[80,2039,2040,2043,2044,2046],{},[84,2041,2042],{},"Encode — playbook :"," (1) catalog model + ",[223,2045,808],{}," branchée, (2) entitlement resolver + tests Free vs Paid vs pilot, (3) global registration/monetization settings, (4) admin plan/override/audit UI. Quatre workstreams dans un milestone si besoin — jamais un blob FR unique.",[80,2048,2049,2052],{},[84,2050,2051],{},"Charge order :"," legalize → subscribe / renew / cancel → webhook updates plan. Jamais “crée les products MoR d’abord et reverse-engineer le catalog après”.",[80,2054,2055,2058],{},[84,2056,2057],{},"Charge — playbook :"," go-live memo → clone catalog into MoR → checkout path → webhooks → UX thin “pay / manage”. Le portal polished attend Scale.",[80,2060,2061,2063],{},[84,2062,1896],{}," : customers voient usage et invoices in-product, meters plus riches, FinOps peut passer des spreadsheets aux alerts. Optional — pas un prerequisite pour encaisser proprement.",[80,2065,2066,2069],{},[84,2067,2068],{},"Scale — playbook :"," deepen meters (admin first) → customer usage + invoices → optional budget alerts liés aux kill-switches.",[75,2071,2073],{"className":2072},[78],[80,2074,2075,2078],{},[84,2076,2077],{},"Parallel ops track (not product) :"," revue mensuelle des vendor bills, discipline de margin sur le first customer, playbooks RevOps en runbooks pendant qu’Encode ships. N’attends pas un FinOps UI in-app pour pratiquer la cost hygiene — et ne confonds pas ces rituels avec la commercial chain.",[187,2080],{},[75,2082,2084,2090],{"className":2083},[113,114,115],[117,2085,2087],{"id":2086},"_8-definition-of-done",[84,2088,2089],{},"8. Definition of done",[80,2091,2092],{},[126,2093,2094],{"href":128},[84,2095,131],{},[75,2097,2099],{"className":2098},[78],[80,2100,2101],{},"Utilise ça comme barre, pas comme vanity checklist. La commercial architecture est “réelle” quand :",[136,2103,2106,2120,2126,2136,2146,2156,2165,2171,2181],{"className":2104},[2105],"contains-task-list",[139,2107,2110,2115,2116,2119],{"className":2108},[2109],"task-list-item",[2111,2112],"input",{"disabled":2113,"type":2114},true,"checkbox"," Changer un plan limit ",[84,2117,2118],{},"n’exige pas"," de chasser des hard-coded checks dans des routes random",[139,2121,2123,2125],{"className":2122},[2109],[2111,2124],{"disabled":2113,"type":2114}," Entitlements denied exposent un upgrade / denied path clair — jamais silent fail",[139,2127,2129,2131,2132,2135],{"className":2128},[2109],[2111,2130],{"disabled":2113,"type":2114}," Ops peut donner complimentary access ou freeze une costly capability ",[84,2133,2134],{},"sans"," deploy",[139,2137,2139,2141,2142,2145],{"className":2138},[2109],[2111,2140],{"disabled":2113,"type":2114}," Pricing page, admin et (plus tard) billing montrent le ",[84,2143,2144],{},"même"," catalog",[139,2147,2149,2151,2152,2155],{"className":2148},[2109],[2111,2150],{"disabled":2113,"type":2114}," Registration / monetization mode / kill-switches sont des ",[84,2153,2154],{},"platform settings",", pas de la mémoire tribale",[139,2157,2159,2161,2162,2164],{"className":2158},[2109],[2111,2160],{"disabled":2113,"type":2114}," Money-flow policy (entity, tax, MoR) existe ",[84,2163,1281],{}," le premier charge réel",[139,2166,2168,2170],{"className":2167},[2109],[2111,2169],{"disabled":2113,"type":2114}," Paid state circule billing events → plan / entitlements (pas de seconde plan list dans le MoR)",[139,2172,2174,2176,2177,2180],{"className":2173},[2109],[2111,2175],{"disabled":2113,"type":2114}," Usage qui coûte de l’argent est ",[84,2178,2179],{},"visible"," avant que l’invoice te surprenne",[139,2182,2184,2186,2187,2190],{"className":2183},[2109],[2111,2185],{"disabled":2113,"type":2114}," Un FinOps soft ceiling peut déclencher un ",[84,2188,2189],{},"kill-switch",", pas seulement une panique Slack",[187,2192],{},[75,2194,2196,2202],{"className":2195},[113,114,115],[117,2197,2199],{"id":2198},"_9-cheat-sheet",[84,2200,2201],{},"9. Cheat sheet",[80,2203,2204],{},[126,2205,2206],{"href":128},[84,2207,131],{},[75,2209,2211],{"className":2210},[78],[80,2212,2213],{},"Screenshot ça. C’est l’article entier sur une card.",[215,2215,2218],{"className":2216,"code":2217,"language":220,"meta":221},[218],"CHAIN\n  Catalog → Agreement → Provision → Entitlements → Meter → Bill → Cash\n  (+ meters → caps / FinOps → package or price)\n\nLAYERS\n  1 Define   catalog & packaging\n  2 Enforce  entitlements · growth gates · admin overrides\n  3 Monetize meter · bill · portal · FinOps · compliance · RevOps\n\nDELIVERY\n  Encode → Charge → Scale\n  (legalize before Charge; meters before fancy FinOps UI)\n\nNEVER\n  · Second catalog in the payment provider\n  · Silent 403 with no upgrade path\n  · Billing before catalog + entitlements\n  · Soft-launch vs paid as tribal memory\n",[223,2219,2217],{"__ignoreMap":221},[75,2221,2223],{"className":2222},[78],[80,2224,2225],{},[581,2226,2227],{},"Une pricing page vend l’histoire. Commercial architecture la rend enforceable.",[187,2229],{},[75,2231,2233,2239],{"className":2232},[113,114,115],[117,2234,2236],{"id":2235},"_10-start-monday",[84,2237,2238],{},"10. Start Monday",[80,2240,2241],{},[126,2242,2243],{"href":128},[84,2244,131],{},[75,2246,2248],{"className":2247},[78],[80,2249,2250],{},"Cinq moves pour démarrer Encode sans attendre Stripe :",[2252,2253,2254,2260,2266,2275,2286],"ol",{},[139,2255,2256,2259],{},[84,2257,2258],{},"Liste chaque hard-coded limit"," — cherche dans les routes les noms de plan, caps et checks “if Pro…” ; mets-les sur une page.",[139,2261,2262,2265],{},[84,2263,2264],{},"Nomme le commercial object"," — tenant / account / workspace (seats plus tard, sauf preuve).",[139,2267,2268,2271,2272,2274],{},[84,2269,2270],{},"Draft catalog IDs"," — Free / Trial / Paid… avec limits et trial rules ; branche ",[223,2273,808],{}," uniquement sur ce modèle.",[139,2276,2277,2280,2281,1115,2283,2285],{},[84,2278,2279],{},"Choisis les knobs"," — ",[223,2282,1225],{},[223,2284,1229],{},", et quelles features chères ont des kill-switches.",[139,2287,2288,2291],{},[84,2289,2290],{},"Nomme qui peut override"," — un ops owner pour complimentary / cap overrides + habitude d’audit log (même un spreadsheet au début).",[75,2293,2295],{"className":2294},[78],[80,2296,2297],{},"Quand ces cinq points sont vrais, tu as le skeleton d’Encode. Charge est une décision plus tard — pas un substitut à ce travail.",[187,2299],{},[75,2301,2303,2309],{"className":2302},[113,114,115],[117,2304,2306],{"id":2305},"_11-clôture",[84,2307,2308],{},"11. Clôture",[80,2310,2311],{},[126,2312,2313],{"href":128},[84,2314,131],{},[75,2316,2318,2321,2327],{"className":2317},[78],[80,2319,2320],{},"Une pricing page vend l’histoire. Stripe (ou tout MoR) déplace l’argent. Aucun des deux n’est l’architecture.",[80,2322,2323,2326],{},[84,2324,2325],{},"Commercial architecture"," est la chain — catalog → agreement → provision → entitlements → meter → bill → cash — plus le cost loop, plus les actors qui possèdent chaque maillon. Construis Define et Enforce avant de célébrer Charge. Garde one catalog. Traite overrides et growth gates comme product, pas comme folklore.",[80,2328,2329],{},"Cette forme marche sur n’importe quel project. Les noms de plans et de providers changeront. La chain ne devrait pas.",[136,2331,2332,2338,2344],{},[139,2333,2334],{},[126,2335,2337],{"href":2336},"/blog/architecture","Explorer Architecture",[139,2339,2340],{},[126,2341,2343],{"href":2342},"/blog/strategy","Explorer Strategy",[139,2345,2346],{},[126,2347,2349],{"href":2348},"/blog/scalability","Explorer Scalability",[75,2351,2357],{"className":2352},[2353,2354,2355,2356],"text-md","text-center","mt-10","font-bold",[80,2358,2359],{},[126,2360,2361],{"href":128},[84,2362,131],{},[2364,2365,2366],"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);}",{"title":221,"searchDepth":271,"depth":271,"links":2368},[2369,2370,2371,2372,2382,2383,2384,2385,2386,2387,2388,2389],{"id":119,"depth":271,"text":122},{"id":194,"depth":271,"text":197},{"id":471,"depth":271,"text":474},{"id":756,"depth":271,"text":759,"children":2373},[2374,2375,2376,2377,2378,2379,2380,2381],{"id":779,"depth":277,"text":782},{"id":910,"depth":277,"text":913},{"id":1095,"depth":277,"text":1098},{"id":1131,"depth":277,"text":1134},{"id":1164,"depth":277,"text":1167},{"id":1205,"depth":277,"text":1208},{"id":1233,"depth":277,"text":1236},{"id":1269,"depth":277,"text":1272},{"id":1314,"depth":271,"text":1317},{"id":1621,"depth":271,"text":1624},{"id":1792,"depth":271,"text":1795},{"id":1831,"depth":271,"text":1834},{"id":2086,"depth":271,"text":2089},{"id":2198,"depth":271,"text":2201},{"id":2235,"depth":271,"text":2238},{"id":2305,"depth":271,"text":2308},"2026-09-19","La monetization est une chaîne gouvernée avec des actors clairs — product, GTM, platform, ops, billing, customer, FinOps, legal — pas une pricing page ni un “ajoute Stripe plus tard”.","md",{"src":2394},"/blog/archi/bff.png",{},{"title":43,"description":2391},"UO21mkUWWaIrHuSYD3IseODhkNRY8rKqGr95P2NJCGc",[2399,2400],"en","es",[2402],{"id":2403,"title":35,"authors":2404,"badge":2407,"body":2410,"date":5566,"description":5567,"extension":2392,"image":5568,"meta":5570,"navigation":2113,"path":36,"seo":5571,"stem":37,"__hash__":5572},"posts_fr/fr/blog/8. mcp-in-chat-demo.md",[2405],{"name":59,"description":60,"to":61,"avatar":2406},{"src":63},{"label":2408,"color":2409,"variant":67},"MCP, E-commerce, Demo","error",{"type":69,"value":2411,"toc":5516},[2412,2425,2440,2456,2460,2475,2479,2511,2515,2599,2603,2616,2620,2658,2662,3121,3136,3142,3146,3308,3314,3318,3529,3534,3538,3718,3723,3727,3919,3924,3939,3945,3949,3955,3960,3966,3970,3975,3979,3985,3989,3994,3998,4004,4019,4025,4029,4278,4282,4285,4335,4339,4701,4707,4722,4728,4732,4764,4768,4774,4778,4881,4896,4902,4906,4920,4924,5024,5028,5031,5051,5055,5058,5084,5099,5105,5109,5140,5144,5215,5219,5245,5260,5266,5270,5348,5352,5355,5387,5402,5408,5412,5444,5448,5451,5482,5485,5487,5492,5513],[75,2413,2415],{"className":2414},[78],[80,2416,2417,2418,2424],{},"Le ",[126,2419,2423],{"href":2420,"rel":2421},"https://github.com/michaelwybraniec/mcp-in-chat",[2422],"nofollow","projet MCP-in-Chat"," représente une démonstration complète et prête pour la production de comment les serveurs du Protocole de Contexte de Modèle (MCP) peuvent transformer les interactions de chatbots e-commerce. Cet exemple complet montre un système de maintenance et de vente de chaudières qui connecte des chatbots IA externes (Claude, ChatGPT, Cursor) à la logique métier réelle à travers une architecture sécurisée et évolutive. Construit en utilisant la méthodologie du Protocole de Flux de Travail Agentique (AWP), ce projet démontre comment créer des serveurs MCP sophistiqués qui connectent l'IA conversationnelle aux systèmes d'entreprise.",[75,2426,2428,2434],{"className":2427},[113,114,115],[117,2429,2431],{"id":2430},"_1-awp-protocole-de-flux-de-travail-agentique",[84,2432,2433],{},"1. AWP - Protocole de Flux de Travail Agentique",[80,2435,2436],{},[126,2437,2438],{"href":128},[84,2439,131],{},[75,2441,2443],{"className":2442},[78],[80,2444,2417,2445,2448,2449,2451,2452,2455],{},[84,2446,2447],{},"Protocole de Flux de Travail Agentique (AWP)"," est une méthodologie de développement agentique créée par ",[84,2450,59],{}," et maintenue par la ",[84,2453,2454],{},"communauté overvibing.com",". Cette approche systématique assure des résultats de développement cohérents et de haute qualité en fournissant des flux de travail structurés qui préviennent la dérive de contexte appelée overvibing et permettent une livraison rapide et fiable de projets tout en évoluant le développement avec l'IA.",[777,2457,2459],{"id":2458},"vidéo-demo","Vidéo Demo",[75,2461,2463],{"className":2462},[2354],[75,2464,2466],{"style":2465},"padding:95.12% 0 0 0;position:relative;",[2467,2468],"iframe",{"src":2469,"frameBorder":2470,"allow":2471,"referrerPolicy":2472,"style":2473,"title":2474},"https://player.vimeo.com/video/1106052609?badge=0&autopause=0&player_id=0&app_id=58479","0","autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share","strict-origin-when-cross-origin","position:absolute;top:0;left:0;width:100%;height:100%;","Agentic Workflow preventing Overvibing.com - #GreenTokens #MCP #VibeCoding",[777,2476,2478],{"id":2477},"résultats-dimplémentation","Résultats d'Implémentation",[136,2480,2481,2487,2493,2499,2505],{},[139,2482,2483,2486],{},[84,2484,2485],{},"Calendrier",": 4 heures (incluant les tâches non planifiées)",[139,2488,2489,2492],{},[84,2490,2491],{},"Portée",": 100% des fonctionnalités planifiées implémentées",[139,2494,2495,2498],{},[84,2496,2497],{},"Qualité",": 100% de succès aux tests",[139,2500,2501,2504],{},[84,2502,2503],{},"Documentation",": Complète et compréhensive",[139,2506,2507,2510],{},[84,2508,2509],{},"Prêt pour Demo",": Entièrement fonctionnel et testé",[777,2512,2514],{"id":2513},"phases-de-développement","Phases de Développement",[2252,2516,2517,2537,2560,2579],{},[139,2518,2519,2522,2523],{},[84,2520,2521],{},"Configuration du Projet et Architecture de Sécurité"," (45 minutes)",[136,2524,2525,2528,2531,2534],{},[139,2526,2527],{},"Initialiser le projet Node.js avec TypeScript",[139,2529,2530],{},"Configurer l'architecture en couches (MCP → API → Services → Base de Données)",[139,2532,2533],{},"Créer des fichiers JSON de données simulées avec contrôles d'accès",[139,2535,2536],{},"Définir les interfaces TypeScript et types de sécurité",[139,2538,2539,2542,2543],{},[84,2540,2541],{},"Développement des Outils MCP Principaux"," (90 minutes)",[136,2544,2545,2548,2551,2554,2557],{},[139,2546,2547],{},"Implémenter l'outil d'information de chaudières avec validation d'API",[139,2549,2550],{},"Implémenter l'outil de planification de maintenance avec contrôles d'accès",[139,2552,2553],{},"Implémenter l'outil d'inventaire avec limitation de débit",[139,2555,2556],{},"Implémenter l'outil d'achat avec validation de transactions",[139,2558,2559],{},"Implémenter l'outil email avec filtrage de contenu",[139,2561,2562,2522,2565],{},[84,2563,2564],{},"Tests et Préparation de Demo",[136,2566,2567,2570,2573,2576],{},[139,2568,2569],{},"Tester le Serveur MCP avec des outils locaux",[139,2571,2572],{},"Créer des instructions de demo pour l'intégration de chatbot",[139,2574,2575],{},"Préparer des flux de conversation d'exemple",[139,2577,2578],{},"Créer README avec instructions de configuration et d'utilisation",[139,2580,2581,2584,2585],{},[84,2582,2583],{},"Intégration de Chatbot Externe"," (60 minutes)",[136,2586,2587,2590,2593,2596],{},[139,2588,2589],{},"Tester le Serveur MCP avec Claude (si disponible)",[139,2591,2592],{},"Tester le Serveur MCP avec ChatGPT (si disponible)",[139,2594,2595],{},"Documenter le processus d'intégration et les résultats",[139,2597,2598],{},"Créer des matériaux de présentation de demo",[777,2600,2602],{"id":2601},"aperçu-du-projet","Aperçu du Projet",[75,2604,2606,2609],{"className":2605},[78],[80,2607,2608],{},"Serveur MCP de Maintenance de Chaudières",[80,2610,2611,2612,2615],{},"Le projet MCP-in-Chat est une ",[84,2613,2614],{},"démonstration complétée avec succès"," qui montre comment les serveurs MCP peuvent s'intégrer avec des chatbots externes pour fournir une valeur commerciale réelle. Le système gère les services de maintenance de chaudières, les informations client, la gestion d'inventaire et le traitement des achats à travers une interface conversationnelle.",[777,2617,2619],{"id":2618},"fonctionnalités-clés","Fonctionnalités Clés",[136,2621,2622,2628,2634,2640,2646,2652],{},[139,2623,2624,2627],{},[84,2625,2626],{},"4 Outils MCP",": Information de chaudières, planification de maintenance, traitement d'achat et confirmation par email",[139,2629,2630,2633],{},[84,2631,2632],{},"4 Endpoints API",": Backend RESTful avec authentification et validation",[139,2635,2636,2639],{},[84,2637,2638],{},"8 Services Simulés",": Simulation complète de logique métier avec données réalistes",[139,2641,2642,2645],{},[84,2643,2644],{},"Intégration Externe",": Prêt pour les tests avec Claude, ChatGPT et Cursor IDE",[139,2647,2648,2651],{},[84,2649,2650],{},"100% Couverture de Tests",": Suite de tests complète avec 100% de succès",[139,2653,2654,2657],{},[84,2655,2656],{},"Prêt pour Production",": Middleware de sécurité, limitation de débit et gestion d'erreurs",[777,2659,2661],{"id":2660},"aperçu-de-larchitecture","Aperçu de l'Architecture",[215,2663,2665],{"className":256,"code":2664,"language":258,"meta":221,"style":221},"---\nheader: MCP-in-Chat System Architecture\nlegend:\n  - color: \"#3B82F6\"\n    text: \"External Systems\"\n  - color: \"#8B5CF6\"\n    text: \"MCP Protocol Layer\"\n  - color: \"#10B981\"\n    text: \"API & Security Layer\"\n  - color: \"#F59E0B\"\n    text: \"Business Services\"\n  - color: \"#EF4444\"\n    text: \"Data Layer\"\n---\ngraph TD\n    subgraph \"External Chatbots\"\n        A[Claude AI]\n        B[ChatGPT]\n        C[Cursor IDE]\n    end\n    \n    subgraph \"MCP Server Layer\"\n        D[MCP Server]\n        E[Boiler Info Tool]\n        F[Maintenance Tool]\n        G[Purchase Tool]\n        H[Email Tool]\n    end\n    \n    subgraph \"Backend API Layer\"\n        I[Express API Server]\n        J[Authentication]\n        K[Validation]\n        L[Rate Limiting]\n    end\n    \n    subgraph \"Business Services\"\n        M[Customer Service]\n        N[Boiler Service]\n        O[Payment Service]\n        P[Email Service]\n    end\n    \n    subgraph \"Mock Data Layer\"\n        Q[Customers JSON]\n        R[Boilers JSON]\n        S[Inventory JSON]\n        T[Orders JSON]\n    end\n    \n    A --> D\n    B --> D\n    C --> D\n    D --> E\n    D --> F\n    D --> G\n    D --> H\n    E --> I\n    F --> I\n    G --> I\n    H --> I\n    I --> J\n    J --> K\n    K --> L\n    L --> M\n    L --> N\n    L --> O\n    L --> P\n    M --> Q\n    N --> R\n    O --> S\n    P --> T\n    \n    classDef external fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n    classDef mcp fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n    classDef api fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n    classDef service fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n    classDef data fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n    \n    class A,B,C external\n    class D,E,F,G,H mcp\n    class I,J,K,L api\n    class M,N,O,P service\n    class Q,R,S,T data\n",[223,2666,2667,2671,2676,2680,2684,2689,2693,2698,2702,2707,2711,2716,2720,2725,2729,2734,2739,2744,2749,2754,2759,2764,2769,2774,2779,2784,2789,2794,2798,2802,2807,2812,2817,2823,2829,2834,2839,2845,2851,2857,2863,2869,2874,2879,2885,2891,2897,2903,2909,2914,2919,2925,2931,2937,2943,2949,2955,2961,2967,2973,2979,2985,2991,2997,3003,3009,3015,3021,3027,3033,3039,3045,3051,3056,3062,3068,3074,3080,3086,3091,3097,3103,3109,3115],{"__ignoreMap":221},[262,2668,2669],{"class":264,"line":265},[262,2670,268],{},[262,2672,2673],{"class":264,"line":271},[262,2674,2675],{},"header: MCP-in-Chat System Architecture\n",[262,2677,2678],{"class":264,"line":277},[262,2679,280],{},[262,2681,2682],{"class":264,"line":283},[262,2683,286],{},[262,2685,2686],{"class":264,"line":289},[262,2687,2688],{},"    text: \"External Systems\"\n",[262,2690,2691],{"class":264,"line":295},[262,2692,963],{},[262,2694,2695],{"class":264,"line":301},[262,2696,2697],{},"    text: \"MCP Protocol Layer\"\n",[262,2699,2700],{"class":264,"line":307},[262,2701,840],{},[262,2703,2704],{"class":264,"line":312},[262,2705,2706],{},"    text: \"API & Security Layer\"\n",[262,2708,2709],{"class":264,"line":318},[262,2710,298],{},[262,2712,2713],{"class":264,"line":324},[262,2714,2715],{},"    text: \"Business Services\"\n",[262,2717,2718],{"class":264,"line":330},[262,2719,982],{},[262,2721,2722],{"class":264,"line":336},[262,2723,2724],{},"    text: \"Data Layer\"\n",[262,2726,2727],{"class":264,"line":342},[262,2728,268],{},[262,2730,2731],{"class":264,"line":348},[262,2732,2733],{},"graph TD\n",[262,2735,2736],{"class":264,"line":354},[262,2737,2738],{},"    subgraph \"External Chatbots\"\n",[262,2740,2741],{"class":264,"line":360},[262,2742,2743],{},"        A[Claude AI]\n",[262,2745,2746],{"class":264,"line":366},[262,2747,2748],{},"        B[ChatGPT]\n",[262,2750,2751],{"class":264,"line":372},[262,2752,2753],{},"        C[Cursor IDE]\n",[262,2755,2756],{"class":264,"line":378},[262,2757,2758],{},"    end\n",[262,2760,2761],{"class":264,"line":384},[262,2762,2763],{},"    \n",[262,2765,2766],{"class":264,"line":389},[262,2767,2768],{},"    subgraph \"MCP Server Layer\"\n",[262,2770,2771],{"class":264,"line":395},[262,2772,2773],{},"        D[MCP Server]\n",[262,2775,2776],{"class":264,"line":401},[262,2777,2778],{},"        E[Boiler Info Tool]\n",[262,2780,2781],{"class":264,"line":407},[262,2782,2783],{},"        F[Maintenance Tool]\n",[262,2785,2786],{"class":264,"line":412},[262,2787,2788],{},"        G[Purchase Tool]\n",[262,2790,2791],{"class":264,"line":418},[262,2792,2793],{},"        H[Email Tool]\n",[262,2795,2796],{"class":264,"line":424},[262,2797,2758],{},[262,2799,2800],{"class":264,"line":430},[262,2801,2763],{},[262,2803,2804],{"class":264,"line":436},[262,2805,2806],{},"    subgraph \"Backend API Layer\"\n",[262,2808,2809],{"class":264,"line":442},[262,2810,2811],{},"        I[Express API Server]\n",[262,2813,2814],{"class":264,"line":1089},[262,2815,2816],{},"        J[Authentication]\n",[262,2818,2820],{"class":264,"line":2819},33,[262,2821,2822],{},"        K[Validation]\n",[262,2824,2826],{"class":264,"line":2825},34,[262,2827,2828],{},"        L[Rate Limiting]\n",[262,2830,2832],{"class":264,"line":2831},35,[262,2833,2758],{},[262,2835,2837],{"class":264,"line":2836},36,[262,2838,2763],{},[262,2840,2842],{"class":264,"line":2841},37,[262,2843,2844],{},"    subgraph \"Business Services\"\n",[262,2846,2848],{"class":264,"line":2847},38,[262,2849,2850],{},"        M[Customer Service]\n",[262,2852,2854],{"class":264,"line":2853},39,[262,2855,2856],{},"        N[Boiler Service]\n",[262,2858,2860],{"class":264,"line":2859},40,[262,2861,2862],{},"        O[Payment Service]\n",[262,2864,2866],{"class":264,"line":2865},41,[262,2867,2868],{},"        P[Email Service]\n",[262,2870,2872],{"class":264,"line":2871},42,[262,2873,2758],{},[262,2875,2877],{"class":264,"line":2876},43,[262,2878,2763],{},[262,2880,2882],{"class":264,"line":2881},44,[262,2883,2884],{},"    subgraph \"Mock Data Layer\"\n",[262,2886,2888],{"class":264,"line":2887},45,[262,2889,2890],{},"        Q[Customers JSON]\n",[262,2892,2894],{"class":264,"line":2893},46,[262,2895,2896],{},"        R[Boilers JSON]\n",[262,2898,2900],{"class":264,"line":2899},47,[262,2901,2902],{},"        S[Inventory JSON]\n",[262,2904,2906],{"class":264,"line":2905},48,[262,2907,2908],{},"        T[Orders JSON]\n",[262,2910,2912],{"class":264,"line":2911},49,[262,2913,2758],{},[262,2915,2917],{"class":264,"line":2916},50,[262,2918,2763],{},[262,2920,2922],{"class":264,"line":2921},51,[262,2923,2924],{},"    A --> D\n",[262,2926,2928],{"class":264,"line":2927},52,[262,2929,2930],{},"    B --> D\n",[262,2932,2934],{"class":264,"line":2933},53,[262,2935,2936],{},"    C --> D\n",[262,2938,2940],{"class":264,"line":2939},54,[262,2941,2942],{},"    D --> E\n",[262,2944,2946],{"class":264,"line":2945},55,[262,2947,2948],{},"    D --> F\n",[262,2950,2952],{"class":264,"line":2951},56,[262,2953,2954],{},"    D --> G\n",[262,2956,2958],{"class":264,"line":2957},57,[262,2959,2960],{},"    D --> H\n",[262,2962,2964],{"class":264,"line":2963},58,[262,2965,2966],{},"    E --> I\n",[262,2968,2970],{"class":264,"line":2969},59,[262,2971,2972],{},"    F --> I\n",[262,2974,2976],{"class":264,"line":2975},60,[262,2977,2978],{},"    G --> I\n",[262,2980,2982],{"class":264,"line":2981},61,[262,2983,2984],{},"    H --> I\n",[262,2986,2988],{"class":264,"line":2987},62,[262,2989,2990],{},"    I --> J\n",[262,2992,2994],{"class":264,"line":2993},63,[262,2995,2996],{},"    J --> K\n",[262,2998,3000],{"class":264,"line":2999},64,[262,3001,3002],{},"    K --> L\n",[262,3004,3006],{"class":264,"line":3005},65,[262,3007,3008],{},"    L --> M\n",[262,3010,3012],{"class":264,"line":3011},66,[262,3013,3014],{},"    L --> N\n",[262,3016,3018],{"class":264,"line":3017},67,[262,3019,3020],{},"    L --> O\n",[262,3022,3024],{"class":264,"line":3023},68,[262,3025,3026],{},"    L --> P\n",[262,3028,3030],{"class":264,"line":3029},69,[262,3031,3032],{},"    M --> Q\n",[262,3034,3036],{"class":264,"line":3035},70,[262,3037,3038],{},"    N --> R\n",[262,3040,3042],{"class":264,"line":3041},71,[262,3043,3044],{},"    O --> S\n",[262,3046,3048],{"class":264,"line":3047},72,[262,3049,3050],{},"    P --> T\n",[262,3052,3054],{"class":264,"line":3053},73,[262,3055,2763],{},[262,3057,3059],{"class":264,"line":3058},74,[262,3060,3061],{},"    classDef external fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,3063,3065],{"class":264,"line":3064},75,[262,3066,3067],{},"    classDef mcp fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[262,3069,3071],{"class":264,"line":3070},76,[262,3072,3073],{},"    classDef api fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,3075,3077],{"class":264,"line":3076},77,[262,3078,3079],{},"    classDef service fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n",[262,3081,3083],{"class":264,"line":3082},78,[262,3084,3085],{},"    classDef data fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n",[262,3087,3089],{"class":264,"line":3088},79,[262,3090,2763],{},[262,3092,3094],{"class":264,"line":3093},80,[262,3095,3096],{},"    class A,B,C external\n",[262,3098,3100],{"class":264,"line":3099},81,[262,3101,3102],{},"    class D,E,F,G,H mcp\n",[262,3104,3106],{"class":264,"line":3105},82,[262,3107,3108],{},"    class I,J,K,L api\n",[262,3110,3112],{"class":264,"line":3111},83,[262,3113,3114],{},"    class M,N,O,P service\n",[262,3116,3118],{"class":264,"line":3117},84,[262,3119,3120],{},"    class Q,R,S,T data\n",[75,3122,3124,3130],{"className":3123},[113,114,115],[117,3125,3127],{"id":3126},"_2-mcp-protocole-de-contexte-de-modèle",[84,3128,3129],{},"2. MCP - Protocole de Contexte de Modèle",[80,3131,3132],{},[126,3133,3134],{"href":128},[84,3135,131],{},[75,3137,3139],{"className":3138},[78],[80,3140,3141],{},"Le serveur MCP expose quatre outils spécialisés qui permettent aux chatbots d'interagir avec le système de maintenance de chaudières. Chaque outil est conçu avec une logique métier spécifique et des contrôles de sécurité.",[777,3143,3145],{"id":3144},"outil-dinformation-de-chaudières","Outil d'Information de Chaudières",[215,3147,3151],{"className":3148,"code":3149,"language":3150,"meta":221,"style":221},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Outil MCP: Obtenir les détails de chaudières du client et informations de garantie\nconst boilerInfoTool = {\n  name: \"boiler-info\",\n  description: \"Obtenir les informations de chaudières du client et détails de garantie\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" }\n    },\n    required: [\"customer_id\"]\n  }\n}\n","typescript",[223,3152,3153,3159,3176,3198,3214,3223,3239,3248,3273,3278,3298,3303],{"__ignoreMap":221},[262,3154,3155],{"class":264,"line":265},[262,3156,3158],{"class":3157},"sHwdD","// Outil MCP: Obtenir les détails de chaudières du client et informations de garantie\n",[262,3160,3161,3165,3169,3173],{"class":264,"line":271},[262,3162,3164],{"class":3163},"spNyl","const",[262,3166,3168],{"class":3167},"sTEyZ"," boilerInfoTool ",[262,3170,3172],{"class":3171},"sMK4o","=",[262,3174,3175],{"class":3171}," {\n",[262,3177,3178,3182,3185,3188,3192,3195],{"class":264,"line":277},[262,3179,3181],{"class":3180},"swJcz","  name",[262,3183,3184],{"class":3171},":",[262,3186,3187],{"class":3171}," \"",[262,3189,3191],{"class":3190},"sfazB","boiler-info",[262,3193,3194],{"class":3171},"\"",[262,3196,3197],{"class":3171},",\n",[262,3199,3200,3203,3205,3207,3210,3212],{"class":264,"line":283},[262,3201,3202],{"class":3180},"  description",[262,3204,3184],{"class":3171},[262,3206,3187],{"class":3171},[262,3208,3209],{"class":3190},"Obtenir les informations de chaudières du client et détails de garantie",[262,3211,3194],{"class":3171},[262,3213,3197],{"class":3171},[262,3215,3216,3219,3221],{"class":264,"line":289},[262,3217,3218],{"class":3180},"  inputSchema",[262,3220,3184],{"class":3171},[262,3222,3175],{"class":3171},[262,3224,3225,3228,3230,3232,3235,3237],{"class":264,"line":295},[262,3226,3227],{"class":3180},"    type",[262,3229,3184],{"class":3171},[262,3231,3187],{"class":3171},[262,3233,3234],{"class":3190},"object",[262,3236,3194],{"class":3171},[262,3238,3197],{"class":3171},[262,3240,3241,3244,3246],{"class":264,"line":301},[262,3242,3243],{"class":3180},"    properties",[262,3245,3184],{"class":3171},[262,3247,3175],{"class":3171},[262,3249,3250,3253,3255,3258,3261,3263,3265,3268,3270],{"class":264,"line":307},[262,3251,3252],{"class":3180},"      customer_id",[262,3254,3184],{"class":3171},[262,3256,3257],{"class":3171}," {",[262,3259,3260],{"class":3180}," type",[262,3262,3184],{"class":3171},[262,3264,3187],{"class":3171},[262,3266,3267],{"class":3190},"string",[262,3269,3194],{"class":3171},[262,3271,3272],{"class":3171}," }\n",[262,3274,3275],{"class":264,"line":312},[262,3276,3277],{"class":3171},"    },\n",[262,3279,3280,3283,3285,3288,3290,3293,3295],{"class":264,"line":318},[262,3281,3282],{"class":3180},"    required",[262,3284,3184],{"class":3171},[262,3286,3287],{"class":3167}," [",[262,3289,3194],{"class":3171},[262,3291,3292],{"class":3190},"customer_id",[262,3294,3194],{"class":3171},[262,3296,3297],{"class":3167},"]\n",[262,3299,3300],{"class":264,"line":324},[262,3301,3302],{"class":3171},"  }\n",[262,3304,3305],{"class":264,"line":330},[262,3306,3307],{"class":3171},"}\n",[80,3309,3310,3313],{},[84,3311,3312],{},"Cas d'Usage",": Quand un client demande \"Quel est le statut de garantie de ma chaudière?\", le chatbot peut récupérer des informations détaillées sur son modèle de chaudière spécifique, date d'installation, couverture de garantie et historique de maintenance.",[777,3315,3317],{"id":3316},"outil-de-planification-de-maintenance","Outil de Planification de Maintenance",[215,3319,3321],{"className":3148,"code":3320,"language":3150,"meta":221,"style":221},"// Outil MCP: Planifier les services de maintenance avec considération météo\nconst maintenanceTool = {\n  name: \"maintenance\",\n  description: \"Planifier les services de maintenance\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" },\n      service_type: { type: \"string\", enum: [\"routine\", \"emergency\"] },\n      preferred_date: { type: \"string\" }\n    },\n    required: [\"customer_id\", \"service_type\"]\n  }\n}\n",[223,3322,3323,3328,3339,3354,3369,3377,3391,3399,3420,3471,3492,3496,3521,3525],{"__ignoreMap":221},[262,3324,3325],{"class":264,"line":265},[262,3326,3327],{"class":3157},"// Outil MCP: Planifier les services de maintenance avec considération météo\n",[262,3329,3330,3332,3335,3337],{"class":264,"line":271},[262,3331,3164],{"class":3163},[262,3333,3334],{"class":3167}," maintenanceTool ",[262,3336,3172],{"class":3171},[262,3338,3175],{"class":3171},[262,3340,3341,3343,3345,3347,3350,3352],{"class":264,"line":277},[262,3342,3181],{"class":3180},[262,3344,3184],{"class":3171},[262,3346,3187],{"class":3171},[262,3348,3349],{"class":3190},"maintenance",[262,3351,3194],{"class":3171},[262,3353,3197],{"class":3171},[262,3355,3356,3358,3360,3362,3365,3367],{"class":264,"line":283},[262,3357,3202],{"class":3180},[262,3359,3184],{"class":3171},[262,3361,3187],{"class":3171},[262,3363,3364],{"class":3190},"Planifier les services de maintenance",[262,3366,3194],{"class":3171},[262,3368,3197],{"class":3171},[262,3370,3371,3373,3375],{"class":264,"line":289},[262,3372,3218],{"class":3180},[262,3374,3184],{"class":3171},[262,3376,3175],{"class":3171},[262,3378,3379,3381,3383,3385,3387,3389],{"class":264,"line":295},[262,3380,3227],{"class":3180},[262,3382,3184],{"class":3171},[262,3384,3187],{"class":3171},[262,3386,3234],{"class":3190},[262,3388,3194],{"class":3171},[262,3390,3197],{"class":3171},[262,3392,3393,3395,3397],{"class":264,"line":301},[262,3394,3243],{"class":3180},[262,3396,3184],{"class":3171},[262,3398,3175],{"class":3171},[262,3400,3401,3403,3405,3407,3409,3411,3413,3415,3417],{"class":264,"line":307},[262,3402,3252],{"class":3180},[262,3404,3184],{"class":3171},[262,3406,3257],{"class":3171},[262,3408,3260],{"class":3180},[262,3410,3184],{"class":3171},[262,3412,3187],{"class":3171},[262,3414,3267],{"class":3190},[262,3416,3194],{"class":3171},[262,3418,3419],{"class":3171}," },\n",[262,3421,3422,3425,3427,3429,3431,3433,3435,3437,3439,3442,3445,3447,3449,3451,3454,3456,3458,3460,3463,3465,3468],{"class":264,"line":312},[262,3423,3424],{"class":3180},"      service_type",[262,3426,3184],{"class":3171},[262,3428,3257],{"class":3171},[262,3430,3260],{"class":3180},[262,3432,3184],{"class":3171},[262,3434,3187],{"class":3171},[262,3436,3267],{"class":3190},[262,3438,3194],{"class":3171},[262,3440,3441],{"class":3171},",",[262,3443,3444],{"class":3180}," enum",[262,3446,3184],{"class":3171},[262,3448,3287],{"class":3167},[262,3450,3194],{"class":3171},[262,3452,3453],{"class":3190},"routine",[262,3455,3194],{"class":3171},[262,3457,3441],{"class":3171},[262,3459,3187],{"class":3171},[262,3461,3462],{"class":3190},"emergency",[262,3464,3194],{"class":3171},[262,3466,3467],{"class":3167},"] ",[262,3469,3470],{"class":3171},"},\n",[262,3472,3473,3476,3478,3480,3482,3484,3486,3488,3490],{"class":264,"line":318},[262,3474,3475],{"class":3180},"      preferred_date",[262,3477,3184],{"class":3171},[262,3479,3257],{"class":3171},[262,3481,3260],{"class":3180},[262,3483,3184],{"class":3171},[262,3485,3187],{"class":3171},[262,3487,3267],{"class":3190},[262,3489,3194],{"class":3171},[262,3491,3272],{"class":3171},[262,3493,3494],{"class":264,"line":324},[262,3495,3277],{"class":3171},[262,3497,3498,3500,3502,3504,3506,3508,3510,3512,3514,3517,3519],{"class":264,"line":330},[262,3499,3282],{"class":3180},[262,3501,3184],{"class":3171},[262,3503,3287],{"class":3167},[262,3505,3194],{"class":3171},[262,3507,3292],{"class":3190},[262,3509,3194],{"class":3171},[262,3511,3441],{"class":3171},[262,3513,3187],{"class":3171},[262,3515,3516],{"class":3190},"service_type",[262,3518,3194],{"class":3171},[262,3520,3297],{"class":3167},[262,3522,3523],{"class":264,"line":336},[262,3524,3302],{"class":3171},[262,3526,3527],{"class":264,"line":342},[262,3528,3307],{"class":3171},[80,3530,3531,3533],{},[84,3532,3312],{},": Les clients peuvent demander la planification de maintenance, et le système considère automatiquement les conditions météorologiques, la disponibilité des techniciens et les préférences client pour réserver des rendez-vous optimaux.",[777,3535,3537],{"id":3536},"outil-de-traitement-dachat","Outil de Traitement d'Achat",[215,3539,3541],{"className":3148,"code":3540,"language":3150,"meta":221,"style":221},"// Outil MCP: Traiter les commandes d'achat de chaudières\nconst purchaseTool = {\n  name: \"purchase\",\n  description: \"Traiter les commandes d'achat de chaudières\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" },\n      boiler_model: { type: \"string\" },\n      installation_date: { type: \"string\" }\n    },\n    required: [\"customer_id\", \"boiler_model\"]\n  }\n}\n",[223,3542,3543,3548,3559,3574,3589,3597,3611,3619,3639,3660,3681,3685,3710,3714],{"__ignoreMap":221},[262,3544,3545],{"class":264,"line":265},[262,3546,3547],{"class":3157},"// Outil MCP: Traiter les commandes d'achat de chaudières\n",[262,3549,3550,3552,3555,3557],{"class":264,"line":271},[262,3551,3164],{"class":3163},[262,3553,3554],{"class":3167}," purchaseTool ",[262,3556,3172],{"class":3171},[262,3558,3175],{"class":3171},[262,3560,3561,3563,3565,3567,3570,3572],{"class":264,"line":277},[262,3562,3181],{"class":3180},[262,3564,3184],{"class":3171},[262,3566,3187],{"class":3171},[262,3568,3569],{"class":3190},"purchase",[262,3571,3194],{"class":3171},[262,3573,3197],{"class":3171},[262,3575,3576,3578,3580,3582,3585,3587],{"class":264,"line":283},[262,3577,3202],{"class":3180},[262,3579,3184],{"class":3171},[262,3581,3187],{"class":3171},[262,3583,3584],{"class":3190},"Traiter les commandes d'achat de chaudières",[262,3586,3194],{"class":3171},[262,3588,3197],{"class":3171},[262,3590,3591,3593,3595],{"class":264,"line":289},[262,3592,3218],{"class":3180},[262,3594,3184],{"class":3171},[262,3596,3175],{"class":3171},[262,3598,3599,3601,3603,3605,3607,3609],{"class":264,"line":295},[262,3600,3227],{"class":3180},[262,3602,3184],{"class":3171},[262,3604,3187],{"class":3171},[262,3606,3234],{"class":3190},[262,3608,3194],{"class":3171},[262,3610,3197],{"class":3171},[262,3612,3613,3615,3617],{"class":264,"line":301},[262,3614,3243],{"class":3180},[262,3616,3184],{"class":3171},[262,3618,3175],{"class":3171},[262,3620,3621,3623,3625,3627,3629,3631,3633,3635,3637],{"class":264,"line":307},[262,3622,3252],{"class":3180},[262,3624,3184],{"class":3171},[262,3626,3257],{"class":3171},[262,3628,3260],{"class":3180},[262,3630,3184],{"class":3171},[262,3632,3187],{"class":3171},[262,3634,3267],{"class":3190},[262,3636,3194],{"class":3171},[262,3638,3419],{"class":3171},[262,3640,3641,3644,3646,3648,3650,3652,3654,3656,3658],{"class":264,"line":312},[262,3642,3643],{"class":3180},"      boiler_model",[262,3645,3184],{"class":3171},[262,3647,3257],{"class":3171},[262,3649,3260],{"class":3180},[262,3651,3184],{"class":3171},[262,3653,3187],{"class":3171},[262,3655,3267],{"class":3190},[262,3657,3194],{"class":3171},[262,3659,3419],{"class":3171},[262,3661,3662,3665,3667,3669,3671,3673,3675,3677,3679],{"class":264,"line":318},[262,3663,3664],{"class":3180},"      installation_date",[262,3666,3184],{"class":3171},[262,3668,3257],{"class":3171},[262,3670,3260],{"class":3180},[262,3672,3184],{"class":3171},[262,3674,3187],{"class":3171},[262,3676,3267],{"class":3190},[262,3678,3194],{"class":3171},[262,3680,3272],{"class":3171},[262,3682,3683],{"class":264,"line":324},[262,3684,3277],{"class":3171},[262,3686,3687,3689,3691,3693,3695,3697,3699,3701,3703,3706,3708],{"class":264,"line":330},[262,3688,3282],{"class":3180},[262,3690,3184],{"class":3171},[262,3692,3287],{"class":3167},[262,3694,3194],{"class":3171},[262,3696,3292],{"class":3190},[262,3698,3194],{"class":3171},[262,3700,3441],{"class":3171},[262,3702,3187],{"class":3171},[262,3704,3705],{"class":3190},"boiler_model",[262,3707,3194],{"class":3171},[262,3709,3297],{"class":3167},[262,3711,3712],{"class":264,"line":336},[262,3713,3302],{"class":3171},[262,3715,3716],{"class":264,"line":342},[262,3717,3307],{"class":3171},[80,3719,3720,3722],{},[84,3721,3312],{},": Quand les clients veulent mettre à niveau leur chaudière, le chatbot peut montrer les modèles disponibles, comparer les spécifications, traiter les paiements et planifier l'installation.",[777,3724,3726],{"id":3725},"outil-de-confirmation-par-email","Outil de Confirmation par Email",[215,3728,3730],{"className":3148,"code":3729,"language":3150,"meta":221,"style":221},"// Outil MCP: Envoyer des emails de confirmation\nconst emailTool = {\n  name: \"email\",\n  description: \"Envoyer des emails de confirmation\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" },\n      email_type: { type: \"string\", enum: [\"maintenance\", \"purchase\", \"reminder\"] }\n    },\n    required: [\"customer_id\", \"email_type\"]\n  }\n}\n",[223,3731,3732,3737,3748,3763,3778,3786,3800,3808,3828,3882,3886,3911,3915],{"__ignoreMap":221},[262,3733,3734],{"class":264,"line":265},[262,3735,3736],{"class":3157},"// Outil MCP: Envoyer des emails de confirmation\n",[262,3738,3739,3741,3744,3746],{"class":264,"line":271},[262,3740,3164],{"class":3163},[262,3742,3743],{"class":3167}," emailTool ",[262,3745,3172],{"class":3171},[262,3747,3175],{"class":3171},[262,3749,3750,3752,3754,3756,3759,3761],{"class":264,"line":277},[262,3751,3181],{"class":3180},[262,3753,3184],{"class":3171},[262,3755,3187],{"class":3171},[262,3757,3758],{"class":3190},"email",[262,3760,3194],{"class":3171},[262,3762,3197],{"class":3171},[262,3764,3765,3767,3769,3771,3774,3776],{"class":264,"line":283},[262,3766,3202],{"class":3180},[262,3768,3184],{"class":3171},[262,3770,3187],{"class":3171},[262,3772,3773],{"class":3190},"Envoyer des emails de confirmation",[262,3775,3194],{"class":3171},[262,3777,3197],{"class":3171},[262,3779,3780,3782,3784],{"class":264,"line":289},[262,3781,3218],{"class":3180},[262,3783,3184],{"class":3171},[262,3785,3175],{"class":3171},[262,3787,3788,3790,3792,3794,3796,3798],{"class":264,"line":295},[262,3789,3227],{"class":3180},[262,3791,3184],{"class":3171},[262,3793,3187],{"class":3171},[262,3795,3234],{"class":3190},[262,3797,3194],{"class":3171},[262,3799,3197],{"class":3171},[262,3801,3802,3804,3806],{"class":264,"line":301},[262,3803,3243],{"class":3180},[262,3805,3184],{"class":3171},[262,3807,3175],{"class":3171},[262,3809,3810,3812,3814,3816,3818,3820,3822,3824,3826],{"class":264,"line":307},[262,3811,3252],{"class":3180},[262,3813,3184],{"class":3171},[262,3815,3257],{"class":3171},[262,3817,3260],{"class":3180},[262,3819,3184],{"class":3171},[262,3821,3187],{"class":3171},[262,3823,3267],{"class":3190},[262,3825,3194],{"class":3171},[262,3827,3419],{"class":3171},[262,3829,3830,3833,3835,3837,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857,3859,3861,3863,3865,3867,3869,3871,3873,3876,3878,3880],{"class":264,"line":312},[262,3831,3832],{"class":3180},"      email_type",[262,3834,3184],{"class":3171},[262,3836,3257],{"class":3171},[262,3838,3260],{"class":3180},[262,3840,3184],{"class":3171},[262,3842,3187],{"class":3171},[262,3844,3267],{"class":3190},[262,3846,3194],{"class":3171},[262,3848,3441],{"class":3171},[262,3850,3444],{"class":3180},[262,3852,3184],{"class":3171},[262,3854,3287],{"class":3167},[262,3856,3194],{"class":3171},[262,3858,3349],{"class":3190},[262,3860,3194],{"class":3171},[262,3862,3441],{"class":3171},[262,3864,3187],{"class":3171},[262,3866,3569],{"class":3190},[262,3868,3194],{"class":3171},[262,3870,3441],{"class":3171},[262,3872,3187],{"class":3171},[262,3874,3875],{"class":3190},"reminder",[262,3877,3194],{"class":3171},[262,3879,3467],{"class":3167},[262,3881,3307],{"class":3171},[262,3883,3884],{"class":264,"line":318},[262,3885,3277],{"class":3171},[262,3887,3888,3890,3892,3894,3896,3898,3900,3902,3904,3907,3909],{"class":264,"line":324},[262,3889,3282],{"class":3180},[262,3891,3184],{"class":3171},[262,3893,3287],{"class":3167},[262,3895,3194],{"class":3171},[262,3897,3292],{"class":3190},[262,3899,3194],{"class":3171},[262,3901,3441],{"class":3171},[262,3903,3187],{"class":3171},[262,3905,3906],{"class":3190},"email_type",[262,3908,3194],{"class":3171},[262,3910,3297],{"class":3167},[262,3912,3913],{"class":264,"line":330},[262,3914,3302],{"class":3171},[262,3916,3917],{"class":264,"line":336},[262,3918,3307],{"class":3171},[80,3920,3921,3923],{},[84,3922,3312],{},": Après toute réservation de service ou achat, le système envoie automatiquement des emails de confirmation appropriés avec des détails pertinents et les prochaines étapes.",[75,3925,3927,3933],{"className":3926},[113,114,115],[117,3928,3930],{"id":3929},"_3-scénarios-de-demo-et-flux",[84,3931,3932],{},"3. Scénarios de Demo et Flux",[80,3934,3935],{},[126,3936,3937],{"href":128},[84,3938,131],{},[75,3940,3942],{"className":3941},[78],[80,3943,3944],{},"Le projet MCP-in-Chat inclut des scénarios de demo complets qui montrent les modèles d'utilisation du monde réel et démontrent les capacités du système.",[777,3946,3948],{"id":3947},"scénario-1-requête-dinformation-de-chaudière","Scénario 1: Requête d'Information de Chaudière",[80,3950,3951,3954],{},[84,3952,3953],{},"Client",": \"Quel est le statut de garantie de ma chaudière?\"",[80,3956,3957,3184],{},[84,3958,3959],{},"Réponse du Chatbot",[215,3961,3964],{"className":3962,"code":3963,"language":220},[218],"Je vais vérifier les informations de votre chaudière immédiatement.\n\nSelon vos dossiers, vous avez une Worcester Bosch 8000 Style installée le 15 mars 2023. \nVotre garantie est valide jusqu'au 15 mars 2028 (garantie fabricant de 5 ans).\n\nDétails clés:\n- Modèle: Worcester Bosch 8000 Style 30kW\n- Date d'Installation: 15 mars 2023\n- Statut de Garantie: Actif (3 ans restants)\n- Dernier Service: 12 janvier 2024\n- Prochain Service: 12 janvier 2025\n\nVoulez-vous que je planifie votre service annuel ou vérifie s'il y a des réclamations de garantie?\n",[223,3965,3963],{"__ignoreMap":221},[777,3967,3969],{"id":3968},"scénario-2-planification-de-maintenance","Scénario 2: Planification de Maintenance",[80,3971,3972,3974],{},[84,3973,3953],{},": \"J'ai besoin de planifier la maintenance de ma chaudière\"",[80,3976,3977,3184],{},[84,3978,3959],{},[215,3980,3983],{"className":3981,"code":3982,"language":220},[218],"Je vais vous aider à planifier la maintenance de votre chaudière. Laissez-moi vérifier votre planning actuel et les créneaux disponibles.\n\nSelon votre localisation et préférences, j'ai trouvé ces rendez-vous disponibles:\n\nSemaine Prochaine:\n- Mardi 21 janvier: 9h00 - 11h00\n- Jeudi 23 janvier: 14h00 - 16h00\n\nLes prévisions météo montrent des conditions claires pour les deux jours. Votre technicien préféré, John Smith (enregistré Gas Safe), est disponible mardi.\n\nJe recommande mardi à 9h00. Le service inclura:\n- Inspection complète du système\n- Vérifications de sécurité\n- Tests d'efficacité\n- Nettoyage des filtres\n\nCoût: £120 (inclut pièces et main d'œuvre)\n\nDois-je réserver ce rendez-vous pour vous?\n",[223,3984,3982],{"__ignoreMap":221},[777,3986,3988],{"id":3987},"scénario-3-achat-de-mise-à-niveau-de-chaudière","Scénario 3: Achat de Mise à Niveau de Chaudière",[80,3990,3991,3993],{},[84,3992,3953],{},": \"Je veux mettre à niveau ma chaudière vers un modèle plus efficace\"",[80,3995,3996,3184],{},[84,3997,3959],{},[215,3999,4002],{"className":4000,"code":4001,"language":220},[218],"Excellent choix! Laissez-moi vous montrer les modèles les plus efficaces disponibles et vous aider avec la mise à niveau.\n\nChaudières Haute Efficacité Disponibles:\n\n1. **Worcester Bosch 8000 Style** (Classe A)\n   - Efficacité: 94%\n   - Prix: £2,800\n   - Garantie 10 ans\n   - Thermostat intelligent inclus\n\n2. **Vaillant ecoTEC plus** (Classe A)\n   - Efficacité: 92%\n   - Prix: £2,600\n   - Garantie 7 ans\n   - Design compact\n\n3. **Ideal Logic+** (Classe A)\n   - Efficacité: 90%\n   - Prix: £2,200\n   - Garantie 10 ans\n   - Certifié Quiet Mark\n\nBasé sur votre système actuel, je recommande la Worcester Bosch 8000 Style pour une efficacité et fiabilité maximales.\n\nVoulez-vous que je:\n1. Montre les spécifications détaillées\n2. Vérifie la disponibilité d'installation\n3. Traite l'achat\n4. Compare avec votre chaudière actuelle\n",[223,4003,4001],{"__ignoreMap":221},[75,4005,4007,4013],{"className":4006},[113,114,115],[117,4008,4010],{"id":4009},"_4-spécifications-techniques",[84,4011,4012],{},"4. Spécifications Techniques",[80,4014,4015],{},[126,4016,4017],{"href":128},[84,4018,131],{},[75,4020,4022],{"className":4021},[78],[80,4023,4024],{},"Le projet MCP-in-Chat implémente une architecture sophistiquée en couches qui assure la sécurité, l'évolutivité et la maintenabilité.",[777,4026,4028],{"id":4027},"architecture-de-sécurité","Architecture de Sécurité",[215,4030,4032],{"className":256,"code":4031,"language":258,"meta":221,"style":221},"---\nheader: MCP Security Flow and Authentication\n---\nsequenceDiagram\n    participant Chatbot as External Chatbot\n    participant MCP as MCP Server\n    participant API as Backend API\n    participant Auth as Authentication\n    participant Service as Business Service\n    participant DB as Mock Database\n    \n    rect rgb(59, 130, 246)\n    note right of Chatbot: External Systems\n    Chatbot->>+MCP: Request with customer_id\n    end\n    \n    rect rgb(139, 92, 246)\n    note right of MCP: MCP Protocol Layer\n    MCP->>+API: API call with validation\n    end\n    \n    rect rgb(16, 185, 129)\n    note right of API: Security & API Layer\n    API->>+Auth: Verify authentication\n    Auth-->>-API: Authentication result\n    end\n    \n    rect rgb(245, 158, 11)\n    note right of Service: Business Logic Layer\n    API->>+Service: Process business logic\n    Service->>+DB: Query with access controls\n    end\n    \n    rect rgb(239, 68, 68)\n    note right of DB: Data Storage Layer\n    DB-->>-Service: Return filtered data\n    end\n    \n    rect rgb(245, 158, 11)\n    note right of Service: Business Logic Layer\n    Service-->>-API: Processed response\n    end\n    \n    rect rgb(16, 185, 129)\n    note right of API: Security & API Layer\n    API-->>-MCP: API response\n    end\n    \n    rect rgb(139, 92, 246)\n    note right of MCP: MCP Protocol Layer\n    MCP-->>-Chatbot: Formatted result\n    end\n    \n    Note over Chatbot,DB: Secure communication flow with\u003Cbr/>authentication at each layer\n",[223,4033,4034,4038,4043,4047,4051,4056,4061,4066,4071,4076,4081,4085,4090,4095,4100,4104,4108,4113,4118,4123,4127,4131,4136,4141,4146,4151,4155,4159,4164,4169,4174,4179,4183,4187,4192,4197,4202,4206,4210,4214,4218,4223,4227,4231,4235,4239,4244,4248,4252,4256,4260,4265,4269,4273],{"__ignoreMap":221},[262,4035,4036],{"class":264,"line":265},[262,4037,268],{},[262,4039,4040],{"class":264,"line":271},[262,4041,4042],{},"header: MCP Security Flow and Authentication\n",[262,4044,4045],{"class":264,"line":277},[262,4046,268],{},[262,4048,4049],{"class":264,"line":283},[262,4050,1558],{},[262,4052,4053],{"class":264,"line":289},[262,4054,4055],{},"    participant Chatbot as External Chatbot\n",[262,4057,4058],{"class":264,"line":295},[262,4059,4060],{},"    participant MCP as MCP Server\n",[262,4062,4063],{"class":264,"line":301},[262,4064,4065],{},"    participant API as Backend API\n",[262,4067,4068],{"class":264,"line":307},[262,4069,4070],{},"    participant Auth as Authentication\n",[262,4072,4073],{"class":264,"line":312},[262,4074,4075],{},"    participant Service as Business Service\n",[262,4077,4078],{"class":264,"line":318},[262,4079,4080],{},"    participant DB as Mock Database\n",[262,4082,4083],{"class":264,"line":324},[262,4084,2763],{},[262,4086,4087],{"class":264,"line":330},[262,4088,4089],{},"    rect rgb(59, 130, 246)\n",[262,4091,4092],{"class":264,"line":336},[262,4093,4094],{},"    note right of Chatbot: External Systems\n",[262,4096,4097],{"class":264,"line":342},[262,4098,4099],{},"    Chatbot->>+MCP: Request with customer_id\n",[262,4101,4102],{"class":264,"line":348},[262,4103,2758],{},[262,4105,4106],{"class":264,"line":354},[262,4107,2763],{},[262,4109,4110],{"class":264,"line":360},[262,4111,4112],{},"    rect rgb(139, 92, 246)\n",[262,4114,4115],{"class":264,"line":366},[262,4116,4117],{},"    note right of MCP: MCP Protocol Layer\n",[262,4119,4120],{"class":264,"line":372},[262,4121,4122],{},"    MCP->>+API: API call with validation\n",[262,4124,4125],{"class":264,"line":378},[262,4126,2758],{},[262,4128,4129],{"class":264,"line":384},[262,4130,2763],{},[262,4132,4133],{"class":264,"line":389},[262,4134,4135],{},"    rect rgb(16, 185, 129)\n",[262,4137,4138],{"class":264,"line":395},[262,4139,4140],{},"    note right of API: Security & API Layer\n",[262,4142,4143],{"class":264,"line":401},[262,4144,4145],{},"    API->>+Auth: Verify authentication\n",[262,4147,4148],{"class":264,"line":407},[262,4149,4150],{},"    Auth-->>-API: Authentication result\n",[262,4152,4153],{"class":264,"line":412},[262,4154,2758],{},[262,4156,4157],{"class":264,"line":418},[262,4158,2763],{},[262,4160,4161],{"class":264,"line":424},[262,4162,4163],{},"    rect rgb(245, 158, 11)\n",[262,4165,4166],{"class":264,"line":430},[262,4167,4168],{},"    note right of Service: Business Logic Layer\n",[262,4170,4171],{"class":264,"line":436},[262,4172,4173],{},"    API->>+Service: Process business logic\n",[262,4175,4176],{"class":264,"line":442},[262,4177,4178],{},"    Service->>+DB: Query with access controls\n",[262,4180,4181],{"class":264,"line":1089},[262,4182,2758],{},[262,4184,4185],{"class":264,"line":2819},[262,4186,2763],{},[262,4188,4189],{"class":264,"line":2825},[262,4190,4191],{},"    rect rgb(239, 68, 68)\n",[262,4193,4194],{"class":264,"line":2831},[262,4195,4196],{},"    note right of DB: Data Storage Layer\n",[262,4198,4199],{"class":264,"line":2836},[262,4200,4201],{},"    DB-->>-Service: Return filtered data\n",[262,4203,4204],{"class":264,"line":2841},[262,4205,2758],{},[262,4207,4208],{"class":264,"line":2847},[262,4209,2763],{},[262,4211,4212],{"class":264,"line":2853},[262,4213,4163],{},[262,4215,4216],{"class":264,"line":2859},[262,4217,4168],{},[262,4219,4220],{"class":264,"line":2865},[262,4221,4222],{},"    Service-->>-API: Processed response\n",[262,4224,4225],{"class":264,"line":2871},[262,4226,2758],{},[262,4228,4229],{"class":264,"line":2876},[262,4230,2763],{},[262,4232,4233],{"class":264,"line":2881},[262,4234,4135],{},[262,4236,4237],{"class":264,"line":2887},[262,4238,4140],{},[262,4240,4241],{"class":264,"line":2893},[262,4242,4243],{},"    API-->>-MCP: API response\n",[262,4245,4246],{"class":264,"line":2899},[262,4247,2758],{},[262,4249,4250],{"class":264,"line":2905},[262,4251,2763],{},[262,4253,4254],{"class":264,"line":2911},[262,4255,4112],{},[262,4257,4258],{"class":264,"line":2916},[262,4259,4117],{},[262,4261,4262],{"class":264,"line":2921},[262,4263,4264],{},"    MCP-->>-Chatbot: Formatted result\n",[262,4266,4267],{"class":264,"line":2927},[262,4268,2758],{},[262,4270,4271],{"class":264,"line":2933},[262,4272,2763],{},[262,4274,4275],{"class":264,"line":2939},[262,4276,4277],{},"    Note over Chatbot,DB: Secure communication flow with\u003Cbr/>authentication at each layer\n",[777,4279,4281],{"id":4280},"implémentation-des-services-simulés","Implémentation des Services Simulés",[80,4283,4284],{},"Le projet inclut 8 services simulés complets qui simulent des opérations métier réelles:",[2252,4286,4287,4293,4299,4305,4311,4317,4323,4329],{},[139,4288,4289,4292],{},[84,4290,4291],{},"Service Client",": Gère les profils clients et préférences",[139,4294,4295,4298],{},[84,4296,4297],{},"Service Chaudières",": Gère les informations de chaudières et données de garantie",[139,4300,4301,4304],{},[84,4302,4303],{},"Service Paiement",": Traite les transactions et validation de paiements",[139,4306,4307,4310],{},[84,4308,4309],{},"Service Email",": Gère la communication et notifications",[139,4312,4313,4316],{},[84,4314,4315],{},"Service Météo",": Fournit les données météo pour la planification",[139,4318,4319,4322],{},[84,4320,4321],{},"Service Garantie",": Gère les informations de garantie et réclamations",[139,4324,4325,4328],{},[84,4326,4327],{},"Service Prédiction IA",": Simule les prédictions de maintenance",[139,4330,4331,4334],{},[84,4332,4333],{},"Service Technicien",": Gère la disponibilité et planification des techniciens",[777,4336,4338],{"id":4337},"structure-de-couche-de-données","Structure de Couche de Données",[215,4340,4344],{"className":4341,"code":4342,"language":4343,"meta":221,"style":221},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"customers\": {\n    \"CUST001\": {\n      \"name\": \"John Smith\",\n      \"email\": \"john.smith@email.com\",\n      \"address\": \"123 Main St, London\",\n      \"phone\": \"+44 20 1234 5678\",\n      \"preferences\": {\n        \"contact_method\": \"email\",\n        \"appointment_time\": \"morning\",\n        \"technician_preference\": \"John Smith\"\n      }\n    }\n  },\n  \"boilers\": {\n    \"BOIL001\": {\n      \"customer_id\": \"CUST001\",\n      \"model\": \"Worcester Bosch 8000 Style\",\n      \"installation_date\": \"2023-03-15\",\n      \"warranty_expiry\": \"2028-03-15\",\n      \"last_service\": \"2024-01-12\",\n      \"next_service_due\": \"2025-01-12\"\n    }\n  }\n}\n","json",[223,4345,4346,4351,4365,4380,4402,4421,4441,4461,4474,4494,4514,4532,4537,4542,4547,4560,4573,4591,4611,4631,4651,4671,4689,4693,4697],{"__ignoreMap":221},[262,4347,4348],{"class":264,"line":265},[262,4349,4350],{"class":3171},"{\n",[262,4352,4353,4356,4359,4361,4363],{"class":264,"line":271},[262,4354,4355],{"class":3171},"  \"",[262,4357,4358],{"class":3163},"customers",[262,4360,3194],{"class":3171},[262,4362,3184],{"class":3171},[262,4364,3175],{"class":3171},[262,4366,4367,4370,4374,4376,4378],{"class":264,"line":277},[262,4368,4369],{"class":3171},"    \"",[262,4371,4373],{"class":4372},"sBMFI","CUST001",[262,4375,3194],{"class":3171},[262,4377,3184],{"class":3171},[262,4379,3175],{"class":3171},[262,4381,4382,4385,4389,4391,4393,4395,4398,4400],{"class":264,"line":283},[262,4383,4384],{"class":3171},"      \"",[262,4386,4388],{"class":4387},"sbssI","name",[262,4390,3194],{"class":3171},[262,4392,3184],{"class":3171},[262,4394,3187],{"class":3171},[262,4396,4397],{"class":3190},"John Smith",[262,4399,3194],{"class":3171},[262,4401,3197],{"class":3171},[262,4403,4404,4406,4408,4410,4412,4414,4417,4419],{"class":264,"line":289},[262,4405,4384],{"class":3171},[262,4407,3758],{"class":4387},[262,4409,3194],{"class":3171},[262,4411,3184],{"class":3171},[262,4413,3187],{"class":3171},[262,4415,4416],{"class":3190},"john.smith@email.com",[262,4418,3194],{"class":3171},[262,4420,3197],{"class":3171},[262,4422,4423,4425,4428,4430,4432,4434,4437,4439],{"class":264,"line":295},[262,4424,4384],{"class":3171},[262,4426,4427],{"class":4387},"address",[262,4429,3194],{"class":3171},[262,4431,3184],{"class":3171},[262,4433,3187],{"class":3171},[262,4435,4436],{"class":3190},"123 Main St, London",[262,4438,3194],{"class":3171},[262,4440,3197],{"class":3171},[262,4442,4443,4445,4448,4450,4452,4454,4457,4459],{"class":264,"line":301},[262,4444,4384],{"class":3171},[262,4446,4447],{"class":4387},"phone",[262,4449,3194],{"class":3171},[262,4451,3184],{"class":3171},[262,4453,3187],{"class":3171},[262,4455,4456],{"class":3190},"+44 20 1234 5678",[262,4458,3194],{"class":3171},[262,4460,3197],{"class":3171},[262,4462,4463,4465,4468,4470,4472],{"class":264,"line":307},[262,4464,4384],{"class":3171},[262,4466,4467],{"class":4387},"preferences",[262,4469,3194],{"class":3171},[262,4471,3184],{"class":3171},[262,4473,3175],{"class":3171},[262,4475,4476,4479,4482,4484,4486,4488,4490,4492],{"class":264,"line":312},[262,4477,4478],{"class":3171},"        \"",[262,4480,4481],{"class":3180},"contact_method",[262,4483,3194],{"class":3171},[262,4485,3184],{"class":3171},[262,4487,3187],{"class":3171},[262,4489,3758],{"class":3190},[262,4491,3194],{"class":3171},[262,4493,3197],{"class":3171},[262,4495,4496,4498,4501,4503,4505,4507,4510,4512],{"class":264,"line":318},[262,4497,4478],{"class":3171},[262,4499,4500],{"class":3180},"appointment_time",[262,4502,3194],{"class":3171},[262,4504,3184],{"class":3171},[262,4506,3187],{"class":3171},[262,4508,4509],{"class":3190},"morning",[262,4511,3194],{"class":3171},[262,4513,3197],{"class":3171},[262,4515,4516,4518,4521,4523,4525,4527,4529],{"class":264,"line":324},[262,4517,4478],{"class":3171},[262,4519,4520],{"class":3180},"technician_preference",[262,4522,3194],{"class":3171},[262,4524,3184],{"class":3171},[262,4526,3187],{"class":3171},[262,4528,4397],{"class":3190},[262,4530,4531],{"class":3171},"\"\n",[262,4533,4534],{"class":264,"line":330},[262,4535,4536],{"class":3171},"      }\n",[262,4538,4539],{"class":264,"line":336},[262,4540,4541],{"class":3171},"    }\n",[262,4543,4544],{"class":264,"line":342},[262,4545,4546],{"class":3171},"  },\n",[262,4548,4549,4551,4554,4556,4558],{"class":264,"line":348},[262,4550,4355],{"class":3171},[262,4552,4553],{"class":3163},"boilers",[262,4555,3194],{"class":3171},[262,4557,3184],{"class":3171},[262,4559,3175],{"class":3171},[262,4561,4562,4564,4567,4569,4571],{"class":264,"line":354},[262,4563,4369],{"class":3171},[262,4565,4566],{"class":4372},"BOIL001",[262,4568,3194],{"class":3171},[262,4570,3184],{"class":3171},[262,4572,3175],{"class":3171},[262,4574,4575,4577,4579,4581,4583,4585,4587,4589],{"class":264,"line":360},[262,4576,4384],{"class":3171},[262,4578,3292],{"class":4387},[262,4580,3194],{"class":3171},[262,4582,3184],{"class":3171},[262,4584,3187],{"class":3171},[262,4586,4373],{"class":3190},[262,4588,3194],{"class":3171},[262,4590,3197],{"class":3171},[262,4592,4593,4595,4598,4600,4602,4604,4607,4609],{"class":264,"line":366},[262,4594,4384],{"class":3171},[262,4596,4597],{"class":4387},"model",[262,4599,3194],{"class":3171},[262,4601,3184],{"class":3171},[262,4603,3187],{"class":3171},[262,4605,4606],{"class":3190},"Worcester Bosch 8000 Style",[262,4608,3194],{"class":3171},[262,4610,3197],{"class":3171},[262,4612,4613,4615,4618,4620,4622,4624,4627,4629],{"class":264,"line":372},[262,4614,4384],{"class":3171},[262,4616,4617],{"class":4387},"installation_date",[262,4619,3194],{"class":3171},[262,4621,3184],{"class":3171},[262,4623,3187],{"class":3171},[262,4625,4626],{"class":3190},"2023-03-15",[262,4628,3194],{"class":3171},[262,4630,3197],{"class":3171},[262,4632,4633,4635,4638,4640,4642,4644,4647,4649],{"class":264,"line":378},[262,4634,4384],{"class":3171},[262,4636,4637],{"class":4387},"warranty_expiry",[262,4639,3194],{"class":3171},[262,4641,3184],{"class":3171},[262,4643,3187],{"class":3171},[262,4645,4646],{"class":3190},"2028-03-15",[262,4648,3194],{"class":3171},[262,4650,3197],{"class":3171},[262,4652,4653,4655,4658,4660,4662,4664,4667,4669],{"class":264,"line":384},[262,4654,4384],{"class":3171},[262,4656,4657],{"class":4387},"last_service",[262,4659,3194],{"class":3171},[262,4661,3184],{"class":3171},[262,4663,3187],{"class":3171},[262,4665,4666],{"class":3190},"2024-01-12",[262,4668,3194],{"class":3171},[262,4670,3197],{"class":3171},[262,4672,4673,4675,4678,4680,4682,4684,4687],{"class":264,"line":389},[262,4674,4384],{"class":3171},[262,4676,4677],{"class":4387},"next_service_due",[262,4679,3194],{"class":3171},[262,4681,3184],{"class":3171},[262,4683,3187],{"class":3171},[262,4685,4686],{"class":3190},"2025-01-12",[262,4688,4531],{"class":3171},[262,4690,4691],{"class":264,"line":395},[262,4692,4541],{"class":3171},[262,4694,4695],{"class":264,"line":401},[262,4696,3302],{"class":3171},[262,4698,4699],{"class":264,"line":407},[262,4700,3307],{"class":3171},[80,4702,4703,4706],{},[84,4704,4705],{},"Aperçu de la Structure de Données",": Le système utilise des fichiers JSON pour simuler une vraie base de données, avec des données structurées pour les clients, chaudières, planning de maintenance et commandes. Chaque enregistrement inclut des informations complètes nécessaires pour les interactions du chatbot.",[75,4708,4710,4716],{"className":4709},[113,114,115],[117,4711,4713],{"id":4712},"_5-tests-et-assurance-qualité",[84,4714,4715],{},"5. Tests et Assurance Qualité",[80,4717,4718],{},[126,4719,4720],{"href":128},[84,4721,131],{},[75,4723,4725],{"className":4724},[78],[80,4726,4727],{},"Le projet MCP-in-Chat inclut une suite de tests complète qui assure la fiabilité et la fonctionnalité dans tous les composants.",[777,4729,4731],{"id":4730},"couverture-de-tests","Couverture de Tests",[136,4733,4734,4740,4746,4752,4758],{},[139,4735,4736,4739],{},[84,4737,4738],{},"Outils MCP",": Tous les 4 outils testés avec divers scénarios d'entrée",[139,4741,4742,4745],{},[84,4743,4744],{},"Endpoints API",": Tests complets d'API REST avec authentification",[139,4747,4748,4751],{},[84,4749,4750],{},"Gestion d'Erreurs",": Validation des réponses d'erreur et cas limites",[139,4753,4754,4757],{},[84,4755,4756],{},"Intégration",": Tests de flux de travail de bout en bout",[139,4759,4760,4763],{},[84,4761,4762],{},"Performance",": Tests de temps de réponse et charge",[777,4765,4767],{"id":4766},"résumé-des-résultats-de-tests","Résumé des Résultats de Tests",[215,4769,4772],{"className":4770,"code":4771,"language":220},[218],"📊 RÉSUMÉ DES TESTS\n============================================================\nTotal des Tests: 5\nRéussis: 5 ✅\nÉchoués: 0 ❌\nTaux de Succès: 100.0%\n\n📋 RÉSULTATS DÉTAILLÉS\n------------------------------------------------------------\n1. boiler-info: ✅ RÉUSSI\n2. maintenance-get: ✅ RÉUSSI\n3. maintenance-schedule: ✅ RÉUSSI\n4. purchase: ✅ RÉUSSI\n5. email: ✅ RÉUSSI\n\n🎉 Tous les tests ont réussi! Les outils MCP fonctionnent correctement.\n",[223,4773,4771],{"__ignoreMap":221},[777,4775,4777],{"id":4776},"commandes-de-test-rapide","Commandes de Test Rapide",[215,4779,4783],{"className":4780,"code":4781,"language":4782,"meta":221,"style":221},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Exécuter tous les tests d'outils MCP\nnpm test\n\n# Tester des composants spécifiques\nnpm run test:api          # Tests API backend\nnpm run test:mcp          # Intégration MCP Cursor\nnpm run test:protocol     # Validation protocole MCP\nnpm run test:compiled     # Test version compilée\nnpm run test:connection   # Test connexion\nnpm run test:quick        # Vérification rapide santé\n","bash",[223,4784,4785,4790,4798,4803,4808,4821,4833,4845,4857,4869],{"__ignoreMap":221},[262,4786,4787],{"class":264,"line":265},[262,4788,4789],{"class":3157},"# Exécuter tous les tests d'outils MCP\n",[262,4791,4792,4795],{"class":264,"line":271},[262,4793,4794],{"class":4372},"npm",[262,4796,4797],{"class":3190}," test\n",[262,4799,4800],{"class":264,"line":277},[262,4801,4802],{"emptyLinePlaceholder":2113},"\n",[262,4804,4805],{"class":264,"line":283},[262,4806,4807],{"class":3157},"# Tester des composants spécifiques\n",[262,4809,4810,4812,4815,4818],{"class":264,"line":289},[262,4811,4794],{"class":4372},[262,4813,4814],{"class":3190}," run",[262,4816,4817],{"class":3190}," test:api",[262,4819,4820],{"class":3157},"          # Tests API backend\n",[262,4822,4823,4825,4827,4830],{"class":264,"line":295},[262,4824,4794],{"class":4372},[262,4826,4814],{"class":3190},[262,4828,4829],{"class":3190}," test:mcp",[262,4831,4832],{"class":3157},"          # Intégration MCP Cursor\n",[262,4834,4835,4837,4839,4842],{"class":264,"line":301},[262,4836,4794],{"class":4372},[262,4838,4814],{"class":3190},[262,4840,4841],{"class":3190}," test:protocol",[262,4843,4844],{"class":3157},"     # Validation protocole MCP\n",[262,4846,4847,4849,4851,4854],{"class":264,"line":307},[262,4848,4794],{"class":4372},[262,4850,4814],{"class":3190},[262,4852,4853],{"class":3190}," test:compiled",[262,4855,4856],{"class":3157},"     # Test version compilée\n",[262,4858,4859,4861,4863,4866],{"class":264,"line":312},[262,4860,4794],{"class":4372},[262,4862,4814],{"class":3190},[262,4864,4865],{"class":3190}," test:connection",[262,4867,4868],{"class":3157},"   # Test connexion\n",[262,4870,4871,4873,4875,4878],{"class":264,"line":318},[262,4872,4794],{"class":4372},[262,4874,4814],{"class":3190},[262,4876,4877],{"class":3190}," test:quick",[262,4879,4880],{"class":3157},"        # Vérification rapide santé\n",[75,4882,4884,4890],{"className":4883},[113,114,115],[117,4885,4887],{"id":4886},"_6-commencer",[84,4888,4889],{},"6. Commencer",[80,4891,4892],{},[126,4893,4894],{"href":128},[84,4895,131],{},[75,4897,4899],{"className":4898},[78],[80,4900,4901],{},"Le projet MCP-in-Chat est conçu pour être facilement accessible aux développeurs qui veulent comprendre et implémenter des serveurs MCP pour leurs propres cas d'usage.",[777,4903,4905],{"id":4904},"prérequis","Prérequis",[136,4907,4908,4911,4914,4917],{},[139,4909,4910],{},"Node.js 18+ et npm",[139,4912,4913],{},"Connaissance de TypeScript",[139,4915,4916],{},"Compréhension de base du protocole MCP",[139,4918,4919],{},"Accès aux chatbots externes (Claude, ChatGPT, Cursor)",[777,4921,4923],{"id":4922},"installation","Installation",[215,4925,4927],{"className":4780,"code":4926,"language":4782,"meta":221,"style":221},"# Cloner le repository\ngit clone https://github.com/michaelwybraniec/mcp-in-chat.git\ncd mcp-in-chat\n\n# Installer les dépendances\nnpm install\n\n# Construire le projet\nnpm run build\n\n# Démarrer le serveur API\nnpm run start:api\n\n# Démarrer le serveur MCP (dans un autre terminal)\nnpm run start:mcp\n",[223,4928,4929,4934,4945,4954,4958,4963,4970,4974,4979,4988,4992,4997,5006,5010,5015],{"__ignoreMap":221},[262,4930,4931],{"class":264,"line":265},[262,4932,4933],{"class":3157},"# Cloner le repository\n",[262,4935,4936,4939,4942],{"class":264,"line":271},[262,4937,4938],{"class":4372},"git",[262,4940,4941],{"class":3190}," clone",[262,4943,4944],{"class":3190}," https://github.com/michaelwybraniec/mcp-in-chat.git\n",[262,4946,4947,4951],{"class":264,"line":277},[262,4948,4950],{"class":4949},"s2Zo4","cd",[262,4952,4953],{"class":3190}," mcp-in-chat\n",[262,4955,4956],{"class":264,"line":283},[262,4957,4802],{"emptyLinePlaceholder":2113},[262,4959,4960],{"class":264,"line":289},[262,4961,4962],{"class":3157},"# Installer les dépendances\n",[262,4964,4965,4967],{"class":264,"line":295},[262,4966,4794],{"class":4372},[262,4968,4969],{"class":3190}," install\n",[262,4971,4972],{"class":264,"line":301},[262,4973,4802],{"emptyLinePlaceholder":2113},[262,4975,4976],{"class":264,"line":307},[262,4977,4978],{"class":3157},"# Construire le projet\n",[262,4980,4981,4983,4985],{"class":264,"line":312},[262,4982,4794],{"class":4372},[262,4984,4814],{"class":3190},[262,4986,4987],{"class":3190}," build\n",[262,4989,4990],{"class":264,"line":318},[262,4991,4802],{"emptyLinePlaceholder":2113},[262,4993,4994],{"class":264,"line":324},[262,4995,4996],{"class":3157},"# Démarrer le serveur API\n",[262,4998,4999,5001,5003],{"class":264,"line":330},[262,5000,4794],{"class":4372},[262,5002,4814],{"class":3190},[262,5004,5005],{"class":3190}," start:api\n",[262,5007,5008],{"class":264,"line":336},[262,5009,4802],{"emptyLinePlaceholder":2113},[262,5011,5012],{"class":264,"line":342},[262,5013,5014],{"class":3157},"# Démarrer le serveur MCP (dans un autre terminal)\n",[262,5016,5017,5019,5021],{"class":264,"line":348},[262,5018,4794],{"class":4372},[262,5020,4814],{"class":3190},[262,5022,5023],{"class":3190}," start:mcp\n",[777,5025,5027],{"id":5026},"intégration-avec-chatbots-externes","Intégration avec Chatbots Externes",[80,5029,5030],{},"Le serveur MCP est conçu pour fonctionner avec n'importe quel chatbot compatible MCP:",[2252,5032,5033,5039,5045],{},[139,5034,5035,5038],{},[84,5036,5037],{},"Claude Desktop",": Ajouter le serveur MCP à la configuration de Claude",[139,5040,5041,5044],{},[84,5042,5043],{},"ChatGPT",": Utiliser le serveur MCP comme outil personnalisé",[139,5046,5047,5050],{},[84,5048,5049],{},"Cursor IDE",": Intégrer directement avec l'environnement de développement",[777,5052,5054],{"id":5053},"personnalisation","Personnalisation",[80,5056,5057],{},"Le projet est conçu pour être facilement personnalisable pour différents domaines métier:",[2252,5059,5060,5066,5072,5078],{},[139,5061,5062,5065],{},[84,5063,5064],{},"Remplacer les Services Simulés",": Connecter aux APIs et bases de données réelles",[139,5067,5068,5071],{},[84,5069,5070],{},"Ajouter de Nouveaux Outils",": Étendre le serveur MCP avec fonctionnalité supplémentaire",[139,5073,5074,5077],{},[84,5075,5076],{},"Modifier la Logique Métier",": Adapter les services pour votre cas d'usage spécifique",[139,5079,5080,5083],{},[84,5081,5082],{},"Améliorer la Sécurité",": Ajouter des couches supplémentaires d'authentification et autorisation",[75,5085,5087,5093],{"className":5086},[113,114,115],[117,5088,5090],{"id":5089},"_7-leçons-apprises",[84,5091,5092],{},"7. Leçons Apprises",[80,5094,5095],{},[126,5096,5097],{"href":128},[84,5098,131],{},[75,5100,5102],{"className":5101},[78],[80,5103,5104],{},"Le projet MCP-in-Chat fournit des insights précieux sur la construction de serveurs MCP prêts pour la production et leur intégration avec des chatbots externes.",[777,5106,5108],{"id":5107},"facteurs-clés-de-succès","Facteurs Clés de Succès",[2252,5110,5111,5117,5123,5129,5134],{},[139,5112,5113,5116],{},[84,5114,5115],{},"Architecture en Couches",": Séparation claire entre outils MCP, couche API et logique métier",[139,5118,5119,5122],{},[84,5120,5121],{},"Tests Complets",": 100% de couverture de tests assure la fiabilité",[139,5124,5125,5128],{},[84,5126,5127],{},"Sécurité en Premier",": Authentification, validation et limitation de débit dès le début",[139,5130,5131,5133],{},[84,5132,2503],{},": Documentation complète pour une intégration facile",[139,5135,5136,5139],{},[84,5137,5138],{},"Services Simulés",": Simulation de données réaliste pour développement et tests",[777,5141,5143],{"id":5142},"défis-communs-et-solutions","Défis Communs et Solutions",[2252,5145,5146,5165,5182,5199],{},[139,5147,5148,5151],{},[84,5149,5150],{},"Complexité d'Intégration Externe",[136,5152,5153,5159],{},[139,5154,5155,5158],{},[84,5156,5157],{},"Défi",": Tester avec des chatbots externes peut être difficile",[139,5160,5161,5164],{},[84,5162,5163],{},"Solution",": Suite de tests locaux complète avec scénarios réalistes",[139,5166,5167,5170],{},[84,5168,5169],{},"Implémentation de Sécurité",[136,5171,5172,5177],{},[139,5173,5174,5176],{},[84,5175,5157],{},": Assurer une communication sécurisée entre composants",[139,5178,5179,5181],{},[84,5180,5163],{},": Sécurité en couches avec authentification à chaque niveau",[139,5183,5184,5187],{},[84,5185,5186],{},"Gestion des Données",[136,5188,5189,5194],{},[139,5190,5191,5193],{},[84,5192,5157],{},": Maintenir un état cohérent entre services",[139,5195,5196,5198],{},[84,5197,5163],{},": Couche de données centralisée avec contrôles d'accès",[139,5200,5201,5203],{},[84,5202,4750],{},[136,5204,5205,5210],{},[139,5206,5207,5209],{},[84,5208,5157],{},": Gestion élégante des erreurs dans les interfaces conversationnelles",[139,5211,5212,5214],{},[84,5213,5163],{},": Réponses d'erreur structurées avec orientation actionnable",[777,5216,5218],{"id":5217},"considérations-de-performance","Considérations de Performance",[136,5220,5221,5227,5233,5239],{},[139,5222,5223,5226],{},[84,5224,5225],{},"Temps de Réponse",": Les outils MCP doivent répondre en 2-3 secondes",[139,5228,5229,5232],{},[84,5230,5231],{},"Limitation de Débit",": Implémenter des limites de débit appropriées pour prévenir l'abus",[139,5234,5235,5238],{},[84,5236,5237],{},"Cache",": Mettre en cache les données fréquemment accédées pour améliorer les performances",[139,5240,5241,5244],{},[84,5242,5243],{},"Monitoring",": Implémenter logging et monitoring complets",[75,5246,5248,5254],{"className":5247},[113,114,115],[117,5249,5251],{"id":5250},"_8-améliorations-futures",[84,5252,5253],{},"8. Améliorations Futures",[80,5255,5256],{},[126,5257,5258],{"href":128},[84,5259,131],{},[75,5261,5263],{"className":5262},[78],[80,5264,5265],{},"Le projet MCP-in-Chat sert de base pour des implémentations plus sophistiquées de serveurs MCP et fournit une feuille de route pour le développement futur.",[777,5267,5269],{"id":5268},"améliorations-planifiées","Améliorations Planifiées",[2252,5271,5272,5291,5310,5329],{},[139,5273,5274,5277],{},[84,5275,5276],{},"Intégration de Services Réels",[136,5278,5279,5282,5285,5288],{},[139,5280,5281],{},"Remplacer les services simulés par des APIs réelles",[139,5283,5284],{},"Intégrer avec des passerelles de paiement",[139,5286,5287],{},"Connecter aux bases de données clients",[139,5289,5290],{},"Implémenter des services email réels",[139,5292,5293,5296],{},[84,5294,5295],{},"Fonctionnalités Avancées",[136,5297,5298,5301,5304,5307],{},[139,5299,5300],{},"Support multilingue",[139,5302,5303],{},"Intégration vocale",[139,5305,5306],{},"Intégration d'application mobile",[139,5308,5309],{},"Analyses avancées et rapports",[139,5311,5312,5315],{},[84,5313,5314],{},"Améliorations d'Évolutivité",[136,5316,5317,5320,5323,5326],{},[139,5318,5319],{},"Architecture de microservices",[139,5321,5322],{},"Équilibrage de charge",[139,5324,5325],{},"Optimisation de base de données",[139,5327,5328],{},"Stratégies de cache",[139,5330,5331,5334],{},[84,5332,5333],{},"Améliorations de Sécurité",[136,5335,5336,5339,5342,5345],{},[139,5337,5338],{},"Intégration OAuth 2.0",[139,5340,5341],{},"Contrôle d'accès basé sur les rôles",[139,5343,5344],{},"Logging d'audit",[139,5346,5347],{},"Fonctionnalités de conformité",[777,5349,5351],{"id":5350},"applications-dindustrie","Applications d'Industrie",[80,5353,5354],{},"L'architecture MCP-in-Chat peut être adaptée pour diverses industries:",[2252,5356,5357,5363,5369,5375,5381],{},[139,5358,5359,5362],{},[84,5360,5361],{},"Santé",": Planification de rendez-vous patients et accès aux dossiers médicaux",[139,5364,5365,5368],{},[84,5366,5367],{},"Finance",": Gestion de comptes et traitement de transactions",[139,5370,5371,5374],{},[84,5372,5373],{},"Éducation",": Inscription aux cours et services étudiants",[139,5376,5377,5380],{},[84,5378,5379],{},"Immobilier",": Recherche de propriétés et gestion de réservations",[139,5382,5383,5386],{},[84,5384,5385],{},"Voyage",": Réservation de vols et gestion d'itinéraires",[75,5388,5390,5396],{"className":5389},[113,114,115],[117,5391,5393],{"id":5392},"_9-conclusion",[84,5394,5395],{},"9. Conclusion",[80,5397,5398],{},[126,5399,5400],{"href":128},[84,5401,131],{},[75,5403,5405],{"className":5404},[78],[80,5406,5407],{},"Le projet MCP-in-Chat démontre le pouvoir et le potentiel des serveurs du Protocole de Contexte de Modèle dans la création de systèmes d'IA conversationnelle sophistiqués. En fournissant un exemple complet et prêt pour la production, il sert à la fois de ressource d'apprentissage et de base pour des implémentations du monde réel.",[777,5409,5411],{"id":5410},"points-clés","Points Clés",[2252,5413,5414,5420,5426,5432,5438],{},[139,5415,5416,5419],{},[84,5417,5418],{},"Les Serveurs MCP Permettent une Valeur Commerciale Réelle",": Le projet montre comment les serveurs MCP peuvent connecter l'IA conversationnelle aux systèmes d'entreprise",[139,5421,5422,5425],{},[84,5423,5424],{},"Le Développement Systématique Fonctionne",": La méthodologie AWP a assuré un développement cohérent et de haute qualité",[139,5427,5428,5431],{},[84,5429,5430],{},"La Sécurité est Primordiale",": L'architecture de sécurité en couches est essentielle pour les systèmes de production",[139,5433,5434,5437],{},[84,5435,5436],{},"Les Tests sont Critiques",": Les tests complets assurent la fiabilité et la fonctionnalité",[139,5439,5440,5443],{},[84,5441,5442],{},"La Documentation Compte",": La documentation complète permet une adoption et personnalisation faciles",[777,5445,5447],{"id":5446},"prochaines-étapes","Prochaines Étapes",[80,5449,5450],{},"Pour les développeurs intéressés par les serveurs MCP:",[2252,5452,5453,5464,5470,5476],{},[139,5454,5455,5458,5459,5463],{},[84,5456,5457],{},"Étudier le Code",": Examiner le ",[126,5460,5462],{"href":2420,"rel":5461},[2422],"repository MCP-in-Chat"," pour comprendre l'implémentation",[139,5465,5466,5469],{},[84,5467,5468],{},"Exécuter le Demo",": Configurer le projet localement et tester avec des chatbots externes",[139,5471,5472,5475],{},[84,5473,5474],{},"Personnaliser",": Adapter l'architecture pour votre cas d'usage spécifique",[139,5477,5478,5481],{},[84,5479,5480],{},"Contribuer",": Partager les améliorations et améliorations avec la communauté",[80,5483,5484],{},"Le projet MCP-in-Chat représente un pas significatif vers l'avant dans la réalisation des serveurs MCP accessibles et pratiques pour les applications du monde réel. En fournissant un exemple complet et fonctionnel, il réduit la barrière d'entrée pour les développeurs qui veulent intégrer l'IA conversationnelle avec leurs systèmes métier.",[187,5486],{},[80,5488,5489,3184],{},[84,5490,5491],{},"Ressources",[136,5493,5494,5500,5507],{},[139,5495,5496],{},[126,5497,5499],{"href":2420,"rel":5498},[2422],"Repository MCP-in-Chat",[139,5501,5502],{},[126,5503,5506],{"href":5504,"rel":5505},"https://modelcontextprotocol.io/",[2422],"Documentation du Protocole de Contexte de Modèle",[139,5508,5509],{},[126,5510,2447],{"href":5511,"rel":5512},"https://github.com/michaelwybraniec/mcp-agentic-sldc",[2422],[2364,5514,5515],{},"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 .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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":221,"searchDepth":271,"depth":271,"links":5517},[5518,5526,5532,5537,5542,5547,5553,5558,5562],{"id":2430,"depth":271,"text":2433,"children":5519},[5520,5521,5522,5523,5524,5525],{"id":2458,"depth":277,"text":2459},{"id":2477,"depth":277,"text":2478},{"id":2513,"depth":277,"text":2514},{"id":2601,"depth":277,"text":2602},{"id":2618,"depth":277,"text":2619},{"id":2660,"depth":277,"text":2661},{"id":3126,"depth":271,"text":3129,"children":5527},[5528,5529,5530,5531],{"id":3144,"depth":277,"text":3145},{"id":3316,"depth":277,"text":3317},{"id":3536,"depth":277,"text":3537},{"id":3725,"depth":277,"text":3726},{"id":3929,"depth":271,"text":3932,"children":5533},[5534,5535,5536],{"id":3947,"depth":277,"text":3948},{"id":3968,"depth":277,"text":3969},{"id":3987,"depth":277,"text":3988},{"id":4009,"depth":271,"text":4012,"children":5538},[5539,5540,5541],{"id":4027,"depth":277,"text":4028},{"id":4280,"depth":277,"text":4281},{"id":4337,"depth":277,"text":4338},{"id":4712,"depth":271,"text":4715,"children":5543},[5544,5545,5546],{"id":4730,"depth":277,"text":4731},{"id":4766,"depth":277,"text":4767},{"id":4776,"depth":277,"text":4777},{"id":4886,"depth":271,"text":4889,"children":5548},[5549,5550,5551,5552],{"id":4904,"depth":277,"text":4905},{"id":4922,"depth":277,"text":4923},{"id":5026,"depth":277,"text":5027},{"id":5053,"depth":277,"text":5054},{"id":5089,"depth":271,"text":5092,"children":5554},[5555,5556,5557],{"id":5107,"depth":277,"text":5108},{"id":5142,"depth":277,"text":5143},{"id":5217,"depth":277,"text":5218},{"id":5250,"depth":271,"text":5253,"children":5559},[5560,5561],{"id":5268,"depth":277,"text":5269},{"id":5350,"depth":277,"text":5351},{"id":5392,"depth":271,"text":5395,"children":5563},[5564,5565],{"id":5410,"depth":277,"text":5411},{"id":5446,"depth":277,"text":5447},"2025-08-06","Une démonstration complète de comment construire un serveur MCP pour l\\'intégration de chatbot e-commerce, avec services de maintenance de chaudières, accès aux données en temps réel et flux de travail automatisés utilisant AWP.",{"src":5569},"/blog/mcp/mcp-cover.png",{},{"title":35,"description":5567},"p2ZnnyHTrbO4Lb_zVxkcbh93t3Pa5vaY759926BeT28",1790785951289]