[{"data":1,"prerenderedAt":6410},["ShallowReactive",2],{"navigation_en":3,"posts_en:/en/blog/commercial-architecture-chain":79,"blog-alt-locales:commercial-architecture-chain:en":2413,"posts_en:/en/blog/commercial-architecture-chain:surround":2416},[4],{"title":5,"path":6,"stem":7,"children":8,"page":78},"En","/en","en",[9],{"title":10,"path":11,"stem":12,"children":13,"page":78},"Blog","/en/blog","en/blog",[14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74],{"title":15,"path":16,"stem":17},"Security Practices for MCP Using JSON-RPC","/en/blog/mcp-security","en/blog/1. mcp-security",{"title":19,"path":20,"stem":21},"MCP Servers: Connecting AI to Real-Time Data","/en/blog/mcp-create","en/blog/2. mcp-create",{"title":23,"path":24,"stem":25},"MCP Servers: Risks of Using in Claude Desktop","/en/blog/mcp-risks","en/blog/3. mcp-risks",{"title":27,"path":28,"stem":29},"MCP Servers: Integrating LLM in E-Commerce Systems","/en/blog/mcp","en/blog/4. mcp",{"title":31,"path":32,"stem":33},"MCP Tiny Agents On-Premises: Breaking Free from Cloud Dependencies","/en/blog/mcp-tiny-agents-on-premises","en/blog/5. mcp-tiny-agents-on-premises",{"title":35,"path":36,"stem":37},"From Idea to API in 2 Days: Building Bankly with Agentic Workflows","/en/blog/overvibing","en/blog/6. overvibing",{"title":39,"path":40,"stem":41},"AI Chat, MCP Server build with Agentic Workflow Protocol for demo at Checkatrade .com","/en/blog/mcp-in-chat-demo","en/blog/8. mcp-in-chat-demo",{"title":43,"path":44,"stem":45},"AI Opportunities for Checkatrade considering PERN Stack","/en/blog/ai-opportunities-pern-stack","en/blog/ai-opportunities-pern-stack",{"title":47,"path":48,"stem":49},"Domain-Driven Design in Full-Stack Frameworks","/en/blog/architecture","en/blog/architecture",{"title":51,"path":52,"stem":53},"one-front, as told by git","/en/blog/building-one-front","en/blog/building-one-front",{"title":55,"path":56,"stem":57},"Commercial architecture is a chain, not a pricing page","/en/blog/commercial-architecture-chain","en/blog/commercial-architecture-chain",{"title":59,"path":60,"stem":61},"Quality: How to protect AI-powered Frontends?","/en/blog/qa-front","en/blog/qa-front",{"title":63,"path":64,"stem":65},"The Hidden Dangers of GraphQL: Security, Performance, and Complexity Risks","/en/blog/risking-with-graphql","en/blog/risking-with-graphql",{"title":67,"path":68,"stem":69},"From Zero to Hero: Scaling up to million users","/en/blog/scalability","en/blog/scalability",{"title":71,"path":72,"stem":73},"IT Consulting and Strategy","/en/blog/strategy","en/blog/strategy",{"title":75,"path":76,"stem":77},"Distributed Systems","/en/blog/systems","en/blog/systems",false,{"id":80,"title":55,"authors":81,"badge":88,"body":92,"date":2405,"description":2406,"extension":2407,"image":2408,"meta":2410,"navigation":2128,"path":56,"seo":2411,"stem":57,"__hash__":2412},"posts_en/en/blog/commercial-architecture-chain.md",[82],{"name":83,"description":84,"to":85,"avatar":86},"Michael Wybraniec","System Design, GenAI Automation & Architecture","https://www.linkedin.com/in/one-front/",{"src":87},"https://media.licdn.com/dms/image/v2/D4D03AQEGvIVcrTTS2g/profile-displayphoto-shrink_800_800/B4DZbtSf7LIEAc-/0/1747737772225?e=1753315200&v=beta&t=EOviZQkM396PoGctVjDCdlG8U3vN5UKWiIeNQ8IFUgQ",{"label":89,"color":90,"variant":91},"Architecture, RevOps","primary","soft",{"type":93,"value":94,"toc":2382},"minimark",[95,98,130,152,206,209,224,234,245,251,264,274,466,484,486,501,511,629,646,652,761,773,775,790,800,807,816,841,931,937,943,955,1116,1122,1128,1153,1159,1165,1186,1192,1202,1227,1233,1239,1255,1261,1267,1283,1289,1299,1307,1323,1325,1340,1350,1410,1452,1515,1532,1552,1630,1632,1647,1653,1745,1751,1778,1801,1803,1818,1839,1841,1856,1866,1915,2045,2085,2094,2096,2111,2117,2206,2208,2223,2229,2235,2243,2245,2260,2266,2307,2313,2315,2330,2345,2365,2378],[96,97],"br",{},[99,100,103,112,123],"div",{"className":101},[102],"text-justify",[104,105,106,107,111],"p",{},"Most teams ship a ",[108,109,110],"strong",{},"pricing page"," and call it monetization. Then they add Stripe. Then someone hard-codes “Pro gets feature X” in three API routes. Then ops needs a complimentary account and someone opens a hotfix branch. Then the vendor bill arrives and nobody knows which tenant burned the margin.",[104,113,114,115,118,119,122],{},"That pattern is common because soft-launch shorthand — “pricing + FinOps + growth” — sounds complete. It is ",[108,116,117],{},"necessary but incomplete",". A serious commercial model is not one document, one page, or one billing integration. It is a ",[108,120,121],{},"system of capabilities"," with named owners, a clear sequence, and a single product catalog as source of truth.",[104,124,125,126,129],{},"This article is ",[108,127,128],{},"project-agnostic",": a portable commercial architecture any SaaS or multi-tenant team can reuse. Same idea as domain architecture elsewhere on this blog — boundaries first, enforce at the edge, don’t invent a second truth in the payment provider.",[99,131,136,143],{"className":132},[133,134,135],"flex","justify-between","items-center",[137,138,140],"h2",{"id":139},"tldr",[108,141,142],{},"TL;DR",[104,144,145],{},[146,147,149],"a",{"href":148},"#top",[108,150,151],{},"⤴",[99,153,155],{"className":154},[102],[156,157,158,166,172,178,189,195],"ul",{},[159,160,161,162,165],"li",{},"Monetization is a ",[108,163,164],{},"chain",": catalog → agreement → provision → entitlements → meter → bill → cash (+ FinOps cost loop).",[159,167,168,171],{},[108,169,170],{},"One catalog"," feeds pricing, admin, entitlements, and billing — never a second plan list in the MoR.",[159,173,174,177],{},[108,175,176],{},"Entitlements ≠ feature flags","; deny with a clear upgrade path.",[159,179,180,181,184,185,188],{},"Ship ",[108,182,183],{},"Encode"," (catalog + enforce + gates + admin) before ",[108,186,187],{},"Charge","; legalize before the first real payment.",[159,190,191,194],{},[108,192,193],{},"Cost ≠ revenue"," — FinOps and pricing are separate ledgers.",[159,196,197,198,201,202,205],{},"Steal the ",[108,199,200],{},"cheat sheet"," and ",[108,203,204],{},"Start Monday"," lists at the end.",[207,208],"hr",{},[99,210,212,218],{"className":211},[133,134,135],[137,213,215],{"id":214},"_1-the-chain-what-best-means",[108,216,217],{},"1. The chain (what “best” means)",[104,219,220],{},[146,221,222],{"href":148},[108,223,151],{},[99,225,227],{"className":226},[102],[104,228,229,230,233],{},"Leaders in billing and entitlement stacks (think Stripe Billing / Chargebee-class systems, entitlement + meter layers, FinOps practice on the cost side) treat monetization as ",[108,231,232],{},"one governed chain",". Marketing may start with a pricing page. Architecture starts here:",[235,236,242],"pre",{"className":237,"code":239,"language":240,"meta":241},[238],"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","",[243,244,239],"code",{"__ignoreMap":241},[99,246,248],{"className":247},[102],[104,249,250],{},"Each arrow is a handoff. If you skip a link — for example billing without entitlements, or entitlements without a catalog — the next team invents their own truth. That is how you get three plan lists: one on the website, one in admin folklore, one in Stripe.",[99,252,254],{"className":253},[102],[104,255,256,259,260,263],{},[108,257,258],{},"Nuance:"," entitlements and metering are not only left-to-right. Caps often ",[108,261,262],{},"read meters"," (“allow if usage is under the limit”), so meters feed entitlements as well as billing and FinOps. Keep the seven-step chain as the primary story; treat the cap check as a feedback edge, not a reason to smash “entitle + meter + bill” into one blob.",[99,265,267],{"className":266},[102],[104,268,269,270,273],{},"There is also a ",[108,271,272],{},"parallel cost loop",". Revenue asks “what did they pay?” Cost asks “what did we pay to serve them?” Conflating those questions is how teams underprice forever or panic-cut features without data.",[235,275,279],{"className":276,"code":277,"language":278,"meta":241,"style":241},"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",[243,280,281,289,295,301,307,313,319,325,330,336,342,348,354,360,366,372,378,384,390,396,402,407,413,419,425,430,436,442,448,454,460],{"__ignoreMap":241},[282,283,286],"span",{"class":284,"line":285},"line",1,[282,287,288],{},"---\n",[282,290,292],{"class":284,"line":291},2,[282,293,294],{},"header: Commercial architecture - revenue chain and FinOps cost loop\n",[282,296,298],{"class":284,"line":297},3,[282,299,300],{},"legend:\n",[282,302,304],{"class":284,"line":303},4,[282,305,306],{},"  - color: \"#3B82F6\"\n",[282,308,310],{"class":284,"line":309},5,[282,311,312],{},"    text: \"Revenue chain\"\n",[282,314,316],{"class":284,"line":315},6,[282,317,318],{},"  - color: \"#F59E0B\"\n",[282,320,322],{"class":284,"line":321},7,[282,323,324],{},"    text: \"Cost loop (FinOps)\"\n",[282,326,328],{"class":284,"line":327},8,[282,329,288],{},[282,331,333],{"class":284,"line":332},9,[282,334,335],{},"flowchart TB\n",[282,337,339],{"class":284,"line":338},10,[282,340,341],{},"  subgraph Revenue[\"Revenue chain\"]\n",[282,343,345],{"class":284,"line":344},11,[282,346,347],{},"    direction LR\n",[282,349,351],{"class":284,"line":350},12,[282,352,353],{},"    A[Catalog] --> B[Agreement]\n",[282,355,357],{"class":284,"line":356},13,[282,358,359],{},"    B --> C[Provision]\n",[282,361,363],{"class":284,"line":362},14,[282,364,365],{},"    C --> D[Entitlements]\n",[282,367,369],{"class":284,"line":368},15,[282,370,371],{},"    D --> E[Metering]\n",[282,373,375],{"class":284,"line":374},16,[282,376,377],{},"    E --> F[Billing]\n",[282,379,381],{"class":284,"line":380},17,[282,382,383],{},"    F --> G[Cash / RevOps]\n",[282,385,387],{"class":284,"line":386},18,[282,388,389],{},"    E -.->|caps / fair use| D\n",[282,391,393],{"class":284,"line":392},19,[282,394,395],{},"  end\n",[282,397,399],{"class":284,"line":398},20,[282,400,401],{},"  subgraph Cost[\"Cost loop (FinOps)\"]\n",[282,403,405],{"class":284,"line":404},21,[282,406,347],{},[282,408,410],{"class":284,"line":409},22,[282,411,412],{},"    H[Allocate spend] --> I[Unit economics]\n",[282,414,416],{"class":284,"line":415},23,[282,417,418],{},"    I --> J[Budgets / kill-switches]\n",[282,420,422],{"class":284,"line":421},24,[282,423,424],{},"    J --> K[Price or package change]\n",[282,426,428],{"class":284,"line":427},25,[282,429,395],{},[282,431,433],{"class":284,"line":432},26,[282,434,435],{},"  E -.-> H\n",[282,437,439],{"class":284,"line":438},27,[282,440,441],{},"  K -.-> A\n",[282,443,445],{"class":284,"line":444},28,[282,446,447],{},"  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[282,449,451],{"class":284,"line":450},29,[282,452,453],{},"  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n",[282,455,457],{"class":284,"line":456},30,[282,458,459],{},"  class A,B,C,D,E,F,G revenue\n",[282,461,463],{"class":284,"line":462},31,[282,464,465],{},"  class H,I,J,K cost\n",[99,467,469],{"className":468},[102],[104,470,471,472,475,476,479,480,483],{},"Meters feed ",[108,473,474],{},"entitlements"," (caps), ",[108,477,478],{},"invoices"," (later), and ",[108,481,482],{},"FinOps"," (always). You can meter for caps and fair use long before you charge a card. The dashed arrows are feedback: usage informs allow/deny and cost; cost informs packaging.",[207,485],{},[99,487,489,495],{"className":488},[133,134,135],[137,490,492],{"id":491},"_2-who-owns-what-actors",[108,493,494],{},"2. Who owns what (actors)",[104,496,497],{},[146,498,499],{"href":148},[108,500,151],{},[99,502,504],{"className":503},[102],[104,505,506,507,510],{},"FinOps is only ",[108,508,509],{},"one"," actor — and only on the cost side. The chain fails when everything is dumped on “pricing,” “billing,” or “engineering will add a flag.” Name the owners, even if one person wears three hats early on.",[512,513,514,527],"table",{},[515,516,517],"thead",{},[518,519,520,524],"tr",{},[521,522,523],"th",{},"Actor",[521,525,526],{},"Owns in the chain",[528,529,530,541,551,561,571,581,591,605,615],"tbody",{},[518,531,532,538],{},[533,534,535],"td",{},[108,536,537],{},"Product / packaging",[533,539,540],{},"Catalog: plans, SKUs, limits, trials",[518,542,543,548],{},[533,544,545],{},[108,546,547],{},"GTM / growth",[533,549,550],{},"Who may join; invite vs open; soft-launch vs paywall",[518,552,553,558],{},[533,554,555],{},[108,556,557],{},"Platform / engineering",[533,559,560],{},"Provisioning, entitlements at request time, metering events",[518,562,563,568],{},[533,564,565],{},[108,566,567],{},"Ops / admin",[533,569,570],{},"Live overrides, caps, complimentary access, kill-switches + audit",[518,572,573,578],{},[533,574,575],{},[108,576,577],{},"Billing / finance",[533,579,580],{},"Subscriptions, invoices, renewals, revenue recognition",[518,582,583,588],{},[533,584,585],{},[108,586,587],{},"Customer (buyer)",[533,589,590],{},"Plan, usage, invoices (portal)",[518,592,593,597],{},[533,594,595],{},[108,596,482],{},[533,598,599,600,604],{},"What ",[601,602,603],"em",{},"we"," pay; margin; budgets; cost kill-switches",[518,606,607,612],{},[533,608,609],{},[108,610,611],{},"Legal / compliance",[533,613,614],{},"Tax, merchant-of-record vs Connect, entity — before “charge” go-live",[518,616,617,626],{},[533,618,619,622,623],{},[108,620,621],{},"RevOps / CS"," ",[601,624,625],{},"(later)",[533,627,628],{},"Activate, expand, churn, support load",[99,630,632],{"className":631},[102],[104,633,634,637,638,641,642,645],{},[108,635,636],{},"RevOps"," aligns sales, marketing, and customer success around the revenue lifecycle — who owns activation, expansion, renewal, and churn signals. It usually matters ",[108,639,640],{},"after Charge",". Early on it is often founder + CS ",[108,643,644],{},"runbooks",", not a dedicated team or product surface.",[99,647,649],{"className":648},[102],[104,650,651],{},"Two paths, same system — different ledgers:",[235,653,655],{"className":276,"code":654,"language":278,"meta":241,"style":241},"---\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",[243,656,657,661,666,670,674,679,683,688,692,697,702,706,711,715,720,724,729,733,738,743,747,751,756],{"__ignoreMap":241},[282,658,659],{"class":284,"line":285},[282,660,288],{},[282,662,663],{"class":284,"line":291},[282,664,665],{},"header: Actors on revenue vs cost ledgers\n",[282,667,668],{"class":284,"line":297},[282,669,300],{},[282,671,672],{"class":284,"line":303},[282,673,306],{},[282,675,676],{"class":284,"line":309},[282,677,678],{},"    text: \"Revenue ledger\"\n",[282,680,681],{"class":284,"line":315},[282,682,318],{},[282,684,685],{"class":284,"line":321},[282,686,687],{},"    text: \"Cost ledger\"\n",[282,689,690],{"class":284,"line":327},[282,691,288],{},[282,693,694],{"class":284,"line":332},[282,695,696],{},"flowchart LR\n",[282,698,699],{"class":284,"line":338},[282,700,701],{},"  subgraph Rev[\"Revenue ledger\"]\n",[282,703,704],{"class":284,"line":344},[282,705,347],{},[282,707,708],{"class":284,"line":350},[282,709,710],{},"    P[Product] --> GTM[GTM] --> PL[Platform] --> OPS[Ops] --> BIL[Billing] --> CU[Customer]\n",[282,712,713],{"class":284,"line":356},[282,714,395],{},[282,716,717],{"class":284,"line":362},[282,718,719],{},"  subgraph Cost[\"Cost ledger\"]\n",[282,721,722],{"class":284,"line":368},[282,723,347],{},[282,725,726],{"class":284,"line":374},[282,727,728],{},"    U[Usage / infra] --> FO[FinOps] --> FB[Package / price / gates]\n",[282,730,731],{"class":284,"line":380},[282,732,395],{},[282,734,735],{"class":284,"line":386},[282,736,737],{},"  PL -.-> U\n",[282,739,740],{"class":284,"line":392},[282,741,742],{},"  FB -.-> P\n",[282,744,745],{"class":284,"line":398},[282,746,447],{},[282,748,749],{"class":284,"line":404},[282,750,453],{},[282,752,753],{"class":284,"line":409},[282,754,755],{},"  class P,GTM,PL,OPS,BIL,CU revenue\n",[282,757,758],{"class":284,"line":415},[282,759,760],{},"  class U,FO,FB cost\n",[99,762,764],{"className":763},[102],[104,765,766,769,770,772],{},[108,767,768],{},"Pricing / catalog / billing"," sit on the revenue ledger. ",[108,771,482],{}," sits on the cost ledger. Neither replaces the other. When margin is wrong, FinOps informs Product; when a tenant is over limit, Platform enforces and Ops may override — with an audit trail, not a Slack DM and a forgotten deploy.",[207,774],{},[99,776,778,784],{"className":777},[133,134,135],[137,779,781],{"id":780},"_3-hard-rules-and-how-to-implement-them",[108,782,783],{},"3. Hard rules — and how to implement them",[104,785,786],{},[146,787,788],{"href":148},[108,789,151],{},[99,791,793],{"className":792},[102],[104,794,795,796,799],{},"These rules are the difference between “we have pricing” and “we have commercial architecture.” Skip them and you will rebuild the same mess every six months. Under each rule: a ",[108,797,798],{},"strategy"," you can ship without waiting for a perfect billing suite.",[801,802,804],"h3",{"id":803},"_31-one-product-catalog",[108,805,806],{},"3.1 One product catalog",[99,808,810],{"className":809},[102],[104,811,812,813,815],{},"Plans, SKUs, limits, and trial rules live in ",[108,814,509],{}," source of truth. Pricing page, admin, and billing all read it.",[99,817,819],{"className":818},[102],[104,820,821,824,825,828,829,832,833,836,837,840],{},[108,822,823],{},"Strategy:"," Put the catalog in versioned code or a small DB table — ",[243,826,827],{},"plan_id",", display name, limits, trial days, module defaults. Public ",[243,830,831],{},"/pricing"," and i18n copy ",[108,834,835],{},"import"," that model; they do not redefine tiers. When billing arrives, create MoR products ",[108,838,839],{},"from"," the catalog IDs (1:1 map), never the other way around.",[235,842,844],{"className":276,"code":843,"language":278,"meta":241,"style":241},"---\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",[243,845,846,850,855,859,864,869,873,878,882,886,891,896,901,906,911,916,921,926],{"__ignoreMap":241},[282,847,848],{"class":284,"line":285},[282,849,288],{},[282,851,852],{"class":284,"line":291},[282,853,854],{},"header: One catalog as source of truth\n",[282,856,857],{"class":284,"line":297},[282,858,300],{},[282,860,861],{"class":284,"line":303},[282,862,863],{},"  - color: \"#10B981\"\n",[282,865,866],{"class":284,"line":309},[282,867,868],{},"    text: \"Catalog SoT\"\n",[282,870,871],{"class":284,"line":315},[282,872,306],{},[282,874,875],{"class":284,"line":321},[282,876,877],{},"    text: \"Surfaces that read the catalog\"\n",[282,879,880],{"class":284,"line":327},[282,881,288],{},[282,883,884],{"class":284,"line":332},[282,885,335],{},[282,887,888],{"class":284,"line":338},[282,889,890],{},"  CAT[(Catalog SoT)]\n",[282,892,893],{"class":284,"line":344},[282,894,895],{},"  CAT --> WEB[Pricing page]\n",[282,897,898],{"class":284,"line":350},[282,899,900],{},"  CAT --> ADM[Admin console]\n",[282,902,903],{"class":284,"line":356},[282,904,905],{},"  CAT --> RES[Entitlement resolver]\n",[282,907,908],{"class":284,"line":362},[282,909,910],{},"  CAT --> MOR[Billing MoR 1:1 SKUs]\n",[282,912,913],{"class":284,"line":368},[282,914,915],{},"  classDef sot fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[282,917,918],{"class":284,"line":374},[282,919,920],{},"  classDef consumer fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[282,922,923],{"class":284,"line":380},[282,924,925],{},"  class CAT sot\n",[282,927,928],{"class":284,"line":386},[282,929,930],{},"  class WEB,ADM,RES,MOR consumer\n",[801,932,934],{"id":933},"_32-entitlements-feature-flags",[108,935,936],{},"3.2 Entitlements ≠ feature flags",[99,938,940],{"className":939},[102],[104,941,942],{},"Flags = rollout. Entitlements = commercial + security truth at request time.",[99,944,946],{"className":945},[102],[104,947,948,950,951,954],{},[108,949,823],{}," One resolver: ",[243,952,953],{},"tenant → plan + overrides → { modules, caps }",". Call it from API middleware or a shared policy layer on every paid/costly path. Keep LaunchDarkly-style flags for “is this code path live,” not for “is this tenant on Pro.”",[235,956,958],{"className":276,"code":957,"language":278,"meta":241,"style":241},"---\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",[243,959,960,964,969,973,977,982,987,992,996,1001,1006,1011,1015,1020,1025,1030,1035,1040,1045,1050,1055,1060,1065,1070,1075,1080,1085,1090,1095,1100,1105,1110],{"__ignoreMap":241},[282,961,962],{"class":284,"line":285},[282,963,288],{},[282,965,966],{"class":284,"line":291},[282,967,968],{},"header: Feature flags vs entitlement resolver\n",[282,970,971],{"class":284,"line":297},[282,972,300],{},[282,974,975],{"class":284,"line":303},[282,976,306],{},[282,978,979],{"class":284,"line":309},[282,980,981],{},"    text: \"Request / resolve inputs\"\n",[282,983,984],{"class":284,"line":315},[282,985,986],{},"  - color: \"#8B5CF6\"\n",[282,988,989],{"class":284,"line":321},[282,990,991],{},"    text: \"Decision\"\n",[282,993,994],{"class":284,"line":327},[282,995,863],{},[282,997,998],{"class":284,"line":332},[282,999,1000],{},"    text: \"Allow\"\n",[282,1002,1003],{"class":284,"line":338},[282,1004,1005],{},"  - color: \"#EF4444\"\n",[282,1007,1008],{"class":284,"line":344},[282,1009,1010],{},"    text: \"Deny / not shipped\"\n",[282,1012,1013],{"class":284,"line":350},[282,1014,288],{},[282,1016,1017],{"class":284,"line":356},[282,1018,1019],{},"flowchart TD\n",[282,1021,1022],{"class":284,"line":362},[282,1023,1024],{},"  R[API request] --> F{Feature flag: code live?}\n",[282,1026,1027],{"class":284,"line":368},[282,1028,1029],{},"  F -->|No| X[Not shipped]\n",[282,1031,1032],{"class":284,"line":374},[282,1033,1034],{},"  F -->|Yes| V[Entitlement resolver]\n",[282,1036,1037],{"class":284,"line":380},[282,1038,1039],{},"  V --> C[Catalog defaults]\n",[282,1041,1042],{"class":284,"line":386},[282,1043,1044],{},"  V --> O[Tenant overrides]\n",[282,1046,1047],{"class":284,"line":392},[282,1048,1049],{},"  V --> M[Monetization / kill-switch mode]\n",[282,1051,1052],{"class":284,"line":398},[282,1053,1054],{},"  C --> D{Allowed?}\n",[282,1056,1057],{"class":284,"line":404},[282,1058,1059],{},"  O --> D\n",[282,1061,1062],{"class":284,"line":409},[282,1063,1064],{},"  M --> D\n",[282,1066,1067],{"class":284,"line":415},[282,1068,1069],{},"  D -->|Yes| OK[Proceed + meter if needed]\n",[282,1071,1072],{"class":284,"line":421},[282,1073,1074],{},"  D -->|No| DENY[Structured deny + upgrade CTA]\n",[282,1076,1077],{"class":284,"line":427},[282,1078,1079],{},"  classDef ok fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[282,1081,1082],{"class":284,"line":432},[282,1083,1084],{},"  classDef deny fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n",[282,1086,1087],{"class":284,"line":438},[282,1088,1089],{},"  classDef decide fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[282,1091,1092],{"class":284,"line":444},[282,1093,1094],{},"  classDef input fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[282,1096,1097],{"class":284,"line":450},[282,1098,1099],{},"  class OK ok\n",[282,1101,1102],{"class":284,"line":456},[282,1103,1104],{},"  class DENY,X deny\n",[282,1106,1107],{"class":284,"line":462},[282,1108,1109],{},"  class F,D decide\n",[282,1111,1113],{"class":284,"line":1112},32,[282,1114,1115],{},"  class R,V,C,O,M input\n",[801,1117,1119],{"id":1118},"_33-denied-ux-is-part-of-the-engine",[108,1120,1121],{},"3.3 Denied UX is part of the engine",[99,1123,1125],{"className":1124},[102],[104,1126,1127],{},"Entitlement failure returns a clear upgrade / denied message, never a silent fail.",[99,1129,1131],{"className":1130},[102],[104,1132,1133,1135,1136,1138,1139,1138,1142,1138,1145,1148,1149,1152],{},[108,1134,823],{}," Standard deny payload: ",[243,1137,243],{},", ",[243,1140,1141],{},"limit",[243,1143,1144],{},"current",[243,1146,1147],{},"upgrade_to",", optional ",[243,1150,1151],{},"cta_url",". UI maps codes to copy (“Storage full — upgrade to Plus”). Log denials with tenant + capability for product/FinOps. Never raw 403 with an empty body.",[801,1154,1156],{"id":1155},"_34-meter-before-you-bill",[108,1157,1158],{},"3.4 Meter before you bill",[99,1160,1162],{"className":1161},[102],[104,1163,1164],{},"Even seat/subscription products meter for caps, fair use, and FinOps.",[99,1166,1168],{"className":1167},[102],[104,1169,1170,1172,1173,1138,1176,1138,1179,1138,1182,1185],{},[108,1171,823],{}," Emit usage events at the edges that cost money (email, storage, AI tokens, maps, outbound sync). Store ",[243,1174,1175],{},"tenant_id",[243,1177,1178],{},"metric",[243,1180,1181],{},"quantity",[243,1183,1184],{},"at",". Start with append-only events + admin totals — no invoice math required. Caps read the same meters later; billing rates them later.",[801,1187,1189],{"id":1188},"_35-overrides-are-first-class",[108,1190,1191],{},"3.5 Overrides are first-class",[99,1193,1195],{"className":1194},[102],[104,1196,1197,1198,1201],{},"Complimentary access, custom caps, extend trial — with ",[108,1199,1200],{},"audit",".",[99,1203,1205],{"className":1204},[102],[104,1206,1207,1209,1210,1138,1213,1138,1216,1138,1219,1222,1223,1226],{},[108,1208,823],{}," Model overrides as data on the tenant: ",[243,1211,1212],{},"plan_override",[243,1214,1215],{},"cap_overrides",[243,1217,1218],{},"complimentary_until",[243,1220,1221],{},"notes",". Admin UI writes them; every write appends ",[243,1224,1225],{},"who / when / what / before / after",". Resolver merges catalog defaults ← overrides. No hotfix branches for “give them Plus.”",[801,1228,1230],{"id":1229},"_36-growth-is-gated",[108,1231,1232],{},"3.6 Growth is gated",[99,1234,1236],{"className":1235},[102],[104,1237,1238],{},"Invite vs open, monetization mode, cost kill-switches — without redeploy.",[99,1240,1242],{"className":1241},[102],[104,1243,1244,1246,1247,1250,1251,1254],{},[108,1245,823],{}," Global settings table (or config service): ",[243,1248,1249],{},"registration_mode"," (invite / open), ",[243,1252,1253],{},"monetization_mode"," (soft_launch / trial_enforced / paid_enforced), kill-switches per expensive capability. Enforce on tenant create and on the costly features. Defaults match today’s soft-launch; flipping to paid is a settings change, not a release train.",[801,1256,1258],{"id":1257},"_37-cost-and-revenue-are-separate-ledgers",[108,1259,1260],{},"3.7 Cost and revenue are separate ledgers",[99,1262,1264],{"className":1263},[102],[104,1265,1266],{},"FinOps (what we pay) never replaces Pricing (what they pay).",[99,1268,1270],{"className":1269},[102],[104,1271,1272,1274,1275,1278,1279,1282],{},[108,1273,823],{}," Keep two views: ",[108,1276,1277],{},"revenue"," (plan, MRR, invoices) and ",[108,1280,1281],{},"cost"," (vendor invoices + allocated usage). Unit economics = cost per tenant vs price per tenant. When margin breaks, change package/price or kill-switch — don’t “fix” it by pretending cost is a plan feature.",[801,1284,1286],{"id":1285},"_38-legalize-before-charge",[108,1287,1288],{},"3.8 Legalize before charge",[99,1290,1292],{"className":1291},[102],[104,1293,1294,1295,1298],{},"Entity, tax/VAT, MoR vs Connect (or equivalent) as written policy ",[108,1296,1297],{},"before"," billing go-live.",[99,1300,1302],{"className":1301},[102],[104,1303,1304,1306],{},[108,1305,823],{}," One short go-live memo: who sells, who invoices, VAT treatment, MoR vs marketplace Connect, when books start recognizing revenue. Block production checkout until that memo exists. Product can finish Encode in parallel; Charge waits on the memo, not on perfect legal theatre forever.",[99,1308,1310],{"className":1309},[102],[104,1311,1312,1315,1316,1319,1320,1322],{},[108,1313,1314],{},"Commercial object (general):"," often the ",[108,1317,1318],{},"tenant / account / workspace"," is the primary SKU. Seats can appear later. Forcing “per user” as the only model early locks packaging into a shape that may not match how value (or cost) actually lands. ",[108,1321,823],{}," price and entitle the tenant first; add seat SKUs when seat cost or value is proven.",[207,1324],{},[99,1326,1328,1334],{"className":1327},[133,134,135],[137,1329,1331],{"id":1330},"_4-capability-map-three-layers",[108,1332,1333],{},"4. Capability map (three layers)",[104,1335,1336],{},[146,1337,1338],{"href":148},[108,1339,151],{},[99,1341,1343],{"className":1342},[102],[104,1344,1345,1346,1349],{},"You do not need ten product epics on day one. You do need three layers that stay distinct in ",[108,1347,1348],{},"design",", even when delivery is compressed.",[512,1351,1352,1365],{},[515,1353,1354],{},[518,1355,1356,1359,1362],{},[521,1357,1358],{},"Layer",[521,1360,1361],{},"Capabilities",[521,1363,1364],{},"Question",[528,1366,1367,1380,1397],{},[518,1368,1369,1374,1377],{},[533,1370,1371],{},[108,1372,1373],{},"Define",[533,1375,1376],{},"Product catalog & packaging",[533,1378,1379],{},"What SKUs/plans exist? Limits? Trial?",[518,1381,1382,1387,1390],{},[533,1383,1384],{},[108,1385,1386],{},"Enforce",[533,1388,1389],{},"Entitlements, growth/policy gates, admin overrides",[533,1391,1392,1393,1396],{},"What may ",[601,1394,1395],{},"this tenant"," do right now? Who may join? Can ops change it live?",[518,1398,1399,1404,1407],{},[533,1400,1401],{},[108,1402,1403],{},"Monetize & operate",[533,1405,1406],{},"Metering, billing, customer portal, FinOps, money-flow/compliance, RevOps",[533,1408,1409],{},"How do we charge, show usage, protect margin, stay legal?",[235,1411,1413],{"className":276,"code":1412,"language":278,"meta":241,"style":241},"---\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",[243,1414,1415,1419,1424,1428,1432,1437,1442,1447],{"__ignoreMap":241},[282,1416,1417],{"class":284,"line":285},[282,1418,288],{},[282,1420,1421],{"class":284,"line":291},[282,1422,1423],{},"header: Capability layers - Define, Enforce, Monetize\n",[282,1425,1426],{"class":284,"line":297},[282,1427,288],{},[282,1429,1430],{"class":284,"line":303},[282,1431,335],{},[282,1433,1434],{"class":284,"line":309},[282,1435,1436],{},"  D[\"1. Define - catalog and packaging\"]\n",[282,1438,1439],{"class":284,"line":315},[282,1440,1441],{},"  E[\"2. Enforce - entitlements, gates, admin\"]\n",[282,1443,1444],{"class":284,"line":321},[282,1445,1446],{},"  M[\"3. Monetize - meter, bill, portal, FinOps\"]\n",[282,1448,1449],{"class":284,"line":327},[282,1450,1451],{},"  D --> E --> M\n",[99,1453,1455,1463,1477,1482,1496,1505],{"className":1454},[102],[104,1456,1457,1459,1460,1462],{},[108,1458,1373],{}," is boring on purpose: versionable plans and limits. If ",[243,1461,831],{}," is a hand-written table that disagrees with runtime, you do not have a catalog — you have marketing.",[104,1464,1465,1468,1469,1472,1473,1476],{},[108,1466,1467],{},"Define — solution:"," single ",[243,1470,1471],{},"Catalog"," module exported to web, API, and (later) billing sync jobs. Snapshot or version ID on every entitlement resolution so audits know ",[601,1474,1475],{},"which"," catalog applied.",[104,1478,1479,1481],{},[108,1480,1386],{}," is where commercial truth meets the request path. Resolve plan → allowed modules / caps → allow or deny. Soft-launch can still mean “pilots get broad access,” but that must be an explicit override or mode — not “enforcement doesn’t exist yet.”",[104,1483,1484,1487,1488,1491,1492,1495],{},[108,1485,1486],{},"Enforce — solution:"," middleware / policy helper on every costly route; global growth settings + per-tenant overrides; pilot = ",[243,1489,1490],{},"complimentary"," or ",[243,1493,1494],{},"monetization_mode = soft_launch",", not missing checks.",[104,1497,1498,1500,1501,1504],{},[108,1499,1403],{}," is where money and margin live. It comes ",[108,1502,1503],{},"after"," Define + Enforce unless law forces billing first — and even then, catalog + entitlements remain the product source of truth.",[104,1506,1507,1510,1511,1514],{},[108,1508,1509],{},"Monetize — solution:"," MoR products cloned from catalog IDs; webhooks update ",[243,1512,1513],{},"tenant.plan"," / paid flags; portal reads the same catalog + meters. FinOps starts as spreadsheet + vendor dashboards; in-app budgets only after meters exist.",[99,1516,1518],{"className":1517},[102],[104,1519,1520,1523,1524,1527,1528,1531],{},[108,1521,1522],{},"Sequence rule:"," do not implement billing / portal before ",[108,1525,1526],{},"Define + Enforce",". ",[108,1529,1530],{},"Legal / money-flow policy comes before billing go-live",". Billing must not invent a second plan list.",[99,1533,1535],{"className":1534},[102],[104,1536,1537,1540,1541,1544,1545,1548,1549,1201],{},[108,1538,1539],{},"After you charge:"," subscription webhooks (or equivalent) are the source of truth for ",[601,1542,1543],{},"paid state"," — they update plan / entitlements. The billing provider maps ",[108,1546,1547],{},"1:1 to the catalog",". It is SoT for whether they paid; it is not SoT for what a plan ",[601,1550,1551],{},"means",[235,1553,1555],{"className":276,"code":1554,"language":278,"meta":241,"style":241},"---\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",[243,1556,1557,1561,1566,1570,1575,1580,1585,1590,1595,1600,1605,1610,1615,1620,1625],{"__ignoreMap":241},[282,1558,1559],{"class":284,"line":285},[282,1560,288],{},[282,1562,1563],{"class":284,"line":291},[282,1564,1565],{},"header: Checkout - catalog meaning vs MoR paid state\n",[282,1567,1568],{"class":284,"line":297},[282,1569,288],{},[282,1571,1572],{"class":284,"line":303},[282,1573,1574],{},"sequenceDiagram\n",[282,1576,1577],{"class":284,"line":309},[282,1578,1579],{},"  participant Buyer\n",[282,1581,1582],{"class":284,"line":315},[282,1583,1584],{},"  participant App\n",[282,1586,1587],{"class":284,"line":321},[282,1588,1589],{},"  participant MoR as Billing MoR\n",[282,1591,1592],{"class":284,"line":327},[282,1593,1594],{},"  participant Cat as Catalog\n",[282,1596,1597],{"class":284,"line":332},[282,1598,1599],{},"  participant Ent as Entitlements\n",[282,1601,1602],{"class":284,"line":338},[282,1603,1604],{},"  Buyer->>App: Checkout\n",[282,1606,1607],{"class":284,"line":344},[282,1608,1609],{},"  App->>Cat: Resolve plan SKU\n",[282,1611,1612],{"class":284,"line":350},[282,1613,1614],{},"  App->>MoR: Create or confirm subscription\n",[282,1616,1617],{"class":284,"line":356},[282,1618,1619],{},"  MoR-->>App: Webhook paid / renewed / canceled\n",[282,1621,1622],{"class":284,"line":362},[282,1623,1624],{},"  App->>Ent: Update tenant plan from webhook\n",[282,1626,1627],{"class":284,"line":368},[282,1628,1629],{},"  Note over Cat,Ent: MoR equals paid state - Catalog equals plan meaning\n",[207,1631],{},[99,1633,1635,1641],{"className":1634},[133,134,135],[137,1636,1638],{"id":1637},"_5-anti-patterns-and-the-fix",[108,1639,1640],{},"5. Anti-patterns — and the fix",[104,1642,1643],{},[146,1644,1645],{"href":148},[108,1646,151],{},[99,1648,1650],{"className":1649},[102],[104,1651,1652],{},"If the chain is the target, these shortcuts break it. Pair each with a concrete recovery move:",[512,1654,1655,1665],{},[515,1656,1657],{},[518,1658,1659,1662],{},[521,1660,1661],{},"Anti-pattern",[521,1663,1664],{},"Fix",[528,1666,1667,1677,1687,1697,1715,1725,1735],{},[518,1668,1669,1674],{},[533,1670,1671],{},[108,1672,1673],{},"Pricing page as the product",[533,1675,1676],{},"Drive the page from the catalog; delete duplicate hard-coded tiers",[518,1678,1679,1684],{},[533,1680,1681],{},[108,1682,1683],{},"Payment provider as second catalog",[533,1685,1686],{},"MoR SKUs = catalog IDs only; regenerate from catalog, never edit live in the dashboard as SoT",[518,1688,1689,1694],{},[533,1690,1691],{},[108,1692,1693],{},"Feature flags as entitlements",[533,1695,1696],{},"Split: flags for rollout, entitlement resolver for commercial allow/deny",[518,1698,1699,1704],{},[533,1700,1701],{},[108,1702,1703],{},"Hard-coded limits in random routes",[533,1705,1706,1707,1710,1711,1714],{},"Central caps table + one ",[243,1708,1709],{},"assertCap()"," / ",[243,1712,1713],{},"assertModule()"," helper",[518,1716,1717,1722],{},[533,1718,1719],{},[108,1720,1721],{},"Billing before catalog + entitlements",[533,1723,1724],{},"Freeze checkout; finish Encode; then map MoR 1:1",[518,1726,1727,1732],{},[533,1728,1729],{},[108,1730,1731],{},"Silent denial",[533,1733,1734],{},"Structured deny codes + upgrade CTA on API and UI",[518,1736,1737,1742],{},[533,1738,1739],{},[108,1740,1741],{},"Productizing everything early",[533,1743,1744],{},"Keep FinOps/RevOps as runbooks until meters and charge path exist",[99,1746,1748],{"className":1747},[102],[104,1749,1750],{},"Recovery order when you already have a mess:",[235,1752,1754],{"className":276,"code":1753,"language":278,"meta":241,"style":241},"---\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",[243,1755,1756,1760,1765,1769,1773],{"__ignoreMap":241},[282,1757,1758],{"class":284,"line":285},[282,1759,288],{},[282,1761,1762],{"class":284,"line":291},[282,1763,1764],{},"header: Recovery order when commercial architecture is a mess\n",[282,1766,1767],{"class":284,"line":297},[282,1768,288],{},[282,1770,1771],{"class":284,"line":303},[282,1772,696],{},[282,1774,1775],{"class":284,"line":309},[282,1776,1777],{},"  A[Extract catalog] --> B[One resolver] --> C[Centralize checks] --> D[Admin overrides] --> E[Webhooks = paid SoT]\n",[99,1779,1781],{"className":1780},[102],[104,1782,1783,1786,1787,1790,1791,1790,1794,1790,1797,1800],{},[108,1784,1785],{},"Extract"," from the pricing page and MoR dashboards → ",[108,1788,1789],{},"wire one resolver"," → ",[108,1792,1793],{},"move hard-coded checks behind it",[108,1795,1796],{},"add admin overrides",[108,1798,1799],{},"only then"," trust webhooks as paid-state SoT.",[207,1802],{},[99,1804,1806,1812],{"className":1805},[133,134,135],[137,1807,1809],{"id":1808},"_6-what-done-feels-like-in-ops",[108,1810,1811],{},"6. What “done” feels like in ops",[104,1813,1814],{},[146,1815,1816],{"href":148},[108,1817,151],{},[99,1819,1821,1824,1832],{"className":1820},[102],[104,1822,1823],{},"Architecture is abstract until ops can move without engineering.",[104,1825,1826,1827,201,1829,1831],{},"World-class feels like this: a pilot needs complimentary Plus for thirty days — ops flips a flag, sets an expiry, audit logs who and why. A vendor cost spike hits — someone toggles a kill-switch on an expensive integration without a Friday night deploy. Soft-launch closes — ",[243,1828,1249],{},[243,1830,1253],{}," change, and create-tenant / upgrade paths follow immediately.",[104,1833,1834,1835,1838],{},"If any of that still requires a hotfix branch, the chain is incomplete. Admin is not a nice-to-have UI; it is how ",[108,1836,1837],{},"overrides become first-class"," instead of tribal exceptions.",[207,1840],{},[99,1842,1844,1850],{"className":1843},[133,134,135],[137,1845,1847],{"id":1846},"_7-minimum-path-that-still-looks-standard",[108,1848,1849],{},"7. Minimum path that still looks standard",[104,1851,1852],{},[146,1853,1854],{"href":148},[108,1855,151],{},[99,1857,1859],{"className":1858},[102],[104,1860,1861,1862,1865],{},"Capacity is finite. You can still keep ",[108,1863,1864],{},"boundaries"," even when you combine delivery. The mistake is not shipping Encode in one milestone — it is shipping Encode + Stripe as one undifferentiated blob.",[512,1867,1868,1881],{},[515,1869,1870],{},[518,1871,1872,1875],{},[521,1873,1874],{},"Delivery slice",[521,1876,1877,1878,1880],{},"Keep separate in ",[601,1879,1348],{}," (even if shipped together)",[528,1882,1883,1892,1905],{},[518,1884,1885,1889],{},[533,1886,1887],{},[108,1888,183],{},[533,1890,1891],{},"Catalog + entitlements + growth gates + admin overrides",[518,1893,1894,1898],{},[533,1895,1896],{},[108,1897,187],{},[533,1899,1900,1901,1904],{},"Money-flow / compliance policy ",[108,1902,1903],{},"then"," billing (catalog ↔ subscriptions ↔ entitlements)",[518,1906,1907,1912],{},[533,1908,1909],{},[108,1910,1911],{},"Scale",[533,1913,1914],{},"Metering depth + customer portal (+ optional in-app FinOps)",[235,1916,1918],{"className":276,"code":1917,"language":278,"meta":241,"style":241},"---\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",[243,1919,1920,1924,1929,1933,1937,1942,1946,1951,1955,1960,1964,1968,1973,1978,1982,1987,1992,1996,2001,2006,2010,2015,2020,2025,2030,2035,2040],{"__ignoreMap":241},[282,1921,1922],{"class":284,"line":285},[282,1923,288],{},[282,1925,1926],{"class":284,"line":291},[282,1927,1928],{},"header: Encode, Charge, Scale delivery path\n",[282,1930,1931],{"class":284,"line":297},[282,1932,300],{},[282,1934,1935],{"class":284,"line":303},[282,1936,306],{},[282,1938,1939],{"class":284,"line":309},[282,1940,1941],{},"    text: \"Encode\"\n",[282,1943,1944],{"class":284,"line":315},[282,1945,863],{},[282,1947,1948],{"class":284,"line":321},[282,1949,1950],{},"    text: \"Charge\"\n",[282,1952,1953],{"class":284,"line":327},[282,1954,986],{},[282,1956,1957],{"class":284,"line":332},[282,1958,1959],{},"    text: \"Scale\"\n",[282,1961,1962],{"class":284,"line":338},[282,1963,288],{},[282,1965,1966],{"class":284,"line":344},[282,1967,696],{},[282,1969,1970],{"class":284,"line":350},[282,1971,1972],{},"  subgraph Encode\n",[282,1974,1975],{"class":284,"line":356},[282,1976,1977],{},"    A1[Catalog] --- A2[Entitlements] --- A3[Gates] --- A4[Admin]\n",[282,1979,1980],{"class":284,"line":362},[282,1981,395],{},[282,1983,1984],{"class":284,"line":368},[282,1985,1986],{},"  subgraph Charge\n",[282,1988,1989],{"class":284,"line":374},[282,1990,1991],{},"    B1[Legalize] --> B2[Subscribe] --> B3[Webhooks update plan]\n",[282,1993,1994],{"class":284,"line":380},[282,1995,395],{},[282,1997,1998],{"class":284,"line":386},[282,1999,2000],{},"  subgraph Scale\n",[282,2002,2003],{"class":284,"line":392},[282,2004,2005],{},"    C1[Meters] --> C2[Portal] --> C3[Optional FinOps UI]\n",[282,2007,2008],{"class":284,"line":398},[282,2009,395],{},[282,2011,2012],{"class":284,"line":404},[282,2013,2014],{},"  Encode --> Charge --> Scale\n",[282,2016,2017],{"class":284,"line":409},[282,2018,2019],{},"  classDef encode fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[282,2021,2022],{"class":284,"line":415},[282,2023,2024],{},"  classDef charge fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[282,2026,2027],{"class":284,"line":421},[282,2028,2029],{},"  classDef scale fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[282,2031,2032],{"class":284,"line":427},[282,2033,2034],{},"  class A1,A2,A3,A4 encode\n",[282,2036,2037],{"class":284,"line":432},[282,2038,2039],{},"  class B1,B2,B3 charge\n",[282,2041,2042],{"class":284,"line":438},[282,2043,2044],{},"  class C1,C2,C3 scale\n",[99,2046,2048,2053,2062,2068,2074,2079],{"className":2047},[102],[104,2049,2050,2052],{},[108,2051,183],{}," is the soft-launch bar that still looks industry-shaped: one catalog, enforce on the request path, gate growth, let ops override with audit. You may not charge yet — and that is fine.",[104,2054,2055,2058,2059,2061],{},[108,2056,2057],{},"Encode — playbook:"," (1) catalog model + ",[243,2060,831],{}," wired, (2) entitlement resolver + tests for Free vs Paid vs pilot, (3) global registration/monetization settings, (4) admin plan/override/audit UI. Ship as four workstreams in one milestone if needed — never as one undifferentiated blob FR.",[104,2063,2064,2067],{},[108,2065,2066],{},"Charge order:"," legalize → subscribe / renew / cancel → webhook updates plan. Never “create products in the MoR first and reverse-engineer a catalog later.”",[104,2069,2070,2073],{},[108,2071,2072],{},"Charge — playbook:"," go-live memo → clone catalog into MoR → checkout path → webhooks → thin “pay / manage” UX. Portal polish waits for Scale.",[104,2075,2076,2078],{},[108,2077,1911],{}," is when customers see usage and invoices in-product, meters get richer, and FinOps may move from spreadsheets into alerts. Optional — not a prerequisite for taking money cleanly.",[104,2080,2081,2084],{},[108,2082,2083],{},"Scale — playbook:"," deepen meters (admin first) → customer usage + invoices → optional budget alerts tied to kill-switches.",[99,2086,2088],{"className":2087},[102],[104,2089,2090,2093],{},[108,2091,2092],{},"Parallel ops track (not product):"," monthly vendor-bill review, first-customer margin discipline, and RevOps playbooks can run as runbooks while Encode ships. Don’t wait on an in-app FinOps UI to practice cost hygiene — and don’t confuse those rituals with the commercial chain itself.",[207,2095],{},[99,2097,2099,2105],{"className":2098},[133,134,135],[137,2100,2102],{"id":2101},"_8-definition-of-done",[108,2103,2104],{},"8. Definition of done",[104,2106,2107],{},[146,2108,2109],{"href":148},[108,2110,151],{},[99,2112,2114],{"className":2113},[102],[104,2115,2116],{},"Use this as a bar, not a vanity checklist. The commercial architecture is “real” when:",[156,2118,2121,2135,2141,2151,2161,2171,2180,2186,2196],{"className":2119},[2120],"contains-task-list",[159,2122,2125,2130,2131,2134],{"className":2123},[2124],"task-list-item",[2126,2127],"input",{"disabled":2128,"type":2129},true,"checkbox"," Changing a plan limit does ",[108,2132,2133],{},"not"," require hunting hard-coded checks in random routes",[159,2136,2138,2140],{"className":2137},[2124],[2126,2139],{"disabled":2128,"type":2129}," Denied entitlements surface a clear upgrade / denied path — never a silent fail",[159,2142,2144,2146,2147,2150],{"className":2143},[2124],[2126,2145],{"disabled":2128,"type":2129}," Ops can grant complimentary access or freeze a costly capability ",[108,2148,2149],{},"without"," a deploy",[159,2152,2154,2156,2157,2160],{"className":2153},[2124],[2126,2155],{"disabled":2128,"type":2129}," Pricing page, admin, and (later) billing show the ",[108,2158,2159],{},"same"," catalog",[159,2162,2164,2166,2167,2170],{"className":2163},[2124],[2126,2165],{"disabled":2128,"type":2129}," Registration / monetization mode / kill-switches are ",[108,2168,2169],{},"platform settings",", not tribal memory",[159,2172,2174,2176,2177,2179],{"className":2173},[2124],[2126,2175],{"disabled":2128,"type":2129}," Money-flow policy (entity, tax, MoR) exists ",[108,2178,1297],{}," the first real charge",[159,2181,2183,2185],{"className":2182},[2124],[2126,2184],{"disabled":2128,"type":2129}," Paid state flows billing events → plan / entitlements (no second plan list in the MoR)",[159,2187,2189,2191,2192,2195],{"className":2188},[2124],[2126,2190],{"disabled":2128,"type":2129}," Usage that costs money is ",[108,2193,2194],{},"visible"," before the invoice surprises you",[159,2197,2199,2201,2202,2205],{"className":2198},[2124],[2126,2200],{"disabled":2128,"type":2129}," A FinOps soft ceiling can trigger a ",[108,2203,2204],{},"kill-switch",", not only a Slack panic",[207,2207],{},[99,2209,2211,2217],{"className":2210},[133,134,135],[137,2212,2214],{"id":2213},"_9-cheat-sheet",[108,2215,2216],{},"9. Cheat sheet",[104,2218,2219],{},[146,2220,2221],{"href":148},[108,2222,151],{},[99,2224,2226],{"className":2225},[102],[104,2227,2228],{},"Screenshot this. It is the whole article in one card.",[235,2230,2233],{"className":2231,"code":2232,"language":240,"meta":241},[238],"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",[243,2234,2232],{"__ignoreMap":241},[99,2236,2238],{"className":2237},[102],[104,2239,2240],{},[601,2241,2242],{},"A pricing page sells the story. Commercial architecture makes it enforceable.",[207,2244],{},[99,2246,2248,2254],{"className":2247},[133,134,135],[137,2249,2251],{"id":2250},"_10-start-monday",[108,2252,2253],{},"10. Start Monday",[104,2255,2256],{},[146,2257,2258],{"href":148},[108,2259,151],{},[99,2261,2263],{"className":2262},[102],[104,2264,2265],{},"Five moves that start Encode without waiting on Stripe:",[2267,2268,2269,2275,2281,2290,2301],"ol",{},[159,2270,2271,2274],{},[108,2272,2273],{},"List every hard-coded limit"," — search routes for plan names, caps, and “if Pro…” checks; put them on one page.",[159,2276,2277,2280],{},[108,2278,2279],{},"Name the commercial object"," — tenant / account / workspace (seats later unless proven).",[159,2282,2283,2286,2287,2289],{},[108,2284,2285],{},"Draft catalog IDs"," — Free / Trial / Paid… with limits and trial rules; wire ",[243,2288,831],{}," to that model only.",[159,2291,2292,2295,2296,1138,2298,2300],{},[108,2293,2294],{},"Pick the knobs"," — ",[243,2297,1249],{},[243,2299,1253],{},", and which expensive features get kill-switches.",[159,2302,2303,2306],{},[108,2304,2305],{},"Name who can override"," — one ops owner for complimentary / cap overrides + an audit log habit (even a spreadsheet at first).",[99,2308,2310],{"className":2309},[102],[104,2311,2312],{},"When those five are true, you have the skeleton of Encode. Charge is a later decision — not a substitute for this work.",[207,2314],{},[99,2316,2318,2324],{"className":2317},[133,134,135],[137,2319,2321],{"id":2320},"_11-closing",[108,2322,2323],{},"11. Closing",[104,2325,2326],{},[146,2327,2328],{"href":148},[108,2329,151],{},[99,2331,2333,2336,2342],{"className":2332},[102],[104,2334,2335],{},"A pricing page sells the story. Stripe (or any MoR) moves the money. Neither is the architecture.",[104,2337,2338,2341],{},[108,2339,2340],{},"Commercial architecture"," is the chain — catalog → agreement → provision → entitlements → meter → bill → cash — plus the cost loop, plus the actors who own each link. Build Define and Enforce before you celebrate Charge. Keep one catalog. Treat overrides and growth gates as product, not folklore.",[104,2343,2344],{},"That shape works on any project. The names of plans and providers will change. The chain should not.",[156,2346,2347,2353,2359],{},[159,2348,2349],{},[146,2350,2352],{"href":2351},"/blog/architecture","Explore Architecture",[159,2354,2355],{},[146,2356,2358],{"href":2357},"/blog/strategy","Explore Strategy",[159,2360,2361],{},[146,2362,2364],{"href":2363},"/blog/scalability","Explore Scalability",[99,2366,2372],{"className":2367},[2368,2369,2370,2371],"text-md","text-center","mt-10","font-bold",[104,2373,2374],{},[146,2375,2376],{"href":148},[108,2377,151],{},[2379,2380,2381],"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":241,"searchDepth":291,"depth":291,"links":2383},[2384,2385,2386,2387,2397,2398,2399,2400,2401,2402,2403,2404],{"id":139,"depth":291,"text":142},{"id":214,"depth":291,"text":217},{"id":491,"depth":291,"text":494},{"id":780,"depth":291,"text":783,"children":2388},[2389,2390,2391,2392,2393,2394,2395,2396],{"id":803,"depth":297,"text":806},{"id":933,"depth":297,"text":936},{"id":1118,"depth":297,"text":1121},{"id":1155,"depth":297,"text":1158},{"id":1188,"depth":297,"text":1191},{"id":1229,"depth":297,"text":1232},{"id":1257,"depth":297,"text":1260},{"id":1285,"depth":297,"text":1288},{"id":1330,"depth":291,"text":1333},{"id":1637,"depth":291,"text":1640},{"id":1808,"depth":291,"text":1811},{"id":1846,"depth":291,"text":1849},{"id":2101,"depth":291,"text":2104},{"id":2213,"depth":291,"text":2216},{"id":2250,"depth":291,"text":2253},{"id":2320,"depth":291,"text":2323},"2026-09-19","Monetization is a governed chain with clear actors — product, GTM, platform, ops, billing, customer, FinOps, legal — not a pricing page and not “add Stripe later.”","md",{"src":2409},"/blog/archi/bff.png",{},{"title":55,"description":2406},"1Sv0PeeeVzFfJdx6sOw-BTpAG5-LDcHn0YilKuF0xRs",[2414,2415],"es","fr",[2417,3275],{"id":2418,"title":51,"authors":2419,"badge":2422,"body":2424,"date":3268,"description":3269,"extension":2407,"image":3270,"meta":3272,"navigation":2128,"path":52,"seo":3273,"stem":53,"__hash__":3274},"posts_en/en/blog/building-one-front.md",[2420],{"name":83,"description":84,"to":85,"avatar":2421},{"src":87},{"label":2423,"color":90,"variant":91},"Case study",{"type":93,"value":2425,"toc":3260},[2426,2428,2449,2464,2474,2547,2560,2627,2633,2648,2658,2769,2784,2824,2839,2867,2934,2947,2962,2990,2993,3058,3067,3133,3139,3205,3218,3233,3258],[96,2427],{},[99,2429,2431,2438],{"className":2430},[102],[104,2432,2433,2434,2437],{},"I do not remember one-front as a roadmap. I remember it as ",[108,2435,2436],{},"time"," — loud weeks, long quiet stretches, then another spike when something needed a place on the internet.",[104,2439,2440,2441,2444,2445,2448],{},"This post is that trail made readable: ",[108,2442,2443],{},"~227 commits"," on one domain, then what ",[108,2446,2447],{},"~2.8K"," visitors actually did. Not a feature tour — a record of when the site was alive, and when it was not.",[99,2450,2452,2458],{"className":2451},[133,134,135],[137,2453,2455],{"id":2454},"when-the-work-happened",[108,2456,2457],{},"When the work happened",[104,2459,2460],{},[146,2461,2462],{"href":148},[108,2463,151],{},[99,2465,2467],{"className":2466},[102],[104,2468,2469,2470,2473],{},"By quarter, the pattern is obvious. Two quiet seasons, then a rebuild, a writing stretch, a CV sprint, and quieter shipping again. Empty quarters are not missing data — they are months with ",[108,2471,2472],{},"zero"," commits.",[235,2475,2477],{"className":276,"code":2476,"language":278,"meta":241,"style":241},"---\nconfig:\n  xyChart:\n    width: 900\n    height: 300\n  themeVariables:\n    xyChart:\n      plotColorPalette: \"#4A7CD8\"\n---\nxychart-beta\n  title \"Commits by quarter — silence is a real bar (height 0)\"\n  x-axis [\"Q3'24\", \"Q4'24\", \"Q1'25\", \"Q2'25\", \"Q3'25\", \"Q4'25\", \"Q1'26\", \"Q2'26\", \"Q3'26\"]\n  y-axis \"Commits\" 0 --> 130\n  bar [8, 0, 0, 123, 9, 7, 72, 3, 5]\n",[243,2478,2479,2483,2488,2493,2498,2503,2508,2513,2518,2522,2527,2532,2537,2542],{"__ignoreMap":241},[282,2480,2481],{"class":284,"line":285},[282,2482,288],{},[282,2484,2485],{"class":284,"line":291},[282,2486,2487],{},"config:\n",[282,2489,2490],{"class":284,"line":297},[282,2491,2492],{},"  xyChart:\n",[282,2494,2495],{"class":284,"line":303},[282,2496,2497],{},"    width: 900\n",[282,2499,2500],{"class":284,"line":309},[282,2501,2502],{},"    height: 300\n",[282,2504,2505],{"class":284,"line":315},[282,2506,2507],{},"  themeVariables:\n",[282,2509,2510],{"class":284,"line":321},[282,2511,2512],{},"    xyChart:\n",[282,2514,2515],{"class":284,"line":327},[282,2516,2517],{},"      plotColorPalette: \"#4A7CD8\"\n",[282,2519,2520],{"class":284,"line":332},[282,2521,288],{},[282,2523,2524],{"class":284,"line":338},[282,2525,2526],{},"xychart-beta\n",[282,2528,2529],{"class":284,"line":344},[282,2530,2531],{},"  title \"Commits by quarter — silence is a real bar (height 0)\"\n",[282,2533,2534],{"class":284,"line":350},[282,2535,2536],{},"  x-axis [\"Q3'24\", \"Q4'24\", \"Q1'25\", \"Q2'25\", \"Q3'25\", \"Q4'25\", \"Q1'26\", \"Q2'26\", \"Q3'26\"]\n",[282,2538,2539],{"class":284,"line":356},[282,2540,2541],{},"  y-axis \"Commits\" 0 --> 130\n",[282,2543,2544],{"class":284,"line":362},[282,2545,2546],{},"  bar [8, 0, 0, 123, 9, 7, 72, 3, 5]\n",[99,2548,2550],{"className":2549},[102],[104,2551,2552,2555,2556,2559],{},[108,2553,2554],{},"Q2 2025"," (rebuild + content) and ",[108,2557,2558],{},"Q1 2026"," (CV as product) dominate. Everything else is maintenance or pause. Concentration makes that sharper:",[235,2561,2563],{"className":276,"code":2562,"language":278,"meta":241,"style":241},"---\nconfig:\n  xyChart:\n    width: 900\n    height: 260\n  themeVariables:\n    xyChart:\n      plotColorPalette: \"#1D4ED8\"\n---\nxychart-beta\n  title \"Commit concentration — 3 peak months = 70% of all commits\"\n  x-axis [\"Apr'25 + Jun'25 + Jan'26\", \"Other 11 active months\"]\n  y-axis \"Commits\" 0 --> 180\n  bar [160, 67]\n",[243,2564,2565,2569,2573,2577,2581,2586,2590,2594,2599,2603,2607,2612,2617,2622],{"__ignoreMap":241},[282,2566,2567],{"class":284,"line":285},[282,2568,288],{},[282,2570,2571],{"class":284,"line":291},[282,2572,2487],{},[282,2574,2575],{"class":284,"line":297},[282,2576,2492],{},[282,2578,2579],{"class":284,"line":303},[282,2580,2497],{},[282,2582,2583],{"class":284,"line":309},[282,2584,2585],{},"    height: 260\n",[282,2587,2588],{"class":284,"line":315},[282,2589,2507],{},[282,2591,2592],{"class":284,"line":321},[282,2593,2512],{},[282,2595,2596],{"class":284,"line":327},[282,2597,2598],{},"      plotColorPalette: \"#1D4ED8\"\n",[282,2600,2601],{"class":284,"line":332},[282,2602,288],{},[282,2604,2605],{"class":284,"line":338},[282,2606,2526],{},[282,2608,2609],{"class":284,"line":344},[282,2610,2611],{},"  title \"Commit concentration — 3 peak months = 70% of all commits\"\n",[282,2613,2614],{"class":284,"line":350},[282,2615,2616],{},"  x-axis [\"Apr'25 + Jun'25 + Jan'26\", \"Other 11 active months\"]\n",[282,2618,2619],{"class":284,"line":356},[282,2620,2621],{},"  y-axis \"Commits\" 0 --> 180\n",[282,2623,2624],{"class":284,"line":362},[282,2625,2626],{},"  bar [160, 67]\n",[99,2628,2630],{"className":2629},[102],[104,2631,2632],{},"April 2025 (58), June 2025 (42), and January 2026 (60) are most of the repo. A personal site without a habit surface goes dark; the chart is just the receipt.",[99,2634,2636,2642],{"className":2635},[133,134,135],[137,2637,2639],{"id":2638},"what-changed-the-product",[108,2640,2641],{},"What changed the product",[104,2643,2644],{},[146,2645,2646],{"href":148},[108,2647,151],{},[99,2649,2651],{"className":2650},[102],[104,2652,2653,2654,2657],{},"If you keep only the commits that changed what the site ",[601,2655,2656],{},"is",", the path is short:",[235,2659,2661],{"className":276,"code":2660,"language":278,"meta":241,"style":241},"---\nheader: Product milestones — Aug 2024 → Sep 2026\nconfig:\n  theme: 'default'\n  themeVariables:\n    'git0': '#4A7CD8'\n    'git1': '#633486'\n    'git2': '#566F97'\n---\ngitGraph LR:\n    commit id: \"init site\" tag: \"2024-08\" type: HIGHLIGHT\n    commit id: \"contact + light mode\" tag: \"2024-09\"\n    commit id: \"pause\" tag: \"quiet\"\n    commit id: \"Nuxt rebuild\" tag: \"2025-04\" type: HIGHLIGHT\n    commit id: \"deploy pipeline\" type: REVERSE\n    commit id: \"blog + i18n\"\n    commit id: \"RnD index\" tag: \"2025-05\"\n    commit id: \"MCP writing\" tag: \"2025-06\" type: HIGHLIGHT\n    commit id: \"CV product\" tag: \"2026-01\" type: HIGHLIGHT\n    commit id: \"CI + Sentry\" tag: \"2026-02\"\n    commit id: \"Audit4 / Vibe / Overvibing\" tag: \"2026-04\" type: HIGHLIGHT\n    commit id: \"positioning refresh\" tag: \"2026-09\" type: HIGHLIGHT\n",[243,2662,2663,2667,2672,2676,2681,2685,2690,2695,2700,2704,2709,2714,2719,2724,2729,2734,2739,2744,2749,2754,2759,2764],{"__ignoreMap":241},[282,2664,2665],{"class":284,"line":285},[282,2666,288],{},[282,2668,2669],{"class":284,"line":291},[282,2670,2671],{},"header: Product milestones — Aug 2024 → Sep 2026\n",[282,2673,2674],{"class":284,"line":297},[282,2675,2487],{},[282,2677,2678],{"class":284,"line":303},[282,2679,2680],{},"  theme: 'default'\n",[282,2682,2683],{"class":284,"line":309},[282,2684,2507],{},[282,2686,2687],{"class":284,"line":315},[282,2688,2689],{},"    'git0': '#4A7CD8'\n",[282,2691,2692],{"class":284,"line":321},[282,2693,2694],{},"    'git1': '#633486'\n",[282,2696,2697],{"class":284,"line":327},[282,2698,2699],{},"    'git2': '#566F97'\n",[282,2701,2702],{"class":284,"line":332},[282,2703,288],{},[282,2705,2706],{"class":284,"line":338},[282,2707,2708],{},"gitGraph LR:\n",[282,2710,2711],{"class":284,"line":344},[282,2712,2713],{},"    commit id: \"init site\" tag: \"2024-08\" type: HIGHLIGHT\n",[282,2715,2716],{"class":284,"line":350},[282,2717,2718],{},"    commit id: \"contact + light mode\" tag: \"2024-09\"\n",[282,2720,2721],{"class":284,"line":356},[282,2722,2723],{},"    commit id: \"pause\" tag: \"quiet\"\n",[282,2725,2726],{"class":284,"line":362},[282,2727,2728],{},"    commit id: \"Nuxt rebuild\" tag: \"2025-04\" type: HIGHLIGHT\n",[282,2730,2731],{"class":284,"line":368},[282,2732,2733],{},"    commit id: \"deploy pipeline\" type: REVERSE\n",[282,2735,2736],{"class":284,"line":374},[282,2737,2738],{},"    commit id: \"blog + i18n\"\n",[282,2740,2741],{"class":284,"line":380},[282,2742,2743],{},"    commit id: \"RnD index\" tag: \"2025-05\"\n",[282,2745,2746],{"class":284,"line":386},[282,2747,2748],{},"    commit id: \"MCP writing\" tag: \"2025-06\" type: HIGHLIGHT\n",[282,2750,2751],{"class":284,"line":392},[282,2752,2753],{},"    commit id: \"CV product\" tag: \"2026-01\" type: HIGHLIGHT\n",[282,2755,2756],{"class":284,"line":398},[282,2757,2758],{},"    commit id: \"CI + Sentry\" tag: \"2026-02\"\n",[282,2760,2761],{"class":284,"line":404},[282,2762,2763],{},"    commit id: \"Audit4 / Vibe / Overvibing\" tag: \"2026-04\" type: HIGHLIGHT\n",[282,2765,2766],{"class":284,"line":409},[282,2767,2768],{},"    commit id: \"positioning refresh\" tag: \"2026-09\" type: HIGHLIGHT\n",[99,2770,2772,2778],{"className":2771},[133,134,135],[137,2773,2775],{"id":2774},"timeline-in-plain-language",[108,2776,2777],{},"Timeline in plain language",[104,2779,2780],{},[146,2781,2782],{"href":148},[108,2783,151],{},[99,2785,2787,2793,2799,2805,2811,2817],{"className":2786},[102],[104,2788,2789,2792],{},[108,2790,2791],{},"2024"," — Domain, contact, light mode. Then silence. LinkedIn still carried more attention than the site.",[104,2794,2795,2798],{},[108,2796,2797],{},"Spring 2025"," — Rebuild on Nuxt. Deploy and config work that looks noisy in git and was necessary in production. Blog in Markdown, translations when a post earned them, RnD when polished “Projects” felt dishonest.",[104,2800,2801,2804],{},[108,2802,2803],{},"Summer 2025"," — Writing season: MCP, testing, architecture. Some posts also ship as audio: blog → ElevenLabs → Spotify → embed.",[104,2806,2807,2810],{},[108,2808,2809],{},"January 2026"," — CV treated as a product: hydration, print, locales, process discipline so the week stayed shippable.",[104,2812,2813,2816],{},[108,2814,2815],{},"Later"," — Experiments live under RnD (Audit4, Vibe Drawing, Overvibing). Positioning catches up: system design and GenAI, not a freelance brochure.",[104,2818,2819,2820,2823],{},"Time moved in ",[108,2821,2822],{},"spikes and silence",", not in a smooth feature roadmap.",[99,2825,2827,2833],{"className":2826},[133,134,135],[137,2828,2830],{"id":2829},"what-git-can-and-cannot-say-about-ai",[108,2831,2832],{},"What git can (and cannot) say about AI",[104,2834,2835],{},[146,2836,2837],{"href":148},[108,2838,151],{},[99,2840,2842,2845],{"className":2841},[102],[104,2843,2844],{},"A “% built with AI” chart would be fiction. Git does not know that.",[104,2846,2847,2848,2851,2852,2855,2856,2859,2860,2863,2864,1201],{},"What it ",[601,2849,2850],{},"can"," show: commits that carry a Cursor trailer (",[243,2853,2854],{},"Co-authored-by: Cursor","). On this repo that is ",[108,2857,2858],{},"19 / 227"," (~",[108,2861,2862],{},"8%","), starting only in ",[108,2865,2866],{},"February 2026",[235,2868,2870],{"className":276,"code":2869,"language":278,"meta":241,"style":241},"---\nconfig:\n  xyChart:\n    width: 900\n    height: 280\n  themeVariables:\n    xyChart:\n      plotColorPalette: \"#633486\"\n---\nxychart-beta\n  title \"Cursor-tagged commits only — 19 of 227 total (~8%)\"\n  x-axis [\"Feb'26 (12)\", \"Apr'26 (1)\", \"May'26 (2)\", \"Sep'26 (5)\"]\n  y-axis \"Tagged commits\" 0 --> 14\n  bar [12, 1, 2, 5]\n",[243,2871,2872,2876,2880,2884,2888,2893,2897,2901,2906,2910,2914,2919,2924,2929],{"__ignoreMap":241},[282,2873,2874],{"class":284,"line":285},[282,2875,288],{},[282,2877,2878],{"class":284,"line":291},[282,2879,2487],{},[282,2881,2882],{"class":284,"line":297},[282,2883,2492],{},[282,2885,2886],{"class":284,"line":303},[282,2887,2497],{},[282,2889,2890],{"class":284,"line":309},[282,2891,2892],{},"    height: 280\n",[282,2894,2895],{"class":284,"line":315},[282,2896,2507],{},[282,2898,2899],{"class":284,"line":321},[282,2900,2512],{},[282,2902,2903],{"class":284,"line":327},[282,2904,2905],{},"      plotColorPalette: \"#633486\"\n",[282,2907,2908],{"class":284,"line":332},[282,2909,288],{},[282,2911,2912],{"class":284,"line":338},[282,2913,2526],{},[282,2915,2916],{"class":284,"line":344},[282,2917,2918],{},"  title \"Cursor-tagged commits only — 19 of 227 total (~8%)\"\n",[282,2920,2921],{"class":284,"line":350},[282,2922,2923],{},"  x-axis [\"Feb'26 (12)\", \"Apr'26 (1)\", \"May'26 (2)\", \"Sep'26 (5)\"]\n",[282,2925,2926],{"class":284,"line":356},[282,2927,2928],{},"  y-axis \"Tagged commits\" 0 --> 14\n",[282,2930,2931],{"class":284,"line":362},[282,2932,2933],{},"  bar [12, 1, 2, 5]\n",[99,2935,2937],{"className":2936},[102],[104,2938,2939,2940,2943,2944,2946],{},"This proves when Cursor ",[601,2941,2942],{},"signed"," a commit. It does ",[108,2945,2133],{}," prove AI help without a trailer, how much of a commit was generated, or work outside git (including the voice pipeline). Treat it as a limited, honest signal — not a productivity score.",[99,2948,2950,2956],{"className":2949},[133,134,135],[137,2951,2953],{"id":2952},"what-visitors-did",[108,2954,2955],{},"What visitors did",[104,2957,2958],{},[146,2959,2960],{"href":148},[108,2961,151],{},[99,2963,2965],{"className":2964},[102],[104,2966,2967,2970,2971,2974,2975,2977,2978,2981,2982,2985,2986,2989],{},[108,2968,2969],{},"Method (GA4 snapshot):"," property-wide active users ≈ ",[108,2972,2973],{},"2.8K",", new users ≈ ",[108,2976,2973],{},", events ≈ ",[108,2979,2980],{},"40K",", average engagement ≈ ",[108,2983,2984],{},"1m 29s",". Almost no returning users. Geography below uses named city rows from the export, rolled to country/region; everyone else is ",[108,2987,2988],{},"Other"," — not invented city-level detail.",[2991,2992],"ga-visitors-map",{},[235,2994,2996],{"className":276,"code":2995,"language":278,"meta":241,"style":241},"---\nconfig:\n  xyChart:\n    width: 900\n    height: 280\n  themeVariables:\n    xyChart:\n      plotColorPalette: \"#1D4ED8\"\n---\nxychart-beta\n  title \"Users by country — named GA rows + Other (sums to ~2.8K)\"\n  x-axis [\"Poland 20%\", \"US 17%\", \"Singapore 5%\", \"France 3%\", \"China 3%\", \"Other 52%\"]\n  y-axis \"Users\" 0 --> 1600\n  bar [554, 484, 143, 82, 76, 1461]\n",[243,2997,2998,3002,3006,3010,3014,3018,3022,3026,3030,3034,3038,3043,3048,3053],{"__ignoreMap":241},[282,2999,3000],{"class":284,"line":285},[282,3001,288],{},[282,3003,3004],{"class":284,"line":291},[282,3005,2487],{},[282,3007,3008],{"class":284,"line":297},[282,3009,2492],{},[282,3011,3012],{"class":284,"line":303},[282,3013,2497],{},[282,3015,3016],{"class":284,"line":309},[282,3017,2892],{},[282,3019,3020],{"class":284,"line":315},[282,3021,2507],{},[282,3023,3024],{"class":284,"line":321},[282,3025,2512],{},[282,3027,3028],{"class":284,"line":327},[282,3029,2598],{},[282,3031,3032],{"class":284,"line":332},[282,3033,288],{},[282,3035,3036],{"class":284,"line":338},[282,3037,2526],{},[282,3039,3040],{"class":284,"line":344},[282,3041,3042],{},"  title \"Users by country — named GA rows + Other (sums to ~2.8K)\"\n",[282,3044,3045],{"class":284,"line":350},[282,3046,3047],{},"  x-axis [\"Poland 20%\", \"US 17%\", \"Singapore 5%\", \"France 3%\", \"China 3%\", \"Other 52%\"]\n",[282,3049,3050],{"class":284,"line":356},[282,3051,3052],{},"  y-axis \"Users\" 0 --> 1600\n",[282,3054,3055],{"class":284,"line":362},[282,3056,3057],{},"  bar [554, 484, 143, 82, 76, 1461]\n",[99,3059,3061],{"className":3060},[102],[104,3062,3063,3064,3066],{},"Poland (Warsaw) is the largest named city. The US city rows include names that often correlate with hosting or bot noise — counted in the total, interpreted cautiously. ",[108,3065,2988],{}," is still real traffic; the export simply did not list those cities.",[235,3068,3070],{"className":276,"code":3069,"language":278,"meta":241,"style":241},"---\nconfig:\n  xyChart:\n    width: 900\n    height: 300\n  themeVariables:\n    xyChart:\n      plotColorPalette: \"#0F766E\"\n---\nxychart-beta\n  title \"Top pages — homepage ≈ 58% of views in this set\"\n  x-axis [\"Home 58%\", \"Blog 15%\", \"ONE-FRONT 15%\", \"Product CV 6%\", \"Resume 5%\", \"Bankly 2%\"]\n  y-axis \"Views\" 0 --> 11000\n  bar [9900, 2500, 2500, 950, 780, 423]\n",[243,3071,3072,3076,3080,3084,3088,3092,3096,3100,3105,3109,3113,3118,3123,3128],{"__ignoreMap":241},[282,3073,3074],{"class":284,"line":285},[282,3075,288],{},[282,3077,3078],{"class":284,"line":291},[282,3079,2487],{},[282,3081,3082],{"class":284,"line":297},[282,3083,2492],{},[282,3085,3086],{"class":284,"line":303},[282,3087,2497],{},[282,3089,3090],{"class":284,"line":309},[282,3091,2502],{},[282,3093,3094],{"class":284,"line":315},[282,3095,2507],{},[282,3097,3098],{"class":284,"line":321},[282,3099,2512],{},[282,3101,3102],{"class":284,"line":327},[282,3103,3104],{},"      plotColorPalette: \"#0F766E\"\n",[282,3106,3107],{"class":284,"line":332},[282,3108,288],{},[282,3110,3111],{"class":284,"line":338},[282,3112,2526],{},[282,3114,3115],{"class":284,"line":344},[282,3116,3117],{},"  title \"Top pages — homepage ≈ 58% of views in this set\"\n",[282,3119,3120],{"class":284,"line":350},[282,3121,3122],{},"  x-axis [\"Home 58%\", \"Blog 15%\", \"ONE-FRONT 15%\", \"Product CV 6%\", \"Resume 5%\", \"Bankly 2%\"]\n",[282,3124,3125],{"class":284,"line":356},[282,3126,3127],{},"  y-axis \"Views\" 0 --> 11000\n",[282,3129,3130],{"class":284,"line":362},[282,3131,3132],{},"  bar [9900, 2500, 2500, 950, 780, 423]\n",[99,3134,3136],{"className":3135},[102],[104,3137,3138],{},"Among measured top pages, the homepage is still the front door. Blog and CV matter; they are not where most sessions start.",[235,3140,3142],{"className":276,"code":3141,"language":278,"meta":241,"style":241},"---\nconfig:\n  xyChart:\n    width: 900\n    height: 280\n  themeVariables:\n    xyChart:\n      plotColorPalette: \"#B45309\"\n---\nxychart-beta\n  title \"First-user source — Direct ≈ 64% of ~2.8K users\"\n  x-axis [\"Direct 64%\", \"Google 9%\", \"LinkedIn 3%\", \"Other 24%\"]\n  y-axis \"Users\" 0 --> 2000\n  bar [1800, 249, 74, 677]\n",[243,3143,3144,3148,3152,3156,3160,3164,3168,3172,3177,3181,3185,3190,3195,3200],{"__ignoreMap":241},[282,3145,3146],{"class":284,"line":285},[282,3147,288],{},[282,3149,3150],{"class":284,"line":291},[282,3151,2487],{},[282,3153,3154],{"class":284,"line":297},[282,3155,2492],{},[282,3157,3158],{"class":284,"line":303},[282,3159,2497],{},[282,3161,3162],{"class":284,"line":309},[282,3163,2892],{},[282,3165,3166],{"class":284,"line":315},[282,3167,2507],{},[282,3169,3170],{"class":284,"line":321},[282,3171,2512],{},[282,3173,3174],{"class":284,"line":327},[282,3175,3176],{},"      plotColorPalette: \"#B45309\"\n",[282,3178,3179],{"class":284,"line":332},[282,3180,288],{},[282,3182,3183],{"class":284,"line":338},[282,3184,2526],{},[282,3186,3187],{"class":284,"line":344},[282,3188,3189],{},"  title \"First-user source — Direct ≈ 64% of ~2.8K users\"\n",[282,3191,3192],{"class":284,"line":350},[282,3193,3194],{},"  x-axis [\"Direct 64%\", \"Google 9%\", \"LinkedIn 3%\", \"Other 24%\"]\n",[282,3196,3197],{"class":284,"line":356},[282,3198,3199],{},"  y-axis \"Users\" 0 --> 2000\n",[282,3201,3202],{"class":284,"line":362},[282,3203,3204],{},"  bar [1800, 249, 74, 677]\n",[99,3206,3208],{"className":3207},[102],[104,3209,3210,3211,3214,3215,3217],{},"Most people arrive ",[108,3212,3213],{},"direct"," (bookmark, pasted link, typed domain). Organic search and LinkedIn are smaller. ",[108,3216,2988],{}," includes a long tail of referrals — some legitimate, some junk. Same shape as the commit chart: spikes and paths, not a smooth growth curve.",[99,3219,3221,3227],{"className":3220},[133,134,135],[137,3222,3224],{"id":3223},"work-with-me",[108,3225,3226],{},"Work with me",[104,3228,3229],{},[146,3230,3231],{"href":148},[108,3232,151],{},[99,3234,3236,3239],{"className":3235},[102],[104,3237,3238],{},"The public trail is the point: I ship in focused bursts, leave a measurable record, and keep front-end systems maintainable after the spike — architecture, product UI, GenAI/automation glue, and the ops that keep a site alive.",[104,3240,3241,622,3244,3248,3249,3248,3254],{},[108,3242,3243],{},"Next step:",[146,3245,3247],{"href":3246},"/cv/product","Product CV"," · ",[146,3250,3253],{"href":85,"rel":3251},[3252],"nofollow","LinkedIn",[146,3255,3257],{"href":3256},"/","one-front.com",[2379,3259,2381],{},{"title":241,"searchDepth":291,"depth":291,"links":3261},[3262,3263,3264,3265,3266,3267],{"id":2454,"depth":291,"text":2457},{"id":2638,"depth":291,"text":2641},{"id":2774,"depth":291,"text":2777},{"id":2829,"depth":291,"text":2832},{"id":2952,"depth":291,"text":2955},{"id":3223,"depth":291,"text":3226},"2026-09-27","Two years of commits, silence, and traffic — what the public repo and analytics actually show about building a personal site.",{"src":3271},"/blog/mcp/mcp-cover.png",{},{"title":51,"description":3269},"Az6ASQuxzTLgVOePm47cj3aE1gEHBofiKlOPRBFgxi0",{"id":3276,"title":39,"authors":3277,"badge":3280,"body":3283,"date":6404,"description":6405,"extension":2407,"image":6406,"meta":6407,"navigation":2128,"path":40,"seo":6408,"stem":41,"__hash__":6409},"posts_en/en/blog/8. mcp-in-chat-demo.md",[3278],{"name":83,"description":84,"to":85,"avatar":3279},{"src":87},{"label":3281,"color":3282,"variant":91},"MCP, E-commerce, Demo","error",{"type":93,"value":3284,"toc":6354},[3285,3297,3312,3328,3332,3347,3351,3383,3387,3471,3475,3488,3492,3530,3534,3993,4008,4014,4018,4180,4186,4190,4401,4406,4410,4590,4595,4599,4791,4796,4811,4817,4821,4827,4832,4838,4842,4847,4851,4857,4861,4866,4870,4876,4891,4897,4901,5150,5154,5157,5207,5211,5573,5579,5594,5600,5604,5636,5640,5646,5650,5753,5768,5774,5778,5792,5796,5896,5900,5903,5923,5927,5930,5956,5971,5977,5981,6012,6016,6087,6091,6117,6132,6138,6142,6220,6224,6227,6259,6274,6280,6284,6316,6320,6323,6325,6330,6351],[99,3286,3288],{"className":3287},[102],[104,3289,3290,3291,3296],{},"The ",[146,3292,3295],{"href":3293,"rel":3294},"https://github.com/michaelwybraniec/mcp-in-chat",[3252],"MCP-in-Chat project"," represents a complete, production-ready demonstration of how Model Context Protocol (MCP) servers can transform e-commerce chatbot interactions. This comprehensive example showcases a boiler maintenance and sales system that connects external AI chatbots (Claude, ChatGPT, Cursor) to real business logic through a secure, scalable architecture. Built using the Agentic Workflow Protocol (AWP) methodology, this project demonstrates how to create sophisticated MCP servers that bridge the gap between conversational AI and enterprise systems.",[99,3298,3300,3306],{"className":3299},[133,134,135],[137,3301,3303],{"id":3302},"_1-awp-agentic-workflow-protocol",[108,3304,3305],{},"1. AWP - Agentic Workflow Protocol",[104,3307,3308],{},[146,3309,3310],{"href":148},[108,3311,151],{},[99,3313,3315],{"className":3314},[102],[104,3316,3290,3317,3320,3321,3323,3324,3327],{},[108,3318,3319],{},"Agentic Workflow Protocol (AWP)"," is an agentic development methodology created by ",[108,3322,83],{}," and maintained by the ",[108,3325,3326],{},"overvibing.com community",". This systematic approach ensures consistent, high-quality development outcomes by providing structured workflows that prevent context drift callet overvibing and enable rapid, reliable project delivery while scaling development with AI.",[801,3329,3331],{"id":3330},"demo-video","Demo Video",[99,3333,3335],{"className":3334},[2369],[99,3336,3338],{"style":3337},"padding:95.12% 0 0 0;position:relative;",[3339,3340],"iframe",{"src":3341,"frameBorder":3342,"allow":3343,"referrerPolicy":3344,"style":3345,"title":3346},"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",[801,3348,3350],{"id":3349},"implementation-results","Implementation Results",[156,3352,3353,3359,3365,3371,3377],{},[159,3354,3355,3358],{},[108,3356,3357],{},"Timeline",": 4 hours (including unplanned tasks)",[159,3360,3361,3364],{},[108,3362,3363],{},"Scope",": 100% of planned features implemented",[159,3366,3367,3370],{},[108,3368,3369],{},"Quality",": 100% test success rate",[159,3372,3373,3376],{},[108,3374,3375],{},"Documentation",": Complete and comprehensive",[159,3378,3379,3382],{},[108,3380,3381],{},"Ready for Demo",": Fully functional and tested",[801,3384,3386],{"id":3385},"development-phases","Development Phases",[2267,3388,3389,3409,3432,3451],{},[159,3390,3391,3394,3395],{},[108,3392,3393],{},"Project Setup & Security Architecture"," (45 minutes)",[156,3396,3397,3400,3403,3406],{},[159,3398,3399],{},"Initialize Node.js project with TypeScript",[159,3401,3402],{},"Set up layered architecture (MCP → API → Services → Database)",[159,3404,3405],{},"Create mock JSON data files with access controls",[159,3407,3408],{},"Define TypeScript interfaces and security types",[159,3410,3411,3414,3415],{},[108,3412,3413],{},"Core MCP Tools Development"," (90 minutes)",[156,3416,3417,3420,3423,3426,3429],{},[159,3418,3419],{},"Implement boiler information tool with API validation",[159,3421,3422],{},"Implement maintenance scheduling tool with access controls",[159,3424,3425],{},"Implement inventory tool with rate limiting",[159,3427,3428],{},"Implement purchase tool with transaction validation",[159,3430,3431],{},"Implement email tool with content filtering",[159,3433,3434,3394,3437],{},[108,3435,3436],{},"Testing & Demo Preparation",[156,3438,3439,3442,3445,3448],{},[159,3440,3441],{},"Test MCP Server with local tools",[159,3443,3444],{},"Create demo instructions for chatbot integration",[159,3446,3447],{},"Prepare sample conversation flows",[159,3449,3450],{},"Create README with setup and usage instructions",[159,3452,3453,3456,3457],{},[108,3454,3455],{},"External Chatbot Integration"," (60 minutes)",[156,3458,3459,3462,3465,3468],{},[159,3460,3461],{},"Test MCP Server with Claude (if available)",[159,3463,3464],{},"Test MCP Server with ChatGPT (if available)",[159,3466,3467],{},"Document integration process and results",[159,3469,3470],{},"Create demo presentation materials",[801,3472,3474],{"id":3473},"project-overview","Project Overview",[99,3476,3478,3481],{"className":3477},[102],[104,3479,3480],{},"Boiler Maintenance MCP Server",[104,3482,3483,3484,3487],{},"The MCP-in-Chat project is a ",[108,3485,3486],{},"successfully completed demonstration"," that showcases how MCP servers can integrate with external chatbots to provide real business value. The system handles boiler maintenance services, customer information, inventory management, and purchase processing through a conversational interface.",[801,3489,3491],{"id":3490},"key-features","Key Features",[156,3493,3494,3500,3506,3512,3518,3524],{},[159,3495,3496,3499],{},[108,3497,3498],{},"4 MCP Tools",": Boiler information, maintenance scheduling, purchase processing, and email confirmation",[159,3501,3502,3505],{},[108,3503,3504],{},"4 API Endpoints",": RESTful backend with authentication and validation",[159,3507,3508,3511],{},[108,3509,3510],{},"8 Mock Services",": Complete business logic simulation with realistic data",[159,3513,3514,3517],{},[108,3515,3516],{},"External Integration",": Ready for Claude, ChatGPT, and Cursor IDE testing",[159,3519,3520,3523],{},[108,3521,3522],{},"100% Test Coverage",": Comprehensive test suite with 100% success rate",[159,3525,3526,3529],{},[108,3527,3528],{},"Production-Ready",": Security middleware, rate limiting, and error handling",[801,3531,3533],{"id":3532},"architecture-overview","Architecture Overview",[235,3535,3537],{"className":276,"code":3536,"language":278,"meta":241,"style":241},"---\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",[243,3538,3539,3543,3548,3552,3556,3561,3565,3570,3574,3579,3583,3588,3592,3597,3601,3606,3611,3616,3621,3626,3631,3636,3641,3646,3651,3656,3661,3666,3670,3674,3679,3684,3689,3695,3701,3706,3711,3717,3723,3729,3735,3741,3746,3751,3757,3763,3769,3775,3781,3786,3791,3797,3803,3809,3815,3821,3827,3833,3839,3845,3851,3857,3863,3869,3875,3881,3887,3893,3899,3905,3911,3917,3923,3928,3934,3940,3946,3952,3958,3963,3969,3975,3981,3987],{"__ignoreMap":241},[282,3540,3541],{"class":284,"line":285},[282,3542,288],{},[282,3544,3545],{"class":284,"line":291},[282,3546,3547],{},"header: MCP-in-Chat System Architecture\n",[282,3549,3550],{"class":284,"line":297},[282,3551,300],{},[282,3553,3554],{"class":284,"line":303},[282,3555,306],{},[282,3557,3558],{"class":284,"line":309},[282,3559,3560],{},"    text: \"External Systems\"\n",[282,3562,3563],{"class":284,"line":315},[282,3564,986],{},[282,3566,3567],{"class":284,"line":321},[282,3568,3569],{},"    text: \"MCP Protocol Layer\"\n",[282,3571,3572],{"class":284,"line":327},[282,3573,863],{},[282,3575,3576],{"class":284,"line":332},[282,3577,3578],{},"    text: \"API & Security Layer\"\n",[282,3580,3581],{"class":284,"line":338},[282,3582,318],{},[282,3584,3585],{"class":284,"line":344},[282,3586,3587],{},"    text: \"Business Services\"\n",[282,3589,3590],{"class":284,"line":350},[282,3591,1005],{},[282,3593,3594],{"class":284,"line":356},[282,3595,3596],{},"    text: \"Data Layer\"\n",[282,3598,3599],{"class":284,"line":362},[282,3600,288],{},[282,3602,3603],{"class":284,"line":368},[282,3604,3605],{},"graph TD\n",[282,3607,3608],{"class":284,"line":374},[282,3609,3610],{},"    subgraph \"External Chatbots\"\n",[282,3612,3613],{"class":284,"line":380},[282,3614,3615],{},"        A[Claude AI]\n",[282,3617,3618],{"class":284,"line":386},[282,3619,3620],{},"        B[ChatGPT]\n",[282,3622,3623],{"class":284,"line":392},[282,3624,3625],{},"        C[Cursor IDE]\n",[282,3627,3628],{"class":284,"line":398},[282,3629,3630],{},"    end\n",[282,3632,3633],{"class":284,"line":404},[282,3634,3635],{},"    \n",[282,3637,3638],{"class":284,"line":409},[282,3639,3640],{},"    subgraph \"MCP Server Layer\"\n",[282,3642,3643],{"class":284,"line":415},[282,3644,3645],{},"        D[MCP Server]\n",[282,3647,3648],{"class":284,"line":421},[282,3649,3650],{},"        E[Boiler Info Tool]\n",[282,3652,3653],{"class":284,"line":427},[282,3654,3655],{},"        F[Maintenance Tool]\n",[282,3657,3658],{"class":284,"line":432},[282,3659,3660],{},"        G[Purchase Tool]\n",[282,3662,3663],{"class":284,"line":438},[282,3664,3665],{},"        H[Email Tool]\n",[282,3667,3668],{"class":284,"line":444},[282,3669,3630],{},[282,3671,3672],{"class":284,"line":450},[282,3673,3635],{},[282,3675,3676],{"class":284,"line":456},[282,3677,3678],{},"    subgraph \"Backend API Layer\"\n",[282,3680,3681],{"class":284,"line":462},[282,3682,3683],{},"        I[Express API Server]\n",[282,3685,3686],{"class":284,"line":1112},[282,3687,3688],{},"        J[Authentication]\n",[282,3690,3692],{"class":284,"line":3691},33,[282,3693,3694],{},"        K[Validation]\n",[282,3696,3698],{"class":284,"line":3697},34,[282,3699,3700],{},"        L[Rate Limiting]\n",[282,3702,3704],{"class":284,"line":3703},35,[282,3705,3630],{},[282,3707,3709],{"class":284,"line":3708},36,[282,3710,3635],{},[282,3712,3714],{"class":284,"line":3713},37,[282,3715,3716],{},"    subgraph \"Business Services\"\n",[282,3718,3720],{"class":284,"line":3719},38,[282,3721,3722],{},"        M[Customer Service]\n",[282,3724,3726],{"class":284,"line":3725},39,[282,3727,3728],{},"        N[Boiler Service]\n",[282,3730,3732],{"class":284,"line":3731},40,[282,3733,3734],{},"        O[Payment Service]\n",[282,3736,3738],{"class":284,"line":3737},41,[282,3739,3740],{},"        P[Email Service]\n",[282,3742,3744],{"class":284,"line":3743},42,[282,3745,3630],{},[282,3747,3749],{"class":284,"line":3748},43,[282,3750,3635],{},[282,3752,3754],{"class":284,"line":3753},44,[282,3755,3756],{},"    subgraph \"Mock Data Layer\"\n",[282,3758,3760],{"class":284,"line":3759},45,[282,3761,3762],{},"        Q[Customers JSON]\n",[282,3764,3766],{"class":284,"line":3765},46,[282,3767,3768],{},"        R[Boilers JSON]\n",[282,3770,3772],{"class":284,"line":3771},47,[282,3773,3774],{},"        S[Inventory JSON]\n",[282,3776,3778],{"class":284,"line":3777},48,[282,3779,3780],{},"        T[Orders JSON]\n",[282,3782,3784],{"class":284,"line":3783},49,[282,3785,3630],{},[282,3787,3789],{"class":284,"line":3788},50,[282,3790,3635],{},[282,3792,3794],{"class":284,"line":3793},51,[282,3795,3796],{},"    A --> D\n",[282,3798,3800],{"class":284,"line":3799},52,[282,3801,3802],{},"    B --> D\n",[282,3804,3806],{"class":284,"line":3805},53,[282,3807,3808],{},"    C --> D\n",[282,3810,3812],{"class":284,"line":3811},54,[282,3813,3814],{},"    D --> E\n",[282,3816,3818],{"class":284,"line":3817},55,[282,3819,3820],{},"    D --> F\n",[282,3822,3824],{"class":284,"line":3823},56,[282,3825,3826],{},"    D --> G\n",[282,3828,3830],{"class":284,"line":3829},57,[282,3831,3832],{},"    D --> H\n",[282,3834,3836],{"class":284,"line":3835},58,[282,3837,3838],{},"    E --> I\n",[282,3840,3842],{"class":284,"line":3841},59,[282,3843,3844],{},"    F --> I\n",[282,3846,3848],{"class":284,"line":3847},60,[282,3849,3850],{},"    G --> I\n",[282,3852,3854],{"class":284,"line":3853},61,[282,3855,3856],{},"    H --> I\n",[282,3858,3860],{"class":284,"line":3859},62,[282,3861,3862],{},"    I --> J\n",[282,3864,3866],{"class":284,"line":3865},63,[282,3867,3868],{},"    J --> K\n",[282,3870,3872],{"class":284,"line":3871},64,[282,3873,3874],{},"    K --> L\n",[282,3876,3878],{"class":284,"line":3877},65,[282,3879,3880],{},"    L --> M\n",[282,3882,3884],{"class":284,"line":3883},66,[282,3885,3886],{},"    L --> N\n",[282,3888,3890],{"class":284,"line":3889},67,[282,3891,3892],{},"    L --> O\n",[282,3894,3896],{"class":284,"line":3895},68,[282,3897,3898],{},"    L --> P\n",[282,3900,3902],{"class":284,"line":3901},69,[282,3903,3904],{},"    M --> Q\n",[282,3906,3908],{"class":284,"line":3907},70,[282,3909,3910],{},"    N --> R\n",[282,3912,3914],{"class":284,"line":3913},71,[282,3915,3916],{},"    O --> S\n",[282,3918,3920],{"class":284,"line":3919},72,[282,3921,3922],{},"    P --> T\n",[282,3924,3926],{"class":284,"line":3925},73,[282,3927,3635],{},[282,3929,3931],{"class":284,"line":3930},74,[282,3932,3933],{},"    classDef external fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[282,3935,3937],{"class":284,"line":3936},75,[282,3938,3939],{},"    classDef mcp fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[282,3941,3943],{"class":284,"line":3942},76,[282,3944,3945],{},"    classDef api fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[282,3947,3949],{"class":284,"line":3948},77,[282,3950,3951],{},"    classDef service fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n",[282,3953,3955],{"class":284,"line":3954},78,[282,3956,3957],{},"    classDef data fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n",[282,3959,3961],{"class":284,"line":3960},79,[282,3962,3635],{},[282,3964,3966],{"class":284,"line":3965},80,[282,3967,3968],{},"    class A,B,C external\n",[282,3970,3972],{"class":284,"line":3971},81,[282,3973,3974],{},"    class D,E,F,G,H mcp\n",[282,3976,3978],{"class":284,"line":3977},82,[282,3979,3980],{},"    class I,J,K,L api\n",[282,3982,3984],{"class":284,"line":3983},83,[282,3985,3986],{},"    class M,N,O,P service\n",[282,3988,3990],{"class":284,"line":3989},84,[282,3991,3992],{},"    class Q,R,S,T data\n",[99,3994,3996,4002],{"className":3995},[133,134,135],[137,3997,3999],{"id":3998},"_2-mcp-model-context-protocol",[108,4000,4001],{},"2. MCP - Model Context Protocol",[104,4003,4004],{},[146,4005,4006],{"href":148},[108,4007,151],{},[99,4009,4011],{"className":4010},[102],[104,4012,4013],{},"The MCP server exposes four specialized tools that enable chatbots to interact with the boiler maintenance system. Each tool is designed with specific business logic and security controls.",[801,4015,4017],{"id":4016},"boiler-information-tool","Boiler Information Tool",[235,4019,4023],{"className":4020,"code":4021,"language":4022,"meta":241,"style":241},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// MCP Tool: Get customer boiler details and warranty information\nconst boilerInfoTool = {\n  name: \"boiler-info\",\n  description: \"Get customer boiler information and warranty details\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" }\n    },\n    required: [\"customer_id\"]\n  }\n}\n","typescript",[243,4024,4025,4031,4048,4070,4086,4095,4111,4120,4145,4150,4170,4175],{"__ignoreMap":241},[282,4026,4027],{"class":284,"line":285},[282,4028,4030],{"class":4029},"sHwdD","// MCP Tool: Get customer boiler details and warranty information\n",[282,4032,4033,4037,4041,4045],{"class":284,"line":291},[282,4034,4036],{"class":4035},"spNyl","const",[282,4038,4040],{"class":4039},"sTEyZ"," boilerInfoTool ",[282,4042,4044],{"class":4043},"sMK4o","=",[282,4046,4047],{"class":4043}," {\n",[282,4049,4050,4054,4057,4060,4064,4067],{"class":284,"line":297},[282,4051,4053],{"class":4052},"swJcz","  name",[282,4055,4056],{"class":4043},":",[282,4058,4059],{"class":4043}," \"",[282,4061,4063],{"class":4062},"sfazB","boiler-info",[282,4065,4066],{"class":4043},"\"",[282,4068,4069],{"class":4043},",\n",[282,4071,4072,4075,4077,4079,4082,4084],{"class":284,"line":303},[282,4073,4074],{"class":4052},"  description",[282,4076,4056],{"class":4043},[282,4078,4059],{"class":4043},[282,4080,4081],{"class":4062},"Get customer boiler information and warranty details",[282,4083,4066],{"class":4043},[282,4085,4069],{"class":4043},[282,4087,4088,4091,4093],{"class":284,"line":309},[282,4089,4090],{"class":4052},"  inputSchema",[282,4092,4056],{"class":4043},[282,4094,4047],{"class":4043},[282,4096,4097,4100,4102,4104,4107,4109],{"class":284,"line":315},[282,4098,4099],{"class":4052},"    type",[282,4101,4056],{"class":4043},[282,4103,4059],{"class":4043},[282,4105,4106],{"class":4062},"object",[282,4108,4066],{"class":4043},[282,4110,4069],{"class":4043},[282,4112,4113,4116,4118],{"class":284,"line":321},[282,4114,4115],{"class":4052},"    properties",[282,4117,4056],{"class":4043},[282,4119,4047],{"class":4043},[282,4121,4122,4125,4127,4130,4133,4135,4137,4140,4142],{"class":284,"line":327},[282,4123,4124],{"class":4052},"      customer_id",[282,4126,4056],{"class":4043},[282,4128,4129],{"class":4043}," {",[282,4131,4132],{"class":4052}," type",[282,4134,4056],{"class":4043},[282,4136,4059],{"class":4043},[282,4138,4139],{"class":4062},"string",[282,4141,4066],{"class":4043},[282,4143,4144],{"class":4043}," }\n",[282,4146,4147],{"class":284,"line":332},[282,4148,4149],{"class":4043},"    },\n",[282,4151,4152,4155,4157,4160,4162,4165,4167],{"class":284,"line":338},[282,4153,4154],{"class":4052},"    required",[282,4156,4056],{"class":4043},[282,4158,4159],{"class":4039}," [",[282,4161,4066],{"class":4043},[282,4163,4164],{"class":4062},"customer_id",[282,4166,4066],{"class":4043},[282,4168,4169],{"class":4039},"]\n",[282,4171,4172],{"class":284,"line":344},[282,4173,4174],{"class":4043},"  }\n",[282,4176,4177],{"class":284,"line":350},[282,4178,4179],{"class":4043},"}\n",[104,4181,4182,4185],{},[108,4183,4184],{},"Use Case",": When a customer asks \"What's the warranty status of my boiler?\", the chatbot can retrieve detailed information about their specific boiler model, installation date, warranty coverage, and maintenance history.",[801,4187,4189],{"id":4188},"maintenance-scheduling-tool","Maintenance Scheduling Tool",[235,4191,4193],{"className":4020,"code":4192,"language":4022,"meta":241,"style":241},"// MCP Tool: Schedule maintenance services with weather consideration\nconst maintenanceTool = {\n  name: \"maintenance\",\n  description: \"Schedule maintenance services\",\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",[243,4194,4195,4200,4211,4226,4241,4249,4263,4271,4292,4343,4364,4368,4393,4397],{"__ignoreMap":241},[282,4196,4197],{"class":284,"line":285},[282,4198,4199],{"class":4029},"// MCP Tool: Schedule maintenance services with weather consideration\n",[282,4201,4202,4204,4207,4209],{"class":284,"line":291},[282,4203,4036],{"class":4035},[282,4205,4206],{"class":4039}," maintenanceTool ",[282,4208,4044],{"class":4043},[282,4210,4047],{"class":4043},[282,4212,4213,4215,4217,4219,4222,4224],{"class":284,"line":297},[282,4214,4053],{"class":4052},[282,4216,4056],{"class":4043},[282,4218,4059],{"class":4043},[282,4220,4221],{"class":4062},"maintenance",[282,4223,4066],{"class":4043},[282,4225,4069],{"class":4043},[282,4227,4228,4230,4232,4234,4237,4239],{"class":284,"line":303},[282,4229,4074],{"class":4052},[282,4231,4056],{"class":4043},[282,4233,4059],{"class":4043},[282,4235,4236],{"class":4062},"Schedule maintenance services",[282,4238,4066],{"class":4043},[282,4240,4069],{"class":4043},[282,4242,4243,4245,4247],{"class":284,"line":309},[282,4244,4090],{"class":4052},[282,4246,4056],{"class":4043},[282,4248,4047],{"class":4043},[282,4250,4251,4253,4255,4257,4259,4261],{"class":284,"line":315},[282,4252,4099],{"class":4052},[282,4254,4056],{"class":4043},[282,4256,4059],{"class":4043},[282,4258,4106],{"class":4062},[282,4260,4066],{"class":4043},[282,4262,4069],{"class":4043},[282,4264,4265,4267,4269],{"class":284,"line":321},[282,4266,4115],{"class":4052},[282,4268,4056],{"class":4043},[282,4270,4047],{"class":4043},[282,4272,4273,4275,4277,4279,4281,4283,4285,4287,4289],{"class":284,"line":327},[282,4274,4124],{"class":4052},[282,4276,4056],{"class":4043},[282,4278,4129],{"class":4043},[282,4280,4132],{"class":4052},[282,4282,4056],{"class":4043},[282,4284,4059],{"class":4043},[282,4286,4139],{"class":4062},[282,4288,4066],{"class":4043},[282,4290,4291],{"class":4043}," },\n",[282,4293,4294,4297,4299,4301,4303,4305,4307,4309,4311,4314,4317,4319,4321,4323,4326,4328,4330,4332,4335,4337,4340],{"class":284,"line":332},[282,4295,4296],{"class":4052},"      service_type",[282,4298,4056],{"class":4043},[282,4300,4129],{"class":4043},[282,4302,4132],{"class":4052},[282,4304,4056],{"class":4043},[282,4306,4059],{"class":4043},[282,4308,4139],{"class":4062},[282,4310,4066],{"class":4043},[282,4312,4313],{"class":4043},",",[282,4315,4316],{"class":4052}," enum",[282,4318,4056],{"class":4043},[282,4320,4159],{"class":4039},[282,4322,4066],{"class":4043},[282,4324,4325],{"class":4062},"routine",[282,4327,4066],{"class":4043},[282,4329,4313],{"class":4043},[282,4331,4059],{"class":4043},[282,4333,4334],{"class":4062},"emergency",[282,4336,4066],{"class":4043},[282,4338,4339],{"class":4039},"] ",[282,4341,4342],{"class":4043},"},\n",[282,4344,4345,4348,4350,4352,4354,4356,4358,4360,4362],{"class":284,"line":338},[282,4346,4347],{"class":4052},"      preferred_date",[282,4349,4056],{"class":4043},[282,4351,4129],{"class":4043},[282,4353,4132],{"class":4052},[282,4355,4056],{"class":4043},[282,4357,4059],{"class":4043},[282,4359,4139],{"class":4062},[282,4361,4066],{"class":4043},[282,4363,4144],{"class":4043},[282,4365,4366],{"class":284,"line":344},[282,4367,4149],{"class":4043},[282,4369,4370,4372,4374,4376,4378,4380,4382,4384,4386,4389,4391],{"class":284,"line":350},[282,4371,4154],{"class":4052},[282,4373,4056],{"class":4043},[282,4375,4159],{"class":4039},[282,4377,4066],{"class":4043},[282,4379,4164],{"class":4062},[282,4381,4066],{"class":4043},[282,4383,4313],{"class":4043},[282,4385,4059],{"class":4043},[282,4387,4388],{"class":4062},"service_type",[282,4390,4066],{"class":4043},[282,4392,4169],{"class":4039},[282,4394,4395],{"class":284,"line":356},[282,4396,4174],{"class":4043},[282,4398,4399],{"class":284,"line":362},[282,4400,4179],{"class":4043},[104,4402,4403,4405],{},[108,4404,4184],{},": Customers can request maintenance scheduling, and the system automatically considers weather conditions, technician availability, and customer preferences to book optimal appointments.",[801,4407,4409],{"id":4408},"purchase-processing-tool","Purchase Processing Tool",[235,4411,4413],{"className":4020,"code":4412,"language":4022,"meta":241,"style":241},"// MCP Tool: Process boiler purchase orders\nconst purchaseTool = {\n  name: \"purchase\",\n  description: \"Process boiler purchase orders\",\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",[243,4414,4415,4420,4431,4446,4461,4469,4483,4491,4511,4532,4553,4557,4582,4586],{"__ignoreMap":241},[282,4416,4417],{"class":284,"line":285},[282,4418,4419],{"class":4029},"// MCP Tool: Process boiler purchase orders\n",[282,4421,4422,4424,4427,4429],{"class":284,"line":291},[282,4423,4036],{"class":4035},[282,4425,4426],{"class":4039}," purchaseTool ",[282,4428,4044],{"class":4043},[282,4430,4047],{"class":4043},[282,4432,4433,4435,4437,4439,4442,4444],{"class":284,"line":297},[282,4434,4053],{"class":4052},[282,4436,4056],{"class":4043},[282,4438,4059],{"class":4043},[282,4440,4441],{"class":4062},"purchase",[282,4443,4066],{"class":4043},[282,4445,4069],{"class":4043},[282,4447,4448,4450,4452,4454,4457,4459],{"class":284,"line":303},[282,4449,4074],{"class":4052},[282,4451,4056],{"class":4043},[282,4453,4059],{"class":4043},[282,4455,4456],{"class":4062},"Process boiler purchase orders",[282,4458,4066],{"class":4043},[282,4460,4069],{"class":4043},[282,4462,4463,4465,4467],{"class":284,"line":309},[282,4464,4090],{"class":4052},[282,4466,4056],{"class":4043},[282,4468,4047],{"class":4043},[282,4470,4471,4473,4475,4477,4479,4481],{"class":284,"line":315},[282,4472,4099],{"class":4052},[282,4474,4056],{"class":4043},[282,4476,4059],{"class":4043},[282,4478,4106],{"class":4062},[282,4480,4066],{"class":4043},[282,4482,4069],{"class":4043},[282,4484,4485,4487,4489],{"class":284,"line":321},[282,4486,4115],{"class":4052},[282,4488,4056],{"class":4043},[282,4490,4047],{"class":4043},[282,4492,4493,4495,4497,4499,4501,4503,4505,4507,4509],{"class":284,"line":327},[282,4494,4124],{"class":4052},[282,4496,4056],{"class":4043},[282,4498,4129],{"class":4043},[282,4500,4132],{"class":4052},[282,4502,4056],{"class":4043},[282,4504,4059],{"class":4043},[282,4506,4139],{"class":4062},[282,4508,4066],{"class":4043},[282,4510,4291],{"class":4043},[282,4512,4513,4516,4518,4520,4522,4524,4526,4528,4530],{"class":284,"line":332},[282,4514,4515],{"class":4052},"      boiler_model",[282,4517,4056],{"class":4043},[282,4519,4129],{"class":4043},[282,4521,4132],{"class":4052},[282,4523,4056],{"class":4043},[282,4525,4059],{"class":4043},[282,4527,4139],{"class":4062},[282,4529,4066],{"class":4043},[282,4531,4291],{"class":4043},[282,4533,4534,4537,4539,4541,4543,4545,4547,4549,4551],{"class":284,"line":338},[282,4535,4536],{"class":4052},"      installation_date",[282,4538,4056],{"class":4043},[282,4540,4129],{"class":4043},[282,4542,4132],{"class":4052},[282,4544,4056],{"class":4043},[282,4546,4059],{"class":4043},[282,4548,4139],{"class":4062},[282,4550,4066],{"class":4043},[282,4552,4144],{"class":4043},[282,4554,4555],{"class":284,"line":344},[282,4556,4149],{"class":4043},[282,4558,4559,4561,4563,4565,4567,4569,4571,4573,4575,4578,4580],{"class":284,"line":350},[282,4560,4154],{"class":4052},[282,4562,4056],{"class":4043},[282,4564,4159],{"class":4039},[282,4566,4066],{"class":4043},[282,4568,4164],{"class":4062},[282,4570,4066],{"class":4043},[282,4572,4313],{"class":4043},[282,4574,4059],{"class":4043},[282,4576,4577],{"class":4062},"boiler_model",[282,4579,4066],{"class":4043},[282,4581,4169],{"class":4039},[282,4583,4584],{"class":284,"line":356},[282,4585,4174],{"class":4043},[282,4587,4588],{"class":284,"line":362},[282,4589,4179],{"class":4043},[104,4591,4592,4594],{},[108,4593,4184],{},": When customers want to upgrade their boiler, the chatbot can show available models, compare specifications, process payments, and schedule installation.",[801,4596,4598],{"id":4597},"email-confirmation-tool","Email Confirmation Tool",[235,4600,4602],{"className":4020,"code":4601,"language":4022,"meta":241,"style":241},"// MCP Tool: Send confirmation emails\nconst emailTool = {\n  name: \"email\",\n  description: \"Send confirmation emails\",\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",[243,4603,4604,4609,4620,4635,4650,4658,4672,4680,4700,4754,4758,4783,4787],{"__ignoreMap":241},[282,4605,4606],{"class":284,"line":285},[282,4607,4608],{"class":4029},"// MCP Tool: Send confirmation emails\n",[282,4610,4611,4613,4616,4618],{"class":284,"line":291},[282,4612,4036],{"class":4035},[282,4614,4615],{"class":4039}," emailTool ",[282,4617,4044],{"class":4043},[282,4619,4047],{"class":4043},[282,4621,4622,4624,4626,4628,4631,4633],{"class":284,"line":297},[282,4623,4053],{"class":4052},[282,4625,4056],{"class":4043},[282,4627,4059],{"class":4043},[282,4629,4630],{"class":4062},"email",[282,4632,4066],{"class":4043},[282,4634,4069],{"class":4043},[282,4636,4637,4639,4641,4643,4646,4648],{"class":284,"line":303},[282,4638,4074],{"class":4052},[282,4640,4056],{"class":4043},[282,4642,4059],{"class":4043},[282,4644,4645],{"class":4062},"Send confirmation emails",[282,4647,4066],{"class":4043},[282,4649,4069],{"class":4043},[282,4651,4652,4654,4656],{"class":284,"line":309},[282,4653,4090],{"class":4052},[282,4655,4056],{"class":4043},[282,4657,4047],{"class":4043},[282,4659,4660,4662,4664,4666,4668,4670],{"class":284,"line":315},[282,4661,4099],{"class":4052},[282,4663,4056],{"class":4043},[282,4665,4059],{"class":4043},[282,4667,4106],{"class":4062},[282,4669,4066],{"class":4043},[282,4671,4069],{"class":4043},[282,4673,4674,4676,4678],{"class":284,"line":321},[282,4675,4115],{"class":4052},[282,4677,4056],{"class":4043},[282,4679,4047],{"class":4043},[282,4681,4682,4684,4686,4688,4690,4692,4694,4696,4698],{"class":284,"line":327},[282,4683,4124],{"class":4052},[282,4685,4056],{"class":4043},[282,4687,4129],{"class":4043},[282,4689,4132],{"class":4052},[282,4691,4056],{"class":4043},[282,4693,4059],{"class":4043},[282,4695,4139],{"class":4062},[282,4697,4066],{"class":4043},[282,4699,4291],{"class":4043},[282,4701,4702,4705,4707,4709,4711,4713,4715,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737,4739,4741,4743,4745,4748,4750,4752],{"class":284,"line":332},[282,4703,4704],{"class":4052},"      email_type",[282,4706,4056],{"class":4043},[282,4708,4129],{"class":4043},[282,4710,4132],{"class":4052},[282,4712,4056],{"class":4043},[282,4714,4059],{"class":4043},[282,4716,4139],{"class":4062},[282,4718,4066],{"class":4043},[282,4720,4313],{"class":4043},[282,4722,4316],{"class":4052},[282,4724,4056],{"class":4043},[282,4726,4159],{"class":4039},[282,4728,4066],{"class":4043},[282,4730,4221],{"class":4062},[282,4732,4066],{"class":4043},[282,4734,4313],{"class":4043},[282,4736,4059],{"class":4043},[282,4738,4441],{"class":4062},[282,4740,4066],{"class":4043},[282,4742,4313],{"class":4043},[282,4744,4059],{"class":4043},[282,4746,4747],{"class":4062},"reminder",[282,4749,4066],{"class":4043},[282,4751,4339],{"class":4039},[282,4753,4179],{"class":4043},[282,4755,4756],{"class":284,"line":338},[282,4757,4149],{"class":4043},[282,4759,4760,4762,4764,4766,4768,4770,4772,4774,4776,4779,4781],{"class":284,"line":344},[282,4761,4154],{"class":4052},[282,4763,4056],{"class":4043},[282,4765,4159],{"class":4039},[282,4767,4066],{"class":4043},[282,4769,4164],{"class":4062},[282,4771,4066],{"class":4043},[282,4773,4313],{"class":4043},[282,4775,4059],{"class":4043},[282,4777,4778],{"class":4062},"email_type",[282,4780,4066],{"class":4043},[282,4782,4169],{"class":4039},[282,4784,4785],{"class":284,"line":350},[282,4786,4174],{"class":4043},[282,4788,4789],{"class":284,"line":356},[282,4790,4179],{"class":4043},[104,4792,4793,4795],{},[108,4794,4184],{},": After any service booking or purchase, the system automatically sends appropriate confirmation emails with relevant details and next steps.",[99,4797,4799,4805],{"className":4798},[133,134,135],[137,4800,4802],{"id":4801},"_3-demo-scenarios-and-flows",[108,4803,4804],{},"3. Demo Scenarios and Flows",[104,4806,4807],{},[146,4808,4809],{"href":148},[108,4810,151],{},[99,4812,4814],{"className":4813},[102],[104,4815,4816],{},"The MCP-in-Chat project includes comprehensive demo scenarios that showcase real-world usage patterns and demonstrate the system's capabilities.",[801,4818,4820],{"id":4819},"scenario-1-boiler-information-query","Scenario 1: Boiler Information Query",[104,4822,4823,4826],{},[108,4824,4825],{},"Customer",": \"What's the warranty status of my boiler?\"",[104,4828,4829,4056],{},[108,4830,4831],{},"Chatbot Response",[235,4833,4836],{"className":4834,"code":4835,"language":240},[238],"I'll check your boiler information right away.\n\nBased on your records, you have a Worcester Bosch 8000 Style installed on March 15, 2023. \nYour warranty is valid until March 15, 2028 (5-year manufacturer warranty).\n\nKey details:\n- Model: Worcester Bosch 8000 Style 30kW\n- Installation Date: March 15, 2023\n- Warranty Status: Active (3 years remaining)\n- Last Service: January 12, 2024\n- Next Service Due: January 12, 2025\n\nWould you like me to schedule your annual service or check if there are any warranty claims?\n",[243,4837,4835],{"__ignoreMap":241},[801,4839,4841],{"id":4840},"scenario-2-maintenance-scheduling","Scenario 2: Maintenance Scheduling",[104,4843,4844,4846],{},[108,4845,4825],{},": \"I need to schedule maintenance for my boiler\"",[104,4848,4849,4056],{},[108,4850,4831],{},[235,4852,4855],{"className":4853,"code":4854,"language":240},[238],"I'll help you schedule maintenance for your boiler. Let me check your current schedule and available slots.\n\nBased on your location and preferences, I found these available appointments:\n\nNext Week:\n- Tuesday, January 21: 9:00 AM - 11:00 AM\n- Thursday, January 23: 2:00 PM - 4:00 PM\n\nWeather forecast shows clear conditions for both days. Your preferred technician, John Smith (Gas Safe registered), is available on Tuesday.\n\nI recommend Tuesday at 9:00 AM. The service will include:\n- Full system inspection\n- Safety checks\n- Efficiency testing\n- Filter cleaning\n\nCost: £120 (includes parts and labor)\n\nShall I book this appointment for you?\n",[243,4856,4854],{"__ignoreMap":241},[801,4858,4860],{"id":4859},"scenario-3-boiler-upgrade-purchase","Scenario 3: Boiler Upgrade Purchase",[104,4862,4863,4865],{},[108,4864,4825],{},": \"I want to upgrade my boiler to a more efficient model\"",[104,4867,4868,4056],{},[108,4869,4831],{},[235,4871,4874],{"className":4872,"code":4873,"language":240},[238],"Great choice! Let me show you the most efficient models available and help you upgrade.\n\nAvailable High-Efficiency Boilers:\n\n1. **Worcester Bosch 8000 Style** (A-Rated)\n   - Efficiency: 94%\n   - Price: £2,800\n   - 10-year warranty\n   - Smart thermostat included\n\n2. **Vaillant ecoTEC plus** (A-Rated)\n   - Efficiency: 92%\n   - Price: £2,600\n   - 7-year warranty\n   - Compact design\n\n3. **Ideal Logic+** (A-Rated)\n   - Efficiency: 90%\n   - Price: £2,200\n   - 10-year warranty\n   - Quiet Mark certified\n\nBased on your current system, I recommend the Worcester Bosch 8000 Style for maximum efficiency and reliability.\n\nWould you like me to:\n1. Show detailed specifications\n2. Check installation availability\n3. Process the purchase\n4. Compare with your current boiler\n",[243,4875,4873],{"__ignoreMap":241},[99,4877,4879,4885],{"className":4878},[133,134,135],[137,4880,4882],{"id":4881},"_4-technical-specs",[108,4883,4884],{},"4. Technical Specs",[104,4886,4887],{},[146,4888,4889],{"href":148},[108,4890,151],{},[99,4892,4894],{"className":4893},[102],[104,4895,4896],{},"The MCP-in-Chat project implements a sophisticated layered architecture that ensures security, scalability, and maintainability.",[801,4898,4900],{"id":4899},"security-architecture","Security Architecture",[235,4902,4904],{"className":276,"code":4903,"language":278,"meta":241,"style":241},"---\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",[243,4905,4906,4910,4915,4919,4923,4928,4933,4938,4943,4948,4953,4957,4962,4967,4972,4976,4980,4985,4990,4995,4999,5003,5008,5013,5018,5023,5027,5031,5036,5041,5046,5051,5055,5059,5064,5069,5074,5078,5082,5086,5090,5095,5099,5103,5107,5111,5116,5120,5124,5128,5132,5137,5141,5145],{"__ignoreMap":241},[282,4907,4908],{"class":284,"line":285},[282,4909,288],{},[282,4911,4912],{"class":284,"line":291},[282,4913,4914],{},"header: MCP Security Flow and Authentication\n",[282,4916,4917],{"class":284,"line":297},[282,4918,288],{},[282,4920,4921],{"class":284,"line":303},[282,4922,1574],{},[282,4924,4925],{"class":284,"line":309},[282,4926,4927],{},"    participant Chatbot as External Chatbot\n",[282,4929,4930],{"class":284,"line":315},[282,4931,4932],{},"    participant MCP as MCP Server\n",[282,4934,4935],{"class":284,"line":321},[282,4936,4937],{},"    participant API as Backend API\n",[282,4939,4940],{"class":284,"line":327},[282,4941,4942],{},"    participant Auth as Authentication\n",[282,4944,4945],{"class":284,"line":332},[282,4946,4947],{},"    participant Service as Business Service\n",[282,4949,4950],{"class":284,"line":338},[282,4951,4952],{},"    participant DB as Mock Database\n",[282,4954,4955],{"class":284,"line":344},[282,4956,3635],{},[282,4958,4959],{"class":284,"line":350},[282,4960,4961],{},"    rect rgb(59, 130, 246)\n",[282,4963,4964],{"class":284,"line":356},[282,4965,4966],{},"    note right of Chatbot: External Systems\n",[282,4968,4969],{"class":284,"line":362},[282,4970,4971],{},"    Chatbot->>+MCP: Request with customer_id\n",[282,4973,4974],{"class":284,"line":368},[282,4975,3630],{},[282,4977,4978],{"class":284,"line":374},[282,4979,3635],{},[282,4981,4982],{"class":284,"line":380},[282,4983,4984],{},"    rect rgb(139, 92, 246)\n",[282,4986,4987],{"class":284,"line":386},[282,4988,4989],{},"    note right of MCP: MCP Protocol Layer\n",[282,4991,4992],{"class":284,"line":392},[282,4993,4994],{},"    MCP->>+API: API call with validation\n",[282,4996,4997],{"class":284,"line":398},[282,4998,3630],{},[282,5000,5001],{"class":284,"line":404},[282,5002,3635],{},[282,5004,5005],{"class":284,"line":409},[282,5006,5007],{},"    rect rgb(16, 185, 129)\n",[282,5009,5010],{"class":284,"line":415},[282,5011,5012],{},"    note right of API: Security & API Layer\n",[282,5014,5015],{"class":284,"line":421},[282,5016,5017],{},"    API->>+Auth: Verify authentication\n",[282,5019,5020],{"class":284,"line":427},[282,5021,5022],{},"    Auth-->>-API: Authentication result\n",[282,5024,5025],{"class":284,"line":432},[282,5026,3630],{},[282,5028,5029],{"class":284,"line":438},[282,5030,3635],{},[282,5032,5033],{"class":284,"line":444},[282,5034,5035],{},"    rect rgb(245, 158, 11)\n",[282,5037,5038],{"class":284,"line":450},[282,5039,5040],{},"    note right of Service: Business Logic Layer\n",[282,5042,5043],{"class":284,"line":456},[282,5044,5045],{},"    API->>+Service: Process business logic\n",[282,5047,5048],{"class":284,"line":462},[282,5049,5050],{},"    Service->>+DB: Query with access controls\n",[282,5052,5053],{"class":284,"line":1112},[282,5054,3630],{},[282,5056,5057],{"class":284,"line":3691},[282,5058,3635],{},[282,5060,5061],{"class":284,"line":3697},[282,5062,5063],{},"    rect rgb(239, 68, 68)\n",[282,5065,5066],{"class":284,"line":3703},[282,5067,5068],{},"    note right of DB: Data Storage Layer\n",[282,5070,5071],{"class":284,"line":3708},[282,5072,5073],{},"    DB-->>-Service: Return filtered data\n",[282,5075,5076],{"class":284,"line":3713},[282,5077,3630],{},[282,5079,5080],{"class":284,"line":3719},[282,5081,3635],{},[282,5083,5084],{"class":284,"line":3725},[282,5085,5035],{},[282,5087,5088],{"class":284,"line":3731},[282,5089,5040],{},[282,5091,5092],{"class":284,"line":3737},[282,5093,5094],{},"    Service-->>-API: Processed response\n",[282,5096,5097],{"class":284,"line":3743},[282,5098,3630],{},[282,5100,5101],{"class":284,"line":3748},[282,5102,3635],{},[282,5104,5105],{"class":284,"line":3753},[282,5106,5007],{},[282,5108,5109],{"class":284,"line":3759},[282,5110,5012],{},[282,5112,5113],{"class":284,"line":3765},[282,5114,5115],{},"    API-->>-MCP: API response\n",[282,5117,5118],{"class":284,"line":3771},[282,5119,3630],{},[282,5121,5122],{"class":284,"line":3777},[282,5123,3635],{},[282,5125,5126],{"class":284,"line":3783},[282,5127,4984],{},[282,5129,5130],{"class":284,"line":3788},[282,5131,4989],{},[282,5133,5134],{"class":284,"line":3793},[282,5135,5136],{},"    MCP-->>-Chatbot: Formatted result\n",[282,5138,5139],{"class":284,"line":3799},[282,5140,3630],{},[282,5142,5143],{"class":284,"line":3805},[282,5144,3635],{},[282,5146,5147],{"class":284,"line":3811},[282,5148,5149],{},"    Note over Chatbot,DB: Secure communication flow with\u003Cbr/>authentication at each layer\n",[801,5151,5153],{"id":5152},"mock-services-implementation","Mock Services Implementation",[104,5155,5156],{},"The project includes 8 comprehensive mock services that simulate real business operations:",[2267,5158,5159,5165,5171,5177,5183,5189,5195,5201],{},[159,5160,5161,5164],{},[108,5162,5163],{},"Customer Service",": Manages customer profiles and preferences",[159,5166,5167,5170],{},[108,5168,5169],{},"Boiler Service",": Handles boiler information and warranty data",[159,5172,5173,5176],{},[108,5174,5175],{},"Payment Service",": Processes transactions and payment validation",[159,5178,5179,5182],{},[108,5180,5181],{},"Email Service",": Manages communication and notifications",[159,5184,5185,5188],{},[108,5186,5187],{},"Weather Service",": Provides weather data for scheduling",[159,5190,5191,5194],{},[108,5192,5193],{},"Warranty Service",": Handles warranty information and claims",[159,5196,5197,5200],{},[108,5198,5199],{},"AI Prediction Service",": Simulates maintenance predictions",[159,5202,5203,5206],{},[108,5204,5205],{},"Technician Service",": Manages technician availability and scheduling",[801,5208,5210],{"id":5209},"data-layer-structure","Data Layer Structure",[235,5212,5216],{"className":5213,"code":5214,"language":5215,"meta":241,"style":241},"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",[243,5217,5218,5223,5237,5252,5274,5293,5313,5333,5346,5366,5386,5404,5409,5414,5419,5432,5445,5463,5483,5503,5523,5543,5561,5565,5569],{"__ignoreMap":241},[282,5219,5220],{"class":284,"line":285},[282,5221,5222],{"class":4043},"{\n",[282,5224,5225,5228,5231,5233,5235],{"class":284,"line":291},[282,5226,5227],{"class":4043},"  \"",[282,5229,5230],{"class":4035},"customers",[282,5232,4066],{"class":4043},[282,5234,4056],{"class":4043},[282,5236,4047],{"class":4043},[282,5238,5239,5242,5246,5248,5250],{"class":284,"line":297},[282,5240,5241],{"class":4043},"    \"",[282,5243,5245],{"class":5244},"sBMFI","CUST001",[282,5247,4066],{"class":4043},[282,5249,4056],{"class":4043},[282,5251,4047],{"class":4043},[282,5253,5254,5257,5261,5263,5265,5267,5270,5272],{"class":284,"line":303},[282,5255,5256],{"class":4043},"      \"",[282,5258,5260],{"class":5259},"sbssI","name",[282,5262,4066],{"class":4043},[282,5264,4056],{"class":4043},[282,5266,4059],{"class":4043},[282,5268,5269],{"class":4062},"John Smith",[282,5271,4066],{"class":4043},[282,5273,4069],{"class":4043},[282,5275,5276,5278,5280,5282,5284,5286,5289,5291],{"class":284,"line":309},[282,5277,5256],{"class":4043},[282,5279,4630],{"class":5259},[282,5281,4066],{"class":4043},[282,5283,4056],{"class":4043},[282,5285,4059],{"class":4043},[282,5287,5288],{"class":4062},"john.smith@email.com",[282,5290,4066],{"class":4043},[282,5292,4069],{"class":4043},[282,5294,5295,5297,5300,5302,5304,5306,5309,5311],{"class":284,"line":315},[282,5296,5256],{"class":4043},[282,5298,5299],{"class":5259},"address",[282,5301,4066],{"class":4043},[282,5303,4056],{"class":4043},[282,5305,4059],{"class":4043},[282,5307,5308],{"class":4062},"123 Main St, London",[282,5310,4066],{"class":4043},[282,5312,4069],{"class":4043},[282,5314,5315,5317,5320,5322,5324,5326,5329,5331],{"class":284,"line":321},[282,5316,5256],{"class":4043},[282,5318,5319],{"class":5259},"phone",[282,5321,4066],{"class":4043},[282,5323,4056],{"class":4043},[282,5325,4059],{"class":4043},[282,5327,5328],{"class":4062},"+44 20 1234 5678",[282,5330,4066],{"class":4043},[282,5332,4069],{"class":4043},[282,5334,5335,5337,5340,5342,5344],{"class":284,"line":327},[282,5336,5256],{"class":4043},[282,5338,5339],{"class":5259},"preferences",[282,5341,4066],{"class":4043},[282,5343,4056],{"class":4043},[282,5345,4047],{"class":4043},[282,5347,5348,5351,5354,5356,5358,5360,5362,5364],{"class":284,"line":332},[282,5349,5350],{"class":4043},"        \"",[282,5352,5353],{"class":4052},"contact_method",[282,5355,4066],{"class":4043},[282,5357,4056],{"class":4043},[282,5359,4059],{"class":4043},[282,5361,4630],{"class":4062},[282,5363,4066],{"class":4043},[282,5365,4069],{"class":4043},[282,5367,5368,5370,5373,5375,5377,5379,5382,5384],{"class":284,"line":338},[282,5369,5350],{"class":4043},[282,5371,5372],{"class":4052},"appointment_time",[282,5374,4066],{"class":4043},[282,5376,4056],{"class":4043},[282,5378,4059],{"class":4043},[282,5380,5381],{"class":4062},"morning",[282,5383,4066],{"class":4043},[282,5385,4069],{"class":4043},[282,5387,5388,5390,5393,5395,5397,5399,5401],{"class":284,"line":344},[282,5389,5350],{"class":4043},[282,5391,5392],{"class":4052},"technician_preference",[282,5394,4066],{"class":4043},[282,5396,4056],{"class":4043},[282,5398,4059],{"class":4043},[282,5400,5269],{"class":4062},[282,5402,5403],{"class":4043},"\"\n",[282,5405,5406],{"class":284,"line":350},[282,5407,5408],{"class":4043},"      }\n",[282,5410,5411],{"class":284,"line":356},[282,5412,5413],{"class":4043},"    }\n",[282,5415,5416],{"class":284,"line":362},[282,5417,5418],{"class":4043},"  },\n",[282,5420,5421,5423,5426,5428,5430],{"class":284,"line":368},[282,5422,5227],{"class":4043},[282,5424,5425],{"class":4035},"boilers",[282,5427,4066],{"class":4043},[282,5429,4056],{"class":4043},[282,5431,4047],{"class":4043},[282,5433,5434,5436,5439,5441,5443],{"class":284,"line":374},[282,5435,5241],{"class":4043},[282,5437,5438],{"class":5244},"BOIL001",[282,5440,4066],{"class":4043},[282,5442,4056],{"class":4043},[282,5444,4047],{"class":4043},[282,5446,5447,5449,5451,5453,5455,5457,5459,5461],{"class":284,"line":380},[282,5448,5256],{"class":4043},[282,5450,4164],{"class":5259},[282,5452,4066],{"class":4043},[282,5454,4056],{"class":4043},[282,5456,4059],{"class":4043},[282,5458,5245],{"class":4062},[282,5460,4066],{"class":4043},[282,5462,4069],{"class":4043},[282,5464,5465,5467,5470,5472,5474,5476,5479,5481],{"class":284,"line":386},[282,5466,5256],{"class":4043},[282,5468,5469],{"class":5259},"model",[282,5471,4066],{"class":4043},[282,5473,4056],{"class":4043},[282,5475,4059],{"class":4043},[282,5477,5478],{"class":4062},"Worcester Bosch 8000 Style",[282,5480,4066],{"class":4043},[282,5482,4069],{"class":4043},[282,5484,5485,5487,5490,5492,5494,5496,5499,5501],{"class":284,"line":392},[282,5486,5256],{"class":4043},[282,5488,5489],{"class":5259},"installation_date",[282,5491,4066],{"class":4043},[282,5493,4056],{"class":4043},[282,5495,4059],{"class":4043},[282,5497,5498],{"class":4062},"2023-03-15",[282,5500,4066],{"class":4043},[282,5502,4069],{"class":4043},[282,5504,5505,5507,5510,5512,5514,5516,5519,5521],{"class":284,"line":398},[282,5506,5256],{"class":4043},[282,5508,5509],{"class":5259},"warranty_expiry",[282,5511,4066],{"class":4043},[282,5513,4056],{"class":4043},[282,5515,4059],{"class":4043},[282,5517,5518],{"class":4062},"2028-03-15",[282,5520,4066],{"class":4043},[282,5522,4069],{"class":4043},[282,5524,5525,5527,5530,5532,5534,5536,5539,5541],{"class":284,"line":404},[282,5526,5256],{"class":4043},[282,5528,5529],{"class":5259},"last_service",[282,5531,4066],{"class":4043},[282,5533,4056],{"class":4043},[282,5535,4059],{"class":4043},[282,5537,5538],{"class":4062},"2024-01-12",[282,5540,4066],{"class":4043},[282,5542,4069],{"class":4043},[282,5544,5545,5547,5550,5552,5554,5556,5559],{"class":284,"line":409},[282,5546,5256],{"class":4043},[282,5548,5549],{"class":5259},"next_service_due",[282,5551,4066],{"class":4043},[282,5553,4056],{"class":4043},[282,5555,4059],{"class":4043},[282,5557,5558],{"class":4062},"2025-01-12",[282,5560,5403],{"class":4043},[282,5562,5563],{"class":284,"line":415},[282,5564,5413],{"class":4043},[282,5566,5567],{"class":284,"line":421},[282,5568,4174],{"class":4043},[282,5570,5571],{"class":284,"line":427},[282,5572,4179],{"class":4043},[104,5574,5575,5578],{},[108,5576,5577],{},"Data Structure Overview",": The system uses JSON files to simulate a real database, with structured data for customers, boilers, maintenance schedules, and orders. Each record includes comprehensive information needed for the chatbot interactions.",[99,5580,5582,5588],{"className":5581},[133,134,135],[137,5583,5585],{"id":5584},"_5-testing-and-qa",[108,5586,5587],{},"5. Testing and QA",[104,5589,5590],{},[146,5591,5592],{"href":148},[108,5593,151],{},[99,5595,5597],{"className":5596},[102],[104,5598,5599],{},"The MCP-in-Chat project includes a comprehensive testing suite that ensures reliability and functionality across all components.",[801,5601,5603],{"id":5602},"test-coverage","Test Coverage",[156,5605,5606,5612,5618,5624,5630],{},[159,5607,5608,5611],{},[108,5609,5610],{},"MCP Tools",": All 4 tools tested with various input scenarios",[159,5613,5614,5617],{},[108,5615,5616],{},"API Endpoints",": Complete REST API testing with authentication",[159,5619,5620,5623],{},[108,5621,5622],{},"Error Handling",": Validation of error responses and edge cases",[159,5625,5626,5629],{},[108,5627,5628],{},"Integration",": End-to-end workflow testing",[159,5631,5632,5635],{},[108,5633,5634],{},"Performance",": Response time and load testing",[801,5637,5639],{"id":5638},"test-results-summary","Test Results Summary",[235,5641,5644],{"className":5642,"code":5643,"language":240},[238],"📊 TEST SUMMARY\n============================================================\nTotal Tests: 5\nPassed: 5 ✅\nFailed: 0 ❌\nSuccess Rate: 100.0%\n\n📋 DETAILED RESULTS\n------------------------------------------------------------\n1. boiler-info: ✅ PASS\n2. maintenance-get: ✅ PASS\n3. maintenance-schedule: ✅ PASS\n4. purchase: ✅ PASS\n5. email: ✅ PASS\n\n🎉 All tests passed! MCP tools are working correctly.\n",[243,5645,5643],{"__ignoreMap":241},[801,5647,5649],{"id":5648},"quick-test-commands","Quick Test Commands",[235,5651,5655],{"className":5652,"code":5653,"language":5654,"meta":241,"style":241},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Run all MCP tool tests\nnpm test\n\n# Test specific components\nnpm run test:api          # Backend API tests\nnpm run test:mcp          # Cursor MCP integration\nnpm run test:protocol     # MCP protocol validation\nnpm run test:compiled     # Compiled version test\nnpm run test:connection   # Connection test\nnpm run test:quick        # Quick health check\n","bash",[243,5656,5657,5662,5670,5675,5680,5693,5705,5717,5729,5741],{"__ignoreMap":241},[282,5658,5659],{"class":284,"line":285},[282,5660,5661],{"class":4029},"# Run all MCP tool tests\n",[282,5663,5664,5667],{"class":284,"line":291},[282,5665,5666],{"class":5244},"npm",[282,5668,5669],{"class":4062}," test\n",[282,5671,5672],{"class":284,"line":297},[282,5673,5674],{"emptyLinePlaceholder":2128},"\n",[282,5676,5677],{"class":284,"line":303},[282,5678,5679],{"class":4029},"# Test specific components\n",[282,5681,5682,5684,5687,5690],{"class":284,"line":309},[282,5683,5666],{"class":5244},[282,5685,5686],{"class":4062}," run",[282,5688,5689],{"class":4062}," test:api",[282,5691,5692],{"class":4029},"          # Backend API tests\n",[282,5694,5695,5697,5699,5702],{"class":284,"line":315},[282,5696,5666],{"class":5244},[282,5698,5686],{"class":4062},[282,5700,5701],{"class":4062}," test:mcp",[282,5703,5704],{"class":4029},"          # Cursor MCP integration\n",[282,5706,5707,5709,5711,5714],{"class":284,"line":321},[282,5708,5666],{"class":5244},[282,5710,5686],{"class":4062},[282,5712,5713],{"class":4062}," test:protocol",[282,5715,5716],{"class":4029},"     # MCP protocol validation\n",[282,5718,5719,5721,5723,5726],{"class":284,"line":327},[282,5720,5666],{"class":5244},[282,5722,5686],{"class":4062},[282,5724,5725],{"class":4062}," test:compiled",[282,5727,5728],{"class":4029},"     # Compiled version test\n",[282,5730,5731,5733,5735,5738],{"class":284,"line":332},[282,5732,5666],{"class":5244},[282,5734,5686],{"class":4062},[282,5736,5737],{"class":4062}," test:connection",[282,5739,5740],{"class":4029},"   # Connection test\n",[282,5742,5743,5745,5747,5750],{"class":284,"line":338},[282,5744,5666],{"class":5244},[282,5746,5686],{"class":4062},[282,5748,5749],{"class":4062}," test:quick",[282,5751,5752],{"class":4029},"        # Quick health check\n",[99,5754,5756,5762],{"className":5755},[133,134,135],[137,5757,5759],{"id":5758},"_6-getting-started",[108,5760,5761],{},"6. Getting Started",[104,5763,5764],{},[146,5765,5766],{"href":148},[108,5767,151],{},[99,5769,5771],{"className":5770},[102],[104,5772,5773],{},"The MCP-in-Chat project is designed to be easily accessible for developers who want to understand and implement MCP servers for their own use cases.",[801,5775,5777],{"id":5776},"prerequisites","Prerequisites",[156,5779,5780,5783,5786,5789],{},[159,5781,5782],{},"Node.js 18+ and npm",[159,5784,5785],{},"TypeScript knowledge",[159,5787,5788],{},"Basic understanding of MCP protocol",[159,5790,5791],{},"Access to external chatbots (Claude, ChatGPT, Cursor)",[801,5793,5795],{"id":5794},"installation","Installation",[235,5797,5799],{"className":5652,"code":5798,"language":5654,"meta":241,"style":241},"# Clone the repository\ngit clone https://github.com/michaelwybraniec/mcp-in-chat.git\ncd mcp-in-chat\n\n# Install dependencies\nnpm install\n\n# Build the project\nnpm run build\n\n# Start the API server\nnpm run start:api\n\n# Start the MCP server (in another terminal)\nnpm run start:mcp\n",[243,5800,5801,5806,5817,5826,5830,5835,5842,5846,5851,5860,5864,5869,5878,5882,5887],{"__ignoreMap":241},[282,5802,5803],{"class":284,"line":285},[282,5804,5805],{"class":4029},"# Clone the repository\n",[282,5807,5808,5811,5814],{"class":284,"line":291},[282,5809,5810],{"class":5244},"git",[282,5812,5813],{"class":4062}," clone",[282,5815,5816],{"class":4062}," https://github.com/michaelwybraniec/mcp-in-chat.git\n",[282,5818,5819,5823],{"class":284,"line":297},[282,5820,5822],{"class":5821},"s2Zo4","cd",[282,5824,5825],{"class":4062}," mcp-in-chat\n",[282,5827,5828],{"class":284,"line":303},[282,5829,5674],{"emptyLinePlaceholder":2128},[282,5831,5832],{"class":284,"line":309},[282,5833,5834],{"class":4029},"# Install dependencies\n",[282,5836,5837,5839],{"class":284,"line":315},[282,5838,5666],{"class":5244},[282,5840,5841],{"class":4062}," install\n",[282,5843,5844],{"class":284,"line":321},[282,5845,5674],{"emptyLinePlaceholder":2128},[282,5847,5848],{"class":284,"line":327},[282,5849,5850],{"class":4029},"# Build the project\n",[282,5852,5853,5855,5857],{"class":284,"line":332},[282,5854,5666],{"class":5244},[282,5856,5686],{"class":4062},[282,5858,5859],{"class":4062}," build\n",[282,5861,5862],{"class":284,"line":338},[282,5863,5674],{"emptyLinePlaceholder":2128},[282,5865,5866],{"class":284,"line":344},[282,5867,5868],{"class":4029},"# Start the API server\n",[282,5870,5871,5873,5875],{"class":284,"line":350},[282,5872,5666],{"class":5244},[282,5874,5686],{"class":4062},[282,5876,5877],{"class":4062}," start:api\n",[282,5879,5880],{"class":284,"line":356},[282,5881,5674],{"emptyLinePlaceholder":2128},[282,5883,5884],{"class":284,"line":362},[282,5885,5886],{"class":4029},"# Start the MCP server (in another terminal)\n",[282,5888,5889,5891,5893],{"class":284,"line":368},[282,5890,5666],{"class":5244},[282,5892,5686],{"class":4062},[282,5894,5895],{"class":4062}," start:mcp\n",[801,5897,5899],{"id":5898},"integration-with-external-chatbots","Integration with External Chatbots",[104,5901,5902],{},"The MCP server is designed to work with any MCP-compatible chatbot:",[2267,5904,5905,5911,5917],{},[159,5906,5907,5910],{},[108,5908,5909],{},"Claude Desktop",": Add the MCP server to Claude's configuration",[159,5912,5913,5916],{},[108,5914,5915],{},"ChatGPT",": Use the MCP server as a custom tool",[159,5918,5919,5922],{},[108,5920,5921],{},"Cursor IDE",": Integrate directly with the development environment",[801,5924,5926],{"id":5925},"customization","Customization",[104,5928,5929],{},"The project is designed to be easily customizable for different business domains:",[2267,5931,5932,5938,5944,5950],{},[159,5933,5934,5937],{},[108,5935,5936],{},"Replace Mock Services",": Connect to real APIs and databases",[159,5939,5940,5943],{},[108,5941,5942],{},"Add New Tools",": Extend the MCP server with additional functionality",[159,5945,5946,5949],{},[108,5947,5948],{},"Modify Business Logic",": Adapt the services for your specific use case",[159,5951,5952,5955],{},[108,5953,5954],{},"Enhance Security",": Add additional authentication and authorization layers",[99,5957,5959,5965],{"className":5958},[133,134,135],[137,5960,5962],{"id":5961},"_7-lessons-learned",[108,5963,5964],{},"7. Lessons Learned",[104,5966,5967],{},[146,5968,5969],{"href":148},[108,5970,151],{},[99,5972,5974],{"className":5973},[102],[104,5975,5976],{},"The MCP-in-Chat project provides valuable insights into building production-ready MCP servers and integrating them with external chatbots.",[801,5978,5980],{"id":5979},"key-success-factors","Key Success Factors",[2267,5982,5983,5989,5995,6001,6006],{},[159,5984,5985,5988],{},[108,5986,5987],{},"Layered Architecture",": Clear separation between MCP tools, API layer, and business logic",[159,5990,5991,5994],{},[108,5992,5993],{},"Comprehensive Testing",": 100% test coverage ensures reliability",[159,5996,5997,6000],{},[108,5998,5999],{},"Security First",": Authentication, validation, and rate limiting from the start",[159,6002,6003,6005],{},[108,6004,3375],{},": Complete documentation for easy onboarding",[159,6007,6008,6011],{},[108,6009,6010],{},"Mock Services",": Realistic data simulation for development and testing",[801,6013,6015],{"id":6014},"common-challenges-and-solutions","Common Challenges and Solutions",[2267,6017,6018,6037,6054,6071],{},[159,6019,6020,6023],{},[108,6021,6022],{},"External Integration Complexity",[156,6024,6025,6031],{},[159,6026,6027,6030],{},[108,6028,6029],{},"Challenge",": Testing with external chatbots can be difficult",[159,6032,6033,6036],{},[108,6034,6035],{},"Solution",": Comprehensive local testing suite with realistic scenarios",[159,6038,6039,6042],{},[108,6040,6041],{},"Security Implementation",[156,6043,6044,6049],{},[159,6045,6046,6048],{},[108,6047,6029],{},": Ensuring secure communication between components",[159,6050,6051,6053],{},[108,6052,6035],{},": Layered security with authentication at each level",[159,6055,6056,6059],{},[108,6057,6058],{},"Data Management",[156,6060,6061,6066],{},[159,6062,6063,6065],{},[108,6064,6029],{},": Maintaining consistent state across services",[159,6067,6068,6070],{},[108,6069,6035],{},": Centralized data layer with access controls",[159,6072,6073,6075],{},[108,6074,5622],{},[156,6076,6077,6082],{},[159,6078,6079,6081],{},[108,6080,6029],{},": Graceful error handling in conversational interfaces",[159,6083,6084,6086],{},[108,6085,6035],{},": Structured error responses with actionable guidance",[801,6088,6090],{"id":6089},"performance-considerations","Performance Considerations",[156,6092,6093,6099,6105,6111],{},[159,6094,6095,6098],{},[108,6096,6097],{},"Response Time",": MCP tools should respond within 2-3 seconds",[159,6100,6101,6104],{},[108,6102,6103],{},"Rate Limiting",": Implement appropriate rate limits to prevent abuse",[159,6106,6107,6110],{},[108,6108,6109],{},"Caching",": Cache frequently accessed data to improve performance",[159,6112,6113,6116],{},[108,6114,6115],{},"Monitoring",": Implement comprehensive logging and monitoring",[99,6118,6120,6126],{"className":6119},[133,134,135],[137,6121,6123],{"id":6122},"_8-future-enhancements",[108,6124,6125],{},"8. Future Enhancements",[104,6127,6128],{},[146,6129,6130],{"href":148},[108,6131,151],{},[99,6133,6135],{"className":6134},[102],[104,6136,6137],{},"The MCP-in-Chat project serves as a foundation for more sophisticated MCP server implementations and provides a roadmap for future development.",[801,6139,6141],{"id":6140},"possibilities","Possibilities",[2267,6143,6144,6163,6182,6201],{},[159,6145,6146,6149],{},[108,6147,6148],{},"Real Service Integration",[156,6150,6151,6154,6157,6160],{},[159,6152,6153],{},"Replace mock services with real APIs",[159,6155,6156],{},"Integrate with payment gateways",[159,6158,6159],{},"Connect to customer databases",[159,6161,6162],{},"Implement real email services",[159,6164,6165,6168],{},[108,6166,6167],{},"Advanced Features",[156,6169,6170,6173,6176,6179],{},[159,6171,6172],{},"Multi-language support",[159,6174,6175],{},"Voice integration",[159,6177,6178],{},"Mobile app integration",[159,6180,6181],{},"Advanced analytics and reporting",[159,6183,6184,6187],{},[108,6185,6186],{},"Scalability Improvements",[156,6188,6189,6192,6195,6198],{},[159,6190,6191],{},"Microservices architecture",[159,6193,6194],{},"Load balancing",[159,6196,6197],{},"Database optimization",[159,6199,6200],{},"Caching strategies",[159,6202,6203,6206],{},[108,6204,6205],{},"Security Enhancements",[156,6207,6208,6211,6214,6217],{},[159,6209,6210],{},"OAuth 2.0 integration",[159,6212,6213],{},"Role-based access control",[159,6215,6216],{},"Audit logging",[159,6218,6219],{},"Compliance features",[801,6221,6223],{"id":6222},"industry-applications","Industry Applications",[104,6225,6226],{},"The MCP-in-Chat architecture can be adapted for various industries:",[2267,6228,6229,6235,6241,6247,6253],{},[159,6230,6231,6234],{},[108,6232,6233],{},"Healthcare",": Patient appointment scheduling and medical record access",[159,6236,6237,6240],{},[108,6238,6239],{},"Finance",": Account management and transaction processing",[159,6242,6243,6246],{},[108,6244,6245],{},"Education",": Course registration and student services",[159,6248,6249,6252],{},[108,6250,6251],{},"Real Estate",": Property search and booking management",[159,6254,6255,6258],{},[108,6256,6257],{},"Travel",": Flight booking and itinerary management",[99,6260,6262,6268],{"className":6261},[133,134,135],[137,6263,6265],{"id":6264},"_9-conclusion",[108,6266,6267],{},"9. Conclusion",[104,6269,6270],{},[146,6271,6272],{"href":148},[108,6273,151],{},[99,6275,6277],{"className":6276},[102],[104,6278,6279],{},"The MCP-in-Chat project demonstrates the power and potential of Model Context Protocol servers in creating sophisticated, conversational AI systems. By providing a complete, production-ready example, it serves as both a learning resource and a foundation for real-world implementations.",[801,6281,6283],{"id":6282},"key-takeaways","Key Takeaways",[2267,6285,6286,6292,6298,6304,6310],{},[159,6287,6288,6291],{},[108,6289,6290],{},"MCP Servers Enable Real Business Value",": The project shows how MCP servers can bridge the gap between conversational AI and enterprise systems",[159,6293,6294,6297],{},[108,6295,6296],{},"Systematic Development Works",": The AWP methodology ensured consistent, high-quality development",[159,6299,6300,6303],{},[108,6301,6302],{},"Security is Paramount",": Layered security architecture is essential for production systems",[159,6305,6306,6309],{},[108,6307,6308],{},"Testing is Critical",": Comprehensive testing ensures reliability and functionality",[159,6311,6312,6315],{},[108,6313,6314],{},"Documentation Matters",": Complete documentation enables easy adoption and customization",[801,6317,6319],{"id":6318},"next-steps","Next Steps",[104,6321,6322],{},"The MCP-in-Chat project represents a significant step forward in making MCP servers accessible and practical for real-world applications. By providing a complete, working example, it lowers the barrier to entry for developers who want to integrate conversational AI with their business systems.",[207,6324],{},[104,6326,6327,4056],{},[108,6328,6329],{},"Resources",[156,6331,6332,6338,6345],{},[159,6333,6334],{},[146,6335,6337],{"href":3293,"rel":6336},[3252],"MCP-in-Chat Repository",[159,6339,6340],{},[146,6341,6344],{"href":6342,"rel":6343},"https://modelcontextprotocol.io/",[3252],"Model Context Protocol Documentation",[159,6346,6347],{},[146,6348,3319],{"href":6349,"rel":6350},"https://github.com/michaelwybraniec/mcp-agentic-sldc",[3252],[2379,6352,6353],{},"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":241,"searchDepth":291,"depth":291,"links":6355},[6356,6364,6370,6375,6380,6385,6391,6396,6400],{"id":3302,"depth":291,"text":3305,"children":6357},[6358,6359,6360,6361,6362,6363],{"id":3330,"depth":297,"text":3331},{"id":3349,"depth":297,"text":3350},{"id":3385,"depth":297,"text":3386},{"id":3473,"depth":297,"text":3474},{"id":3490,"depth":297,"text":3491},{"id":3532,"depth":297,"text":3533},{"id":3998,"depth":291,"text":4001,"children":6365},[6366,6367,6368,6369],{"id":4016,"depth":297,"text":4017},{"id":4188,"depth":297,"text":4189},{"id":4408,"depth":297,"text":4409},{"id":4597,"depth":297,"text":4598},{"id":4801,"depth":291,"text":4804,"children":6371},[6372,6373,6374],{"id":4819,"depth":297,"text":4820},{"id":4840,"depth":297,"text":4841},{"id":4859,"depth":297,"text":4860},{"id":4881,"depth":291,"text":4884,"children":6376},[6377,6378,6379],{"id":4899,"depth":297,"text":4900},{"id":5152,"depth":297,"text":5153},{"id":5209,"depth":297,"text":5210},{"id":5584,"depth":291,"text":5587,"children":6381},[6382,6383,6384],{"id":5602,"depth":297,"text":5603},{"id":5638,"depth":297,"text":5639},{"id":5648,"depth":297,"text":5649},{"id":5758,"depth":291,"text":5761,"children":6386},[6387,6388,6389,6390],{"id":5776,"depth":297,"text":5777},{"id":5794,"depth":297,"text":5795},{"id":5898,"depth":297,"text":5899},{"id":5925,"depth":297,"text":5926},{"id":5961,"depth":291,"text":5964,"children":6392},[6393,6394,6395],{"id":5979,"depth":297,"text":5980},{"id":6014,"depth":297,"text":6015},{"id":6089,"depth":297,"text":6090},{"id":6122,"depth":291,"text":6125,"children":6397},[6398,6399],{"id":6140,"depth":297,"text":6141},{"id":6222,"depth":297,"text":6223},{"id":6264,"depth":291,"text":6267,"children":6401},[6402,6403],{"id":6282,"depth":297,"text":6283},{"id":6318,"depth":297,"text":6319},"2025-08-06","A comprehensive demonstration of how to build a MCP server for e-commerce chatbot integration, featuring boiler maintenance services with real-time data access and automated workflows using AWP.",{"src":3271},{},{"title":39,"description":6405},"RrqjhUG3KDCDLGQqiZsaqs1jU3M6Mjueap7VMxPqb7k",1790785954108]