[{"data":1,"prerenderedAt":5565},["ShallowReactive",2],{"navigation_es":3,"posts_es:/es/blog/commercial-architecture-chain":55,"blog-alt-locales:commercial-architecture-chain:es":2390,"posts_es:/es/blog/commercial-architecture-chain:surround":2393},[4],{"title":5,"path":6,"stem":7,"children":8,"page":54},"Es","/es","es",[9],{"title":10,"path":11,"stem":12,"children":13,"page":54},"Blog","/es/blog","es/blog",[14,18,22,26,30,34,38,42,46,50],{"title":15,"path":16,"stem":17},"Servidores MCP: Conectando IA a Datos en Tiempo Real","/es/blog/mcp-create","es/blog/1. mcp-create",{"title":19,"path":20,"stem":21},"Prácticas de Seguridad para MCP Usando JSON-RPC","/es/blog/mcp-security","es/blog/1. mcp-security",{"title":23,"path":24,"stem":25},"Agentes MCP Tiny On-Premises: Liberándose de las Dependencias en la Nube","/es/blog/mcp-tiny-agents-on-premises","es/blog/5. mcp-tiny-agents-on-premises",{"title":27,"path":28,"stem":29},"De la Idea a la API en 2 Días: Construyendo Bankly con Flujos de Trabajo Agénticos","/es/blog/overvibing","es/blog/6. overvibing",{"title":31,"path":32,"stem":33},"Chatbot IA, Servidor MCP construido con Protocolo de Flujo de Trabajo Agéntico para demo en Checkatrade.com","/es/blog/mcp-in-chat-demo","es/blog/8. mcp-in-chat-demo",{"title":35,"path":36,"stem":37},"DDD y Frameworks Full-Stack","/es/blog/architecture","es/blog/architecture",{"title":39,"path":40,"stem":41},"Commercial architecture es una cadena, no una pricing page","/es/blog/commercial-architecture-chain","es/blog/commercial-architecture-chain",{"title":43,"path":44,"stem":45},"Calidad: ¿Cómo proteger Frontends potenciados por IA?","/es/blog/qa-front","es/blog/qa-front",{"title":47,"path":48,"stem":49},"Consultoría y Estrategia IT","/es/blog/strategy","es/blog/strategy",{"title":51,"path":52,"stem":53},"Sistemas Distribuidos","/es/blog/systems","es/blog/systems",false,{"id":56,"title":39,"authors":57,"badge":64,"body":68,"date":2382,"description":2383,"extension":2384,"image":2385,"meta":2387,"navigation":2105,"path":40,"seo":2388,"stem":41,"__hash__":2389},"posts_es/es/blog/commercial-architecture-chain.md",[58],{"name":59,"description":60,"to":61,"avatar":62},"Michael Wybraniec","Diseño de sistemas, automatización GenAI y arquitectura","https://www.linkedin.com/in/one-front/",{"src":63},"https://media.licdn.com/dms/image/v2/D4D03AQEGvIVcrTTS2g/profile-displayphoto-shrink_800_800/B4DZbtSf7LIEAc-/0/1747737772225?e=1753315200&v=beta&t=EOviZQkM396PoGctVjDCdlG8U3vN5UKWiIeNQ8IFUgQ",{"label":65,"color":66,"variant":67},"Architecture, RevOps","primary","soft",{"type":69,"value":70,"toc":2359},"minimark",[71,74,110,132,186,189,204,214,225,231,244,254,446,464,466,481,491,609,622,628,737,749,751,766,776,783,793,818,908,914,920,932,1093,1099,1105,1129,1135,1141,1162,1168,1178,1203,1209,1215,1231,1237,1243,1259,1265,1275,1283,1299,1301,1316,1326,1386,1428,1491,1508,1528,1606,1608,1623,1629,1721,1727,1754,1777,1779,1794,1816,1818,1833,1843,1892,2022,2062,2071,2073,2088,2094,2183,2185,2200,2206,2212,2220,2222,2237,2243,2284,2290,2292,2307,2322,2342,2355],[72,73],"br",{},[75,76,79,88,103],"div",{"className":77},[78],"text-justify",[80,81,82,83,87],"p",{},"La mayoría de equipos publica una ",[84,85,86],"strong",{},"pricing page"," y lo llama monetization. Luego añaden Stripe. Luego hardcodean “Pro gets feature X” en tres rutas de API. Luego ops necesita una cuenta complimentary y alguien abre un hotfix. Luego llega la factura del vendor y nadie sabe qué tenant quemó el margen.",[80,89,90,91,94,95,98,99,102],{},"Ese patrón es habitual porque el atajo de soft-launch — “pricing + FinOps + growth” — suena completo. Es ",[84,92,93],{},"necesario pero incompleto",". Un modelo commercial serio no es un documento, una página o una integración de billing. Es un ",[84,96,97],{},"system of capabilities"," con owners nombrados, una secuencia clara y un único product ",[84,100,101],{},"catalog"," como source of truth.",[80,104,105,106,109],{},"Este artículo es ",[84,107,108],{},"project-agnostic",": una commercial architecture portable que cualquier equipo SaaS o multi-tenant puede reutilizar. Misma idea que en architecture de dominio en este blog — boundaries first, enforce at the edge, no inventes una segunda verdad en el payment provider.",[75,111,116,123],{"className":112},[113,114,115],"flex","justify-between","items-center",[117,118,120],"h2",{"id":119},"tldr",[84,121,122],{},"TL;DR",[80,124,125],{},[126,127,129],"a",{"href":128},"#top",[84,130,131],{},"⤴",[75,133,135],{"className":134},[78],[136,137,138,146,152,158,169,175],"ul",{},[139,140,141,142,145],"li",{},"Monetization es una ",[84,143,144],{},"chain",": catalog → agreement → provision → entitlements → meter → bill → cash (+ FinOps cost loop).",[139,147,148,151],{},[84,149,150],{},"One catalog"," alimenta pricing, admin, entitlements y billing — nunca una segunda lista de plans en el MoR.",[139,153,154,157],{},[84,155,156],{},"Entitlements ≠ feature flags","; deny con un upgrade path claro.",[139,159,160,161,164,165,168],{},"Ship ",[84,162,163],{},"Encode"," (catalog + enforce + gates + admin) antes de ",[84,166,167],{},"Charge","; legalize antes del primer pago real.",[139,170,171,174],{},[84,172,173],{},"Cost ≠ revenue"," — FinOps y pricing son ledgers separados.",[139,176,177,178,181,182,185],{},"Quédate con el ",[84,179,180],{},"cheat sheet"," y la lista ",[84,183,184],{},"Start Monday"," al final.",[187,188],"hr",{},[75,190,192,198],{"className":191},[113,114,115],[117,193,195],{"id":194},"_1-la-chain-qué-significa-best",[84,196,197],{},"1. La chain (qué significa “best”)",[80,199,200],{},[126,201,202],{"href":128},[84,203,131],{},[75,205,207],{"className":206},[78],[80,208,209,210,213],{},"Los stacks líderes de billing y entitlements (Stripe Billing / Chargebee-class, capas entitlement + meter, práctica FinOps en el lado del coste) tratan la monetization como ",[84,211,212],{},"one governed chain",". Marketing puede empezar con una pricing page. Architecture empieza aquí:",[215,216,222],"pre",{"className":217,"code":219,"language":220,"meta":221},[218],"language-text","Catalog (what we sell)\n  → Quote / order / subscription (commercial agreement)\n    → Provisioning (tenant exists)\n      → Entitlements (what runtime may do)\n        → Metering (what was used)\n          → Rating & billing (what we invoice)\n            → Cash & revenue ops (collected, recognized)\n","text","",[223,224,219],"code",{"__ignoreMap":221},[75,226,228],{"className":227},[78],[80,229,230],{},"Cada flecha es un handoff. Si saltas un eslabón — por ejemplo billing sin entitlements, o entitlements sin catalog — el siguiente equipo inventa su propia verdad. Así acabas con tres listas de plans: una en la web, una en el folklore de admin, una en Stripe.",[75,232,234],{"className":233},[78],[80,235,236,239,240,243],{},[84,237,238],{},"Matiz:"," entitlements y metering no son solo left-to-right. Los caps a menudo ",[84,241,242],{},"leen meters"," (“allow if usage is under the limit”), así que los meters alimentan entitlements, billing y FinOps. Mantén la chain de siete pasos como historia principal; el cap check es un feedback edge, no una excusa para fusionar “entitle + meter + bill” en un solo blob.",[75,245,247],{"className":246},[78],[80,248,249,250,253],{},"También hay un ",[84,251,252],{},"parallel cost loop",". Revenue pregunta “¿qué pagaron?” Cost pregunta “¿qué pagamos nosotros por servirles?” Mezclar ambas es cómo los equipos underprice para siempre o cortan features en pánico sin datos.",[215,255,259],{"className":256,"code":257,"language":258,"meta":221,"style":221},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","---\nheader: Commercial architecture - revenue chain and FinOps cost loop\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Revenue chain\"\n  - color: \"#F59E0B\"\n    text: \"Cost loop (FinOps)\"\n---\nflowchart TB\n  subgraph Revenue[\"Revenue chain\"]\n    direction LR\n    A[Catalog] --> B[Agreement]\n    B --> C[Provision]\n    C --> D[Entitlements]\n    D --> E[Metering]\n    E --> F[Billing]\n    F --> G[Cash / RevOps]\n    E -.->|caps / fair use| D\n  end\n  subgraph Cost[\"Cost loop (FinOps)\"]\n    direction LR\n    H[Allocate spend] --> I[Unit economics]\n    I --> J[Budgets / kill-switches]\n    J --> K[Price or package change]\n  end\n  E -.-> H\n  K -.-> A\n  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n  class A,B,C,D,E,F,G revenue\n  class H,I,J,K cost\n","mermaid",[223,260,261,269,275,281,287,293,299,305,310,316,322,328,334,340,346,352,358,364,370,376,382,387,393,399,405,410,416,422,428,434,440],{"__ignoreMap":221},[262,263,266],"span",{"class":264,"line":265},"line",1,[262,267,268],{},"---\n",[262,270,272],{"class":264,"line":271},2,[262,273,274],{},"header: Commercial architecture - revenue chain and FinOps cost loop\n",[262,276,278],{"class":264,"line":277},3,[262,279,280],{},"legend:\n",[262,282,284],{"class":264,"line":283},4,[262,285,286],{},"  - color: \"#3B82F6\"\n",[262,288,290],{"class":264,"line":289},5,[262,291,292],{},"    text: \"Revenue chain\"\n",[262,294,296],{"class":264,"line":295},6,[262,297,298],{},"  - color: \"#F59E0B\"\n",[262,300,302],{"class":264,"line":301},7,[262,303,304],{},"    text: \"Cost loop (FinOps)\"\n",[262,306,308],{"class":264,"line":307},8,[262,309,268],{},[262,311,313],{"class":264,"line":312},9,[262,314,315],{},"flowchart TB\n",[262,317,319],{"class":264,"line":318},10,[262,320,321],{},"  subgraph Revenue[\"Revenue chain\"]\n",[262,323,325],{"class":264,"line":324},11,[262,326,327],{},"    direction LR\n",[262,329,331],{"class":264,"line":330},12,[262,332,333],{},"    A[Catalog] --> B[Agreement]\n",[262,335,337],{"class":264,"line":336},13,[262,338,339],{},"    B --> C[Provision]\n",[262,341,343],{"class":264,"line":342},14,[262,344,345],{},"    C --> D[Entitlements]\n",[262,347,349],{"class":264,"line":348},15,[262,350,351],{},"    D --> E[Metering]\n",[262,353,355],{"class":264,"line":354},16,[262,356,357],{},"    E --> F[Billing]\n",[262,359,361],{"class":264,"line":360},17,[262,362,363],{},"    F --> G[Cash / RevOps]\n",[262,365,367],{"class":264,"line":366},18,[262,368,369],{},"    E -.->|caps / fair use| D\n",[262,371,373],{"class":264,"line":372},19,[262,374,375],{},"  end\n",[262,377,379],{"class":264,"line":378},20,[262,380,381],{},"  subgraph Cost[\"Cost loop (FinOps)\"]\n",[262,383,385],{"class":264,"line":384},21,[262,386,327],{},[262,388,390],{"class":264,"line":389},22,[262,391,392],{},"    H[Allocate spend] --> I[Unit economics]\n",[262,394,396],{"class":264,"line":395},23,[262,397,398],{},"    I --> J[Budgets / kill-switches]\n",[262,400,402],{"class":264,"line":401},24,[262,403,404],{},"    J --> K[Price or package change]\n",[262,406,408],{"class":264,"line":407},25,[262,409,375],{},[262,411,413],{"class":264,"line":412},26,[262,414,415],{},"  E -.-> H\n",[262,417,419],{"class":264,"line":418},27,[262,420,421],{},"  K -.-> A\n",[262,423,425],{"class":264,"line":424},28,[262,426,427],{},"  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,429,431],{"class":264,"line":430},29,[262,432,433],{},"  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n",[262,435,437],{"class":264,"line":436},30,[262,438,439],{},"  class A,B,C,D,E,F,G revenue\n",[262,441,443],{"class":264,"line":442},31,[262,444,445],{},"  class H,I,J,K cost\n",[75,447,449],{"className":448},[78],[80,450,451,452,455,456,459,460,463],{},"Los meters alimentan ",[84,453,454],{},"entitlements"," (caps), ",[84,457,458],{},"invoices"," (más tarde) y ",[84,461,462],{},"FinOps"," (siempre). Puedes meter para caps y fair use mucho antes de cobrar una tarjeta. Las flechas discontinuas son feedback: usage informa allow/deny y cost; cost informa packaging.",[187,465],{},[75,467,469,475],{"className":468},[113,114,115],[117,470,472],{"id":471},"_2-quién-posee-qué-actors",[84,473,474],{},"2. Quién posee qué (actors)",[80,476,477],{},[126,478,479],{"href":128},[84,480,131],{},[75,482,484],{"className":483},[78],[80,485,486,487,490],{},"FinOps es solo ",[84,488,489],{},"un"," actor — y solo en el lado del coste. La chain falla cuando todo se vuelca en “pricing”, “billing” o “engineering will add a flag”. Nombra a los owners, aunque al principio una persona lleve tres hats.",[492,493,494,507],"table",{},[495,496,497],"thead",{},[498,499,500,504],"tr",{},[501,502,503],"th",{},"Actor",[501,505,506],{},"Owns in the chain",[508,509,510,521,531,541,551,561,571,585,595],"tbody",{},[498,511,512,518],{},[513,514,515],"td",{},[84,516,517],{},"Product / packaging",[513,519,520],{},"Catalog: plans, SKUs, limits, trials",[498,522,523,528],{},[513,524,525],{},[84,526,527],{},"GTM / growth",[513,529,530],{},"Who may join; invite vs open; soft-launch vs paywall",[498,532,533,538],{},[513,534,535],{},[84,536,537],{},"Platform / engineering",[513,539,540],{},"Provisioning, entitlements at request time, metering events",[498,542,543,548],{},[513,544,545],{},[84,546,547],{},"Ops / admin",[513,549,550],{},"Live overrides, caps, complimentary access, kill-switches + audit",[498,552,553,558],{},[513,554,555],{},[84,556,557],{},"Billing / finance",[513,559,560],{},"Subscriptions, invoices, renewals, revenue recognition",[498,562,563,568],{},[513,564,565],{},[84,566,567],{},"Customer (buyer)",[513,569,570],{},"Plan, usage, invoices (portal)",[498,572,573,577],{},[513,574,575],{},[84,576,462],{},[513,578,579,580,584],{},"What ",[581,582,583],"em",{},"we"," pay; margin; budgets; cost kill-switches",[498,586,587,592],{},[513,588,589],{},[84,590,591],{},"Legal / compliance",[513,593,594],{},"Tax, merchant-of-record vs Connect, entity — before “charge” go-live",[498,596,597,606],{},[513,598,599,602,603],{},[84,600,601],{},"RevOps / CS"," ",[581,604,605],{},"(later)",[513,607,608],{},"Activate, expand, churn, support load",[75,610,612],{"className":611},[78],[80,613,614,617,618,621],{},[84,615,616],{},"RevOps"," alinea sales, marketing y customer success alrededor del revenue lifecycle — quién posee activation, expansion, renewal y señales de churn. Suele importar ",[84,619,620],{},"después de Charge",". Al principio suelen ser runbooks de founder + CS, no un equipo dedicado ni una superficie de producto.",[75,623,625],{"className":624},[78],[80,626,627],{},"Dos caminos, mismo sistema — ledgers distintos:",[215,629,631],{"className":256,"code":630,"language":258,"meta":221,"style":221},"---\nheader: Actors on revenue vs cost ledgers\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Revenue ledger\"\n  - color: \"#F59E0B\"\n    text: \"Cost ledger\"\n---\nflowchart LR\n  subgraph Rev[\"Revenue ledger\"]\n    direction LR\n    P[Product] --> GTM[GTM] --> PL[Platform] --> OPS[Ops] --> BIL[Billing] --> CU[Customer]\n  end\n  subgraph Cost[\"Cost ledger\"]\n    direction LR\n    U[Usage / infra] --> FO[FinOps] --> FB[Package / price / gates]\n  end\n  PL -.-> U\n  FB -.-> P\n  classDef revenue fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  classDef cost fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n  class P,GTM,PL,OPS,BIL,CU revenue\n  class U,FO,FB cost\n",[223,632,633,637,642,646,650,655,659,664,668,673,678,682,687,691,696,700,705,709,714,719,723,727,732],{"__ignoreMap":221},[262,634,635],{"class":264,"line":265},[262,636,268],{},[262,638,639],{"class":264,"line":271},[262,640,641],{},"header: Actors on revenue vs cost ledgers\n",[262,643,644],{"class":264,"line":277},[262,645,280],{},[262,647,648],{"class":264,"line":283},[262,649,286],{},[262,651,652],{"class":264,"line":289},[262,653,654],{},"    text: \"Revenue ledger\"\n",[262,656,657],{"class":264,"line":295},[262,658,298],{},[262,660,661],{"class":264,"line":301},[262,662,663],{},"    text: \"Cost ledger\"\n",[262,665,666],{"class":264,"line":307},[262,667,268],{},[262,669,670],{"class":264,"line":312},[262,671,672],{},"flowchart LR\n",[262,674,675],{"class":264,"line":318},[262,676,677],{},"  subgraph Rev[\"Revenue ledger\"]\n",[262,679,680],{"class":264,"line":324},[262,681,327],{},[262,683,684],{"class":264,"line":330},[262,685,686],{},"    P[Product] --> GTM[GTM] --> PL[Platform] --> OPS[Ops] --> BIL[Billing] --> CU[Customer]\n",[262,688,689],{"class":264,"line":336},[262,690,375],{},[262,692,693],{"class":264,"line":342},[262,694,695],{},"  subgraph Cost[\"Cost ledger\"]\n",[262,697,698],{"class":264,"line":348},[262,699,327],{},[262,701,702],{"class":264,"line":354},[262,703,704],{},"    U[Usage / infra] --> FO[FinOps] --> FB[Package / price / gates]\n",[262,706,707],{"class":264,"line":360},[262,708,375],{},[262,710,711],{"class":264,"line":366},[262,712,713],{},"  PL -.-> U\n",[262,715,716],{"class":264,"line":372},[262,717,718],{},"  FB -.-> P\n",[262,720,721],{"class":264,"line":378},[262,722,427],{},[262,724,725],{"class":264,"line":384},[262,726,433],{},[262,728,729],{"class":264,"line":389},[262,730,731],{},"  class P,GTM,PL,OPS,BIL,CU revenue\n",[262,733,734],{"class":264,"line":395},[262,735,736],{},"  class U,FO,FB cost\n",[75,738,740],{"className":739},[78],[80,741,742,745,746,748],{},[84,743,744],{},"Pricing / catalog / billing"," viven en el revenue ledger. ",[84,747,462],{}," vive en el cost ledger. Ninguno sustituye al otro. Cuando el margin falla, FinOps informa a Product; cuando un tenant supera el limit, Platform enforce y Ops puede override — con audit trail, no un DM de Slack y un deploy olvidado.",[187,750],{},[75,752,754,760],{"className":753},[113,114,115],[117,755,757],{"id":756},"_3-hard-rules-y-cómo-implementarlas",[84,758,759],{},"3. Hard rules — y cómo implementarlas",[80,761,762],{},[126,763,764],{"href":128},[84,765,131],{},[75,767,769],{"className":768},[78],[80,770,771,772,775],{},"Estas rules son la diferencia entre “tenemos pricing” y “tenemos commercial architecture”. Si las saltas, reconstruirás el mismo lío cada seis meses. Bajo cada rule: una ",[84,773,774],{},"strategy"," que puedes shippear sin esperar al billing suite perfecto.",[777,778,780],"h3",{"id":779},"_31-one-product-catalog",[84,781,782],{},"3.1 One product catalog",[75,784,786],{"className":785},[78],[80,787,788,789,792],{},"Plans, SKUs, limits y trial rules viven en ",[84,790,791],{},"una"," source of truth. Pricing page, admin y billing la leen todos.",[75,794,796],{"className":795},[78],[80,797,798,801,802,805,806,809,810,813,814,817],{},[84,799,800],{},"Strategy:"," Pon el catalog en código versionado o una tabla DB pequeña — ",[223,803,804],{},"plan_id",", display name, limits, trial days, module defaults. La ",[223,807,808],{},"/pricing"," pública y el copy i18n ",[84,811,812],{},"importan"," ese modelo; no redefinen tiers. Cuando llegue billing, crea productos MoR ",[84,815,816],{},"desde"," los catalog IDs (map 1:1), nunca al revés.",[215,819,821],{"className":256,"code":820,"language":258,"meta":221,"style":221},"---\nheader: One catalog as source of truth\nlegend:\n  - color: \"#10B981\"\n    text: \"Catalog SoT\"\n  - color: \"#3B82F6\"\n    text: \"Surfaces that read the catalog\"\n---\nflowchart TB\n  CAT[(Catalog SoT)]\n  CAT --> WEB[Pricing page]\n  CAT --> ADM[Admin console]\n  CAT --> RES[Entitlement resolver]\n  CAT --> MOR[Billing MoR 1:1 SKUs]\n  classDef sot fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n  classDef consumer fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  class CAT sot\n  class WEB,ADM,RES,MOR consumer\n",[223,822,823,827,832,836,841,846,850,855,859,863,868,873,878,883,888,893,898,903],{"__ignoreMap":221},[262,824,825],{"class":264,"line":265},[262,826,268],{},[262,828,829],{"class":264,"line":271},[262,830,831],{},"header: One catalog as source of truth\n",[262,833,834],{"class":264,"line":277},[262,835,280],{},[262,837,838],{"class":264,"line":283},[262,839,840],{},"  - color: \"#10B981\"\n",[262,842,843],{"class":264,"line":289},[262,844,845],{},"    text: \"Catalog SoT\"\n",[262,847,848],{"class":264,"line":295},[262,849,286],{},[262,851,852],{"class":264,"line":301},[262,853,854],{},"    text: \"Surfaces that read the catalog\"\n",[262,856,857],{"class":264,"line":307},[262,858,268],{},[262,860,861],{"class":264,"line":312},[262,862,315],{},[262,864,865],{"class":264,"line":318},[262,866,867],{},"  CAT[(Catalog SoT)]\n",[262,869,870],{"class":264,"line":324},[262,871,872],{},"  CAT --> WEB[Pricing page]\n",[262,874,875],{"class":264,"line":330},[262,876,877],{},"  CAT --> ADM[Admin console]\n",[262,879,880],{"class":264,"line":336},[262,881,882],{},"  CAT --> RES[Entitlement resolver]\n",[262,884,885],{"class":264,"line":342},[262,886,887],{},"  CAT --> MOR[Billing MoR 1:1 SKUs]\n",[262,889,890],{"class":264,"line":348},[262,891,892],{},"  classDef sot fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,894,895],{"class":264,"line":354},[262,896,897],{},"  classDef consumer fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,899,900],{"class":264,"line":360},[262,901,902],{},"  class CAT sot\n",[262,904,905],{"class":264,"line":366},[262,906,907],{},"  class WEB,ADM,RES,MOR consumer\n",[777,909,911],{"id":910},"_32-entitlements-feature-flags",[84,912,913],{},"3.2 Entitlements ≠ feature flags",[75,915,917],{"className":916},[78],[80,918,919],{},"Flags = rollout. Entitlements = verdad commercial + security en request time.",[75,921,923],{"className":922},[78],[80,924,925,927,928,931],{},[84,926,800],{}," Un resolver: ",[223,929,930],{},"tenant → plan + overrides → { modules, caps }",". Llámalo desde API middleware o una policy layer compartida en cada path de pago/coste. Reserva flags estilo LaunchDarkly para “¿está live este code path?”, no para “¿este tenant está en Pro?”.",[215,933,935],{"className":256,"code":934,"language":258,"meta":221,"style":221},"---\nheader: Feature flags vs entitlement resolver\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Request / resolve inputs\"\n  - color: \"#8B5CF6\"\n    text: \"Decision\"\n  - color: \"#10B981\"\n    text: \"Allow\"\n  - color: \"#EF4444\"\n    text: \"Deny / not shipped\"\n---\nflowchart TD\n  R[API request] --> F{Feature flag: code live?}\n  F -->|No| X[Not shipped]\n  F -->|Yes| V[Entitlement resolver]\n  V --> C[Catalog defaults]\n  V --> O[Tenant overrides]\n  V --> M[Monetization / kill-switch mode]\n  C --> D{Allowed?}\n  O --> D\n  M --> D\n  D -->|Yes| OK[Proceed + meter if needed]\n  D -->|No| DENY[Structured deny + upgrade CTA]\n  classDef ok fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n  classDef deny fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n  classDef decide fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n  classDef input fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  class OK ok\n  class DENY,X deny\n  class F,D decide\n  class R,V,C,O,M input\n",[223,936,937,941,946,950,954,959,964,969,973,978,983,988,992,997,1002,1007,1012,1017,1022,1027,1032,1037,1042,1047,1052,1057,1062,1067,1072,1077,1082,1087],{"__ignoreMap":221},[262,938,939],{"class":264,"line":265},[262,940,268],{},[262,942,943],{"class":264,"line":271},[262,944,945],{},"header: Feature flags vs entitlement resolver\n",[262,947,948],{"class":264,"line":277},[262,949,280],{},[262,951,952],{"class":264,"line":283},[262,953,286],{},[262,955,956],{"class":264,"line":289},[262,957,958],{},"    text: \"Request / resolve inputs\"\n",[262,960,961],{"class":264,"line":295},[262,962,963],{},"  - color: \"#8B5CF6\"\n",[262,965,966],{"class":264,"line":301},[262,967,968],{},"    text: \"Decision\"\n",[262,970,971],{"class":264,"line":307},[262,972,840],{},[262,974,975],{"class":264,"line":312},[262,976,977],{},"    text: \"Allow\"\n",[262,979,980],{"class":264,"line":318},[262,981,982],{},"  - color: \"#EF4444\"\n",[262,984,985],{"class":264,"line":324},[262,986,987],{},"    text: \"Deny / not shipped\"\n",[262,989,990],{"class":264,"line":330},[262,991,268],{},[262,993,994],{"class":264,"line":336},[262,995,996],{},"flowchart TD\n",[262,998,999],{"class":264,"line":342},[262,1000,1001],{},"  R[API request] --> F{Feature flag: code live?}\n",[262,1003,1004],{"class":264,"line":348},[262,1005,1006],{},"  F -->|No| X[Not shipped]\n",[262,1008,1009],{"class":264,"line":354},[262,1010,1011],{},"  F -->|Yes| V[Entitlement resolver]\n",[262,1013,1014],{"class":264,"line":360},[262,1015,1016],{},"  V --> C[Catalog defaults]\n",[262,1018,1019],{"class":264,"line":366},[262,1020,1021],{},"  V --> O[Tenant overrides]\n",[262,1023,1024],{"class":264,"line":372},[262,1025,1026],{},"  V --> M[Monetization / kill-switch mode]\n",[262,1028,1029],{"class":264,"line":378},[262,1030,1031],{},"  C --> D{Allowed?}\n",[262,1033,1034],{"class":264,"line":384},[262,1035,1036],{},"  O --> D\n",[262,1038,1039],{"class":264,"line":389},[262,1040,1041],{},"  M --> D\n",[262,1043,1044],{"class":264,"line":395},[262,1045,1046],{},"  D -->|Yes| OK[Proceed + meter if needed]\n",[262,1048,1049],{"class":264,"line":401},[262,1050,1051],{},"  D -->|No| DENY[Structured deny + upgrade CTA]\n",[262,1053,1054],{"class":264,"line":407},[262,1055,1056],{},"  classDef ok fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,1058,1059],{"class":264,"line":412},[262,1060,1061],{},"  classDef deny fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n",[262,1063,1064],{"class":264,"line":418},[262,1065,1066],{},"  classDef decide fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[262,1068,1069],{"class":264,"line":424},[262,1070,1071],{},"  classDef input fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,1073,1074],{"class":264,"line":430},[262,1075,1076],{},"  class OK ok\n",[262,1078,1079],{"class":264,"line":436},[262,1080,1081],{},"  class DENY,X deny\n",[262,1083,1084],{"class":264,"line":442},[262,1085,1086],{},"  class F,D decide\n",[262,1088,1090],{"class":264,"line":1089},32,[262,1091,1092],{},"  class R,V,C,O,M input\n",[777,1094,1096],{"id":1095},"_33-denied-ux-forma-parte-del-engine",[84,1097,1098],{},"3.3 Denied UX forma parte del engine",[75,1100,1102],{"className":1101},[78],[80,1103,1104],{},"Un fallo de entitlement devuelve un mensaje claro de upgrade / denied, nunca un silent fail.",[75,1106,1108],{"className":1107},[78],[80,1109,1110,1112,1113,1115,1116,1115,1119,1115,1122,1115,1125,1128],{},[84,1111,800],{}," Deny payload estándar: ",[223,1114,223],{},", ",[223,1117,1118],{},"limit",[223,1120,1121],{},"current",[223,1123,1124],{},"upgrade_to",[223,1126,1127],{},"cta_url"," opcional. La UI mapea codes a copy (“Storage full — upgrade to Plus”). Loguea denials con tenant + capability para product/FinOps. Nunca un 403 crudo con body vacío.",[777,1130,1132],{"id":1131},"_34-meter-before-you-bill",[84,1133,1134],{},"3.4 Meter before you bill",[75,1136,1138],{"className":1137},[78],[80,1139,1140],{},"Incluso productos seat/subscription hacen metering para caps, fair use y FinOps.",[75,1142,1144],{"className":1143},[78],[80,1145,1146,1148,1149,1115,1152,1115,1155,1115,1158,1161],{},[84,1147,800],{}," Emite usage events en los edges que cuestan dinero (email, storage, AI tokens, maps, outbound sync). Guarda ",[223,1150,1151],{},"tenant_id",[223,1153,1154],{},"metric",[223,1156,1157],{},"quantity",[223,1159,1160],{},"at",". Empieza con events append-only + totales en admin — sin math de invoice todavía. Los caps leen los mismos meters después; billing los ratea después.",[777,1163,1165],{"id":1164},"_35-overrides-son-first-class",[84,1166,1167],{},"3.5 Overrides son first-class",[75,1169,1171],{"className":1170},[78],[80,1172,1173,1174,1177],{},"Complimentary access, custom caps, extend trial — con ",[84,1175,1176],{},"audit",".",[75,1179,1181],{"className":1180},[78],[80,1182,1183,1185,1186,1115,1189,1115,1192,1115,1195,1198,1199,1202],{},[84,1184,800],{}," Modela overrides como data en el tenant: ",[223,1187,1188],{},"plan_override",[223,1190,1191],{},"cap_overrides",[223,1193,1194],{},"complimentary_until",[223,1196,1197],{},"notes",". Admin UI escribe; cada write añade ",[223,1200,1201],{},"who / when / what / before / after",". El resolver mergea catalog defaults ← overrides. Sin hotfix branches para “dales Plus”.",[777,1204,1206],{"id":1205},"_36-growth-is-gated",[84,1207,1208],{},"3.6 Growth is gated",[75,1210,1212],{"className":1211},[78],[80,1213,1214],{},"Invite vs open, monetization mode, cost kill-switches — sin redeploy.",[75,1216,1218],{"className":1217},[78],[80,1219,1220,1222,1223,1226,1227,1230],{},[84,1221,800],{}," Tabla de global settings (o config service): ",[223,1224,1225],{},"registration_mode"," (invite / open), ",[223,1228,1229],{},"monetization_mode"," (soft_launch / trial_enforced / paid_enforced), kill-switches por capability cara. Enforce en create-tenant y en features costosas. Defaults = soft-launch de hoy; pasar a paid es un settings change, no un release train.",[777,1232,1234],{"id":1233},"_37-cost-y-revenue-son-ledgers-separados",[84,1235,1236],{},"3.7 Cost y revenue son ledgers separados",[75,1238,1240],{"className":1239},[78],[80,1241,1242],{},"FinOps (lo que pagamos) nunca sustituye Pricing (lo que pagan ellos).",[75,1244,1246],{"className":1245},[78],[80,1247,1248,1250,1251,1254,1255,1258],{},[84,1249,800],{}," Dos vistas: ",[84,1252,1253],{},"revenue"," (plan, MRR, invoices) y ",[84,1256,1257],{},"cost"," (vendor invoices + usage allocated). Unit economics = cost per tenant vs price per tenant. Cuando el margin se rompe, cambia package/price o kill-switch — no lo “arregles” fingiendo que el cost es una plan feature.",[777,1260,1262],{"id":1261},"_38-legalize-before-charge",[84,1263,1264],{},"3.8 Legalize before charge",[75,1266,1268],{"className":1267},[78],[80,1269,1270,1271,1274],{},"Entity, tax/VAT, MoR vs Connect (o equivalente) como policy escrita ",[84,1272,1273],{},"antes"," del billing go-live.",[75,1276,1278],{"className":1277},[78],[80,1279,1280,1282],{},[84,1281,800],{}," Un go-live memo corto: quién vende, quién factura, tratamiento VAT, MoR vs marketplace Connect, cuándo empiezan los books a reconocer revenue. Bloquea checkout de production hasta que exista el memo. Product puede terminar Encode en paralelo; Charge espera al memo, no a un teatro legal perfecto para siempre.",[75,1284,1286],{"className":1285},[78],[80,1287,1288,1291,1292,1295,1296,1298],{},[84,1289,1290],{},"Commercial object (general):"," a menudo el ",[84,1293,1294],{},"tenant / account / workspace"," es el SKU primario. Los seats pueden llegar después. Forzar “per user” como único modelo temprano encierra el packaging en una forma que puede no encajar con value (o cost). ",[84,1297,800],{}," price y entitle el tenant primero; añade seat SKUs cuando el cost o value por seat esté probado.",[187,1300],{},[75,1302,1304,1310],{"className":1303},[113,114,115],[117,1305,1307],{"id":1306},"_4-capability-map-tres-layers",[84,1308,1309],{},"4. Capability map (tres layers)",[80,1311,1312],{},[126,1313,1314],{"href":128},[84,1315,131],{},[75,1317,1319],{"className":1318},[78],[80,1320,1321,1322,1325],{},"No necesitas diez product epics el día uno. Sí necesitas tres layers que sigan distintos en ",[84,1323,1324],{},"design",", aunque el delivery se comprima.",[492,1327,1328,1341],{},[495,1329,1330],{},[498,1331,1332,1335,1338],{},[501,1333,1334],{},"Layer",[501,1336,1337],{},"Capabilities",[501,1339,1340],{},"Question",[508,1342,1343,1356,1373],{},[498,1344,1345,1350,1353],{},[513,1346,1347],{},[84,1348,1349],{},"Define",[513,1351,1352],{},"Product catalog & packaging",[513,1354,1355],{},"What SKUs/plans exist? Limits? Trial?",[498,1357,1358,1363,1366],{},[513,1359,1360],{},[84,1361,1362],{},"Enforce",[513,1364,1365],{},"Entitlements, growth/policy gates, admin overrides",[513,1367,1368,1369,1372],{},"What may ",[581,1370,1371],{},"this tenant"," do right now? Who may join? Can ops change it live?",[498,1374,1375,1380,1383],{},[513,1376,1377],{},[84,1378,1379],{},"Monetize & operate",[513,1381,1382],{},"Metering, billing, customer portal, FinOps, money-flow/compliance, RevOps",[513,1384,1385],{},"How do we charge, show usage, protect margin, stay legal?",[215,1387,1389],{"className":256,"code":1388,"language":258,"meta":221,"style":221},"---\nheader: Capability layers - Define, Enforce, Monetize\n---\nflowchart TB\n  D[\"1. Define - catalog and packaging\"]\n  E[\"2. Enforce - entitlements, gates, admin\"]\n  M[\"3. Monetize - meter, bill, portal, FinOps\"]\n  D --> E --> M\n",[223,1390,1391,1395,1400,1404,1408,1413,1418,1423],{"__ignoreMap":221},[262,1392,1393],{"class":264,"line":265},[262,1394,268],{},[262,1396,1397],{"class":264,"line":271},[262,1398,1399],{},"header: Capability layers - Define, Enforce, Monetize\n",[262,1401,1402],{"class":264,"line":277},[262,1403,268],{},[262,1405,1406],{"class":264,"line":283},[262,1407,315],{},[262,1409,1410],{"class":264,"line":289},[262,1411,1412],{},"  D[\"1. Define - catalog and packaging\"]\n",[262,1414,1415],{"class":264,"line":295},[262,1416,1417],{},"  E[\"2. Enforce - entitlements, gates, admin\"]\n",[262,1419,1420],{"class":264,"line":301},[262,1421,1422],{},"  M[\"3. Monetize - meter, bill, portal, FinOps\"]\n",[262,1424,1425],{"class":264,"line":307},[262,1426,1427],{},"  D --> E --> M\n",[75,1429,1431,1439,1453,1458,1472,1481],{"className":1430},[78],[80,1432,1433,1435,1436,1438],{},[84,1434,1349],{}," es aburrido a propósito: plans y limits versionables. Si ",[223,1437,808],{}," es una tabla hecha a mano que discrepa del runtime, no tienes catalog — tienes marketing.",[80,1440,1441,1444,1445,1448,1449,1452],{},[84,1442,1443],{},"Define — solution:"," un módulo ",[223,1446,1447],{},"Catalog"," exportado a web, API y (luego) jobs de sync de billing. Snapshot o version ID en cada entitlement resolution para que el audit sepa ",[581,1450,1451],{},"qué"," catalog aplicó.",[80,1454,1455,1457],{},[84,1456,1362],{}," es donde la verdad commercial encuentra el request path. Resolve plan → modules/caps allowed → allow o deny. Soft-launch puede seguir siendo “pilots get broad access”, pero como override o mode explícito — no como “enforcement doesn’t exist yet”.",[80,1459,1460,1463,1464,1467,1468,1471],{},[84,1461,1462],{},"Enforce — solution:"," middleware / policy helper en cada ruta costosa; global growth settings + per-tenant overrides; pilot = ",[223,1465,1466],{},"complimentary"," o ",[223,1469,1470],{},"monetization_mode = soft_launch",", no checks ausentes.",[80,1473,1474,1476,1477,1480],{},[84,1475,1379],{}," es donde viven money y margin. Viene ",[84,1478,1479],{},"después"," de Define + Enforce salvo que la ley fuerce billing primero — y aun así, catalog + entitlements siguen siendo el product SoT.",[80,1482,1483,1486,1487,1490],{},[84,1484,1485],{},"Monetize — solution:"," productos MoR clonados desde catalog IDs; webhooks actualizan ",[223,1488,1489],{},"tenant.plan"," / paid flags; portal lee el mismo catalog + meters. FinOps empieza como spreadsheet + vendor dashboards; budgets in-app solo cuando existan meters.",[75,1492,1494],{"className":1493},[78],[80,1495,1496,1499,1500,1503,1504,1507],{},[84,1497,1498],{},"Sequence rule:"," no implementes billing / portal antes de ",[84,1501,1502],{},"Define + Enforce",". La ",[84,1505,1506],{},"legal / money-flow policy"," viene antes del billing go-live. Billing no debe inventar una segunda plan list.",[75,1509,1511],{"className":1510},[78],[80,1512,1513,1516,1517,1520,1521,1524,1525,1177],{},[84,1514,1515],{},"After you charge:"," los subscription webhooks (o equivalente) son el SoT del ",[581,1518,1519],{},"paid state"," — actualizan plan / entitlements. El billing provider mapea ",[84,1522,1523],{},"1:1 al catalog",". Es SoT de si pagaron; no es SoT de lo que un plan ",[581,1526,1527],{},"significa",[215,1529,1531],{"className":256,"code":1530,"language":258,"meta":221,"style":221},"---\nheader: Checkout - catalog meaning vs MoR paid state\n---\nsequenceDiagram\n  participant Buyer\n  participant App\n  participant MoR as Billing MoR\n  participant Cat as Catalog\n  participant Ent as Entitlements\n  Buyer->>App: Checkout\n  App->>Cat: Resolve plan SKU\n  App->>MoR: Create or confirm subscription\n  MoR-->>App: Webhook paid / renewed / canceled\n  App->>Ent: Update tenant plan from webhook\n  Note over Cat,Ent: MoR equals paid state - Catalog equals plan meaning\n",[223,1532,1533,1537,1542,1546,1551,1556,1561,1566,1571,1576,1581,1586,1591,1596,1601],{"__ignoreMap":221},[262,1534,1535],{"class":264,"line":265},[262,1536,268],{},[262,1538,1539],{"class":264,"line":271},[262,1540,1541],{},"header: Checkout - catalog meaning vs MoR paid state\n",[262,1543,1544],{"class":264,"line":277},[262,1545,268],{},[262,1547,1548],{"class":264,"line":283},[262,1549,1550],{},"sequenceDiagram\n",[262,1552,1553],{"class":264,"line":289},[262,1554,1555],{},"  participant Buyer\n",[262,1557,1558],{"class":264,"line":295},[262,1559,1560],{},"  participant App\n",[262,1562,1563],{"class":264,"line":301},[262,1564,1565],{},"  participant MoR as Billing MoR\n",[262,1567,1568],{"class":264,"line":307},[262,1569,1570],{},"  participant Cat as Catalog\n",[262,1572,1573],{"class":264,"line":312},[262,1574,1575],{},"  participant Ent as Entitlements\n",[262,1577,1578],{"class":264,"line":318},[262,1579,1580],{},"  Buyer->>App: Checkout\n",[262,1582,1583],{"class":264,"line":324},[262,1584,1585],{},"  App->>Cat: Resolve plan SKU\n",[262,1587,1588],{"class":264,"line":330},[262,1589,1590],{},"  App->>MoR: Create or confirm subscription\n",[262,1592,1593],{"class":264,"line":336},[262,1594,1595],{},"  MoR-->>App: Webhook paid / renewed / canceled\n",[262,1597,1598],{"class":264,"line":342},[262,1599,1600],{},"  App->>Ent: Update tenant plan from webhook\n",[262,1602,1603],{"class":264,"line":348},[262,1604,1605],{},"  Note over Cat,Ent: MoR equals paid state - Catalog equals plan meaning\n",[187,1607],{},[75,1609,1611,1617],{"className":1610},[113,114,115],[117,1612,1614],{"id":1613},"_5-anti-patterns-y-el-fix",[84,1615,1616],{},"5. Anti-patterns — y el fix",[80,1618,1619],{},[126,1620,1621],{"href":128},[84,1622,131],{},[75,1624,1626],{"className":1625},[78],[80,1627,1628],{},"Si la chain es el target, estos atajos la rompen. Cada uno con un recovery move concreto:",[492,1630,1631,1641],{},[495,1632,1633],{},[498,1634,1635,1638],{},[501,1636,1637],{},"Anti-pattern",[501,1639,1640],{},"Fix",[508,1642,1643,1653,1663,1673,1691,1701,1711],{},[498,1644,1645,1650],{},[513,1646,1647],{},[84,1648,1649],{},"Pricing page as the product",[513,1651,1652],{},"Drive the page from the catalog; delete duplicate hard-coded tiers",[498,1654,1655,1660],{},[513,1656,1657],{},[84,1658,1659],{},"Payment provider as second catalog",[513,1661,1662],{},"MoR SKUs = catalog IDs only; regenerate from catalog, never edit live in the dashboard as SoT",[498,1664,1665,1670],{},[513,1666,1667],{},[84,1668,1669],{},"Feature flags as entitlements",[513,1671,1672],{},"Split: flags for rollout, entitlement resolver for commercial allow/deny",[498,1674,1675,1680],{},[513,1676,1677],{},[84,1678,1679],{},"Hard-coded limits in random routes",[513,1681,1682,1683,1686,1687,1690],{},"Central caps table + one ",[223,1684,1685],{},"assertCap()"," / ",[223,1688,1689],{},"assertModule()"," helper",[498,1692,1693,1698],{},[513,1694,1695],{},[84,1696,1697],{},"Billing before catalog + entitlements",[513,1699,1700],{},"Freeze checkout; finish Encode; then map MoR 1:1",[498,1702,1703,1708],{},[513,1704,1705],{},[84,1706,1707],{},"Silent denial",[513,1709,1710],{},"Structured deny codes + upgrade CTA on API and UI",[498,1712,1713,1718],{},[513,1714,1715],{},[84,1716,1717],{},"Productizing everything early",[513,1719,1720],{},"Keep FinOps/RevOps as runbooks until meters and charge path exist",[75,1722,1724],{"className":1723},[78],[80,1725,1726],{},"Orden de recovery cuando ya tienes un lío:",[215,1728,1730],{"className":256,"code":1729,"language":258,"meta":221,"style":221},"---\nheader: Recovery order when commercial architecture is a mess\n---\nflowchart LR\n  A[Extract catalog] --> B[One resolver] --> C[Centralize checks] --> D[Admin overrides] --> E[Webhooks = paid SoT]\n",[223,1731,1732,1736,1741,1745,1749],{"__ignoreMap":221},[262,1733,1734],{"class":264,"line":265},[262,1735,268],{},[262,1737,1738],{"class":264,"line":271},[262,1739,1740],{},"header: Recovery order when commercial architecture is a mess\n",[262,1742,1743],{"class":264,"line":277},[262,1744,268],{},[262,1746,1747],{"class":264,"line":283},[262,1748,672],{},[262,1750,1751],{"class":264,"line":289},[262,1752,1753],{},"  A[Extract catalog] --> B[One resolver] --> C[Centralize checks] --> D[Admin overrides] --> E[Webhooks = paid SoT]\n",[75,1755,1757],{"className":1756},[78],[80,1758,1759,1762,1763,1766,1767,1766,1770,1766,1773,1776],{},[84,1760,1761],{},"Extract"," desde la pricing page y dashboards MoR → ",[84,1764,1765],{},"wire one resolver"," → ",[84,1768,1769],{},"centraliza hard-coded checks",[84,1771,1772],{},"admin overrides",[84,1774,1775],{},"solo entonces"," confía en webhooks como paid-state SoT.",[187,1778],{},[75,1780,1782,1788],{"className":1781},[113,114,115],[117,1783,1785],{"id":1784},"_6-qué-se-siente-done-en-ops",[84,1786,1787],{},"6. Qué se siente “done” en ops",[80,1789,1790],{},[126,1791,1792],{"href":128},[84,1793,131],{},[75,1795,1797,1800,1809],{"className":1796},[78],[80,1798,1799],{},"Architecture es abstracta hasta que ops puede moverse sin engineering.",[80,1801,1802,1803,1805,1806,1808],{},"World-class se siente así: un pilot necesita complimentary Plus treinta días — ops flips a flag, pone expiry, audit log who/why. Sube el vendor cost — alguien togglea un kill-switch en una integración cara sin deploy de viernes noche. Soft-launch cierra — cambian ",[223,1804,1225],{}," y ",[223,1807,1229],{},", y create-tenant / upgrade paths siguen al momento.",[80,1810,1811,1812,1815],{},"Si cualquiera de eso sigue pidiendo un hotfix branch, la chain está incompleta. Admin no es un UI nice-to-have; es cómo los ",[84,1813,1814],{},"overrides se vuelven first-class"," en lugar de excepciones tribales.",[187,1817],{},[75,1819,1821,1827],{"className":1820},[113,114,115],[117,1822,1824],{"id":1823},"_7-minimum-path-que-sigue-pareciendo-standard",[84,1825,1826],{},"7. Minimum path que sigue pareciendo standard",[80,1828,1829],{},[126,1830,1831],{"href":128},[84,1832,131],{},[75,1834,1836],{"className":1835},[78],[80,1837,1838,1839,1842],{},"La capacidad es finita. Aun así puedes mantener ",[84,1840,1841],{},"boundaries"," aunque combines delivery. El error no es shippear Encode en un milestone — es shippear Encode + Stripe como un blob indiferenciado.",[492,1844,1845,1858],{},[495,1846,1847],{},[498,1848,1849,1852],{},[501,1850,1851],{},"Delivery slice",[501,1853,1854,1855,1857],{},"Keep separate in ",[581,1856,1324],{}," (even if shipped together)",[508,1859,1860,1869,1882],{},[498,1861,1862,1866],{},[513,1863,1864],{},[84,1865,163],{},[513,1867,1868],{},"Catalog + entitlements + growth gates + admin overrides",[498,1870,1871,1875],{},[513,1872,1873],{},[84,1874,167],{},[513,1876,1877,1878,1881],{},"Money-flow / compliance policy ",[84,1879,1880],{},"then"," billing (catalog ↔ subscriptions ↔ entitlements)",[498,1883,1884,1889],{},[513,1885,1886],{},[84,1887,1888],{},"Scale",[513,1890,1891],{},"Metering depth + customer portal (+ optional in-app FinOps)",[215,1893,1895],{"className":256,"code":1894,"language":258,"meta":221,"style":221},"---\nheader: Encode, Charge, Scale delivery path\nlegend:\n  - color: \"#3B82F6\"\n    text: \"Encode\"\n  - color: \"#10B981\"\n    text: \"Charge\"\n  - color: \"#8B5CF6\"\n    text: \"Scale\"\n---\nflowchart LR\n  subgraph Encode\n    A1[Catalog] --- A2[Entitlements] --- A3[Gates] --- A4[Admin]\n  end\n  subgraph Charge\n    B1[Legalize] --> B2[Subscribe] --> B3[Webhooks update plan]\n  end\n  subgraph Scale\n    C1[Meters] --> C2[Portal] --> C3[Optional FinOps UI]\n  end\n  Encode --> Charge --> Scale\n  classDef encode fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n  classDef charge fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n  classDef scale fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n  class A1,A2,A3,A4 encode\n  class B1,B2,B3 charge\n  class C1,C2,C3 scale\n",[223,1896,1897,1901,1906,1910,1914,1919,1923,1928,1932,1937,1941,1945,1950,1955,1959,1964,1969,1973,1978,1983,1987,1992,1997,2002,2007,2012,2017],{"__ignoreMap":221},[262,1898,1899],{"class":264,"line":265},[262,1900,268],{},[262,1902,1903],{"class":264,"line":271},[262,1904,1905],{},"header: Encode, Charge, Scale delivery path\n",[262,1907,1908],{"class":264,"line":277},[262,1909,280],{},[262,1911,1912],{"class":264,"line":283},[262,1913,286],{},[262,1915,1916],{"class":264,"line":289},[262,1917,1918],{},"    text: \"Encode\"\n",[262,1920,1921],{"class":264,"line":295},[262,1922,840],{},[262,1924,1925],{"class":264,"line":301},[262,1926,1927],{},"    text: \"Charge\"\n",[262,1929,1930],{"class":264,"line":307},[262,1931,963],{},[262,1933,1934],{"class":264,"line":312},[262,1935,1936],{},"    text: \"Scale\"\n",[262,1938,1939],{"class":264,"line":318},[262,1940,268],{},[262,1942,1943],{"class":264,"line":324},[262,1944,672],{},[262,1946,1947],{"class":264,"line":330},[262,1948,1949],{},"  subgraph Encode\n",[262,1951,1952],{"class":264,"line":336},[262,1953,1954],{},"    A1[Catalog] --- A2[Entitlements] --- A3[Gates] --- A4[Admin]\n",[262,1956,1957],{"class":264,"line":342},[262,1958,375],{},[262,1960,1961],{"class":264,"line":348},[262,1962,1963],{},"  subgraph Charge\n",[262,1965,1966],{"class":264,"line":354},[262,1967,1968],{},"    B1[Legalize] --> B2[Subscribe] --> B3[Webhooks update plan]\n",[262,1970,1971],{"class":264,"line":360},[262,1972,375],{},[262,1974,1975],{"class":264,"line":366},[262,1976,1977],{},"  subgraph Scale\n",[262,1979,1980],{"class":264,"line":372},[262,1981,1982],{},"    C1[Meters] --> C2[Portal] --> C3[Optional FinOps UI]\n",[262,1984,1985],{"class":264,"line":378},[262,1986,375],{},[262,1988,1989],{"class":264,"line":384},[262,1990,1991],{},"  Encode --> Charge --> Scale\n",[262,1993,1994],{"class":264,"line":389},[262,1995,1996],{},"  classDef encode fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,1998,1999],{"class":264,"line":395},[262,2000,2001],{},"  classDef charge fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,2003,2004],{"class":264,"line":401},[262,2005,2006],{},"  classDef scale fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[262,2008,2009],{"class":264,"line":407},[262,2010,2011],{},"  class A1,A2,A3,A4 encode\n",[262,2013,2014],{"class":264,"line":412},[262,2015,2016],{},"  class B1,B2,B3 charge\n",[262,2018,2019],{"class":264,"line":418},[262,2020,2021],{},"  class C1,C2,C3 scale\n",[75,2023,2025,2030,2039,2045,2051,2056],{"className":2024},[78],[80,2026,2027,2029],{},[84,2028,163],{}," es la barra de soft-launch que aún se ve industry-shaped: one catalog, enforce en el request path, gate growth, ops override con audit. Puede que aún no cobres — y está bien.",[80,2031,2032,2035,2036,2038],{},[84,2033,2034],{},"Encode — playbook:"," (1) catalog model + ",[223,2037,808],{}," cableada, (2) entitlement resolver + tests Free vs Paid vs pilot, (3) global registration/monetization settings, (4) admin plan/override/audit UI. Cuatro workstreams en un milestone si hace falta — nunca un blob FR único.",[80,2040,2041,2044],{},[84,2042,2043],{},"Charge order:"," legalize → subscribe / renew / cancel → webhook updates plan. Nunca “crea products en el MoR primero y reverse-engineer el catalog después”.",[80,2046,2047,2050],{},[84,2048,2049],{},"Charge — playbook:"," go-live memo → clone catalog into MoR → checkout path → webhooks → UX thin “pay / manage”. El portal polished espera a Scale.",[80,2052,2053,2055],{},[84,2054,1888],{}," es cuando customers ven usage e invoices in-product, los meters se enriquecen y FinOps puede pasar de spreadsheets a alerts. Optional — no es prerequisite para cobrar limpio.",[80,2057,2058,2061],{},[84,2059,2060],{},"Scale — playbook:"," deepen meters (admin first) → customer usage + invoices → optional budget alerts ligados a kill-switches.",[75,2063,2065],{"className":2064},[78],[80,2066,2067,2070],{},[84,2068,2069],{},"Parallel ops track (not product):"," review mensual de vendor bills, disciplina de margin en el first customer, y playbooks RevOps pueden vivir como runbooks mientras Encode ships. No esperes a un FinOps UI in-app para practicar cost hygiene — y no confundas esos rituales con la commercial chain.",[187,2072],{},[75,2074,2076,2082],{"className":2075},[113,114,115],[117,2077,2079],{"id":2078},"_8-definition-of-done",[84,2080,2081],{},"8. Definition of done",[80,2083,2084],{},[126,2085,2086],{"href":128},[84,2087,131],{},[75,2089,2091],{"className":2090},[78],[80,2092,2093],{},"Úsalo como barra, no como vanity checklist. La commercial architecture es “real” cuando:",[136,2095,2098,2112,2118,2128,2138,2148,2157,2163,2173],{"className":2096},[2097],"contains-task-list",[139,2099,2102,2107,2108,2111],{"className":2100},[2101],"task-list-item",[2103,2104],"input",{"disabled":2105,"type":2106},true,"checkbox"," Cambiar un plan limit ",[84,2109,2110],{},"no"," exige cazar hard-coded checks en rutas random",[139,2113,2115,2117],{"className":2114},[2101],[2103,2116],{"disabled":2105,"type":2106}," Entitlements denied muestran upgrade / denied path claro — nunca silent fail",[139,2119,2121,2123,2124,2127],{"className":2120},[2101],[2103,2122],{"disabled":2105,"type":2106}," Ops puede dar complimentary access o freeze a costly capability ",[84,2125,2126],{},"sin"," deploy",[139,2129,2131,2133,2134,2137],{"className":2130},[2101],[2103,2132],{"disabled":2105,"type":2106}," Pricing page, admin y (luego) billing muestran el ",[84,2135,2136],{},"mismo"," catalog",[139,2139,2141,2143,2144,2147],{"className":2140},[2101],[2103,2142],{"disabled":2105,"type":2106}," Registration / monetization mode / kill-switches son ",[84,2145,2146],{},"platform settings",", no memoria tribal",[139,2149,2151,2153,2154,2156],{"className":2150},[2101],[2103,2152],{"disabled":2105,"type":2106}," Money-flow policy (entity, tax, MoR) existe ",[84,2155,1273],{}," del primer charge real",[139,2158,2160,2162],{"className":2159},[2101],[2103,2161],{"disabled":2105,"type":2106}," Paid state fluye billing events → plan / entitlements (sin segunda plan list en el MoR)",[139,2164,2166,2168,2169,2172],{"className":2165},[2101],[2103,2167],{"disabled":2105,"type":2106}," Usage que cuesta dinero es ",[84,2170,2171],{},"visible"," antes de que la invoice te sorprenda",[139,2174,2176,2178,2179,2182],{"className":2175},[2101],[2103,2177],{"disabled":2105,"type":2106}," Un FinOps soft ceiling puede disparar un ",[84,2180,2181],{},"kill-switch",", no solo un pánico en Slack",[187,2184],{},[75,2186,2188,2194],{"className":2187},[113,114,115],[117,2189,2191],{"id":2190},"_9-cheat-sheet",[84,2192,2193],{},"9. Cheat sheet",[80,2195,2196],{},[126,2197,2198],{"href":128},[84,2199,131],{},[75,2201,2203],{"className":2202},[78],[80,2204,2205],{},"Haz screenshot. Es el artículo entero en una card.",[215,2207,2210],{"className":2208,"code":2209,"language":220,"meta":221},[218],"CHAIN\n  Catalog → Agreement → Provision → Entitlements → Meter → Bill → Cash\n  (+ meters → caps / FinOps → package or price)\n\nLAYERS\n  1 Define   catalog & packaging\n  2 Enforce  entitlements · growth gates · admin overrides\n  3 Monetize meter · bill · portal · FinOps · compliance · RevOps\n\nDELIVERY\n  Encode → Charge → Scale\n  (legalize before Charge; meters before fancy FinOps UI)\n\nNEVER\n  · Second catalog in the payment provider\n  · Silent 403 with no upgrade path\n  · Billing before catalog + entitlements\n  · Soft-launch vs paid as tribal memory\n",[223,2211,2209],{"__ignoreMap":221},[75,2213,2215],{"className":2214},[78],[80,2216,2217],{},[581,2218,2219],{},"Una pricing page vende la historia. Commercial architecture la hace enforceable.",[187,2221],{},[75,2223,2225,2231],{"className":2224},[113,114,115],[117,2226,2228],{"id":2227},"_10-start-monday",[84,2229,2230],{},"10. Start Monday",[80,2232,2233],{},[126,2234,2235],{"href":128},[84,2236,131],{},[75,2238,2240],{"className":2239},[78],[80,2241,2242],{},"Cinco moves para empezar Encode sin esperar a Stripe:",[2244,2245,2246,2252,2258,2267,2278],"ol",{},[139,2247,2248,2251],{},[84,2249,2250],{},"Lista cada hard-coded limit"," — busca en routes nombres de plan, caps y checks “if Pro…”; ponlos en una página.",[139,2253,2254,2257],{},[84,2255,2256],{},"Nombra el commercial object"," — tenant / account / workspace (seats después, salvo prueba).",[139,2259,2260,2263,2264,2266],{},[84,2261,2262],{},"Draft catalog IDs"," — Free / Trial / Paid… con limits y trial rules; cablea ",[223,2265,808],{}," solo a ese modelo.",[139,2268,2269,2272,2273,1115,2275,2277],{},[84,2270,2271],{},"Elige los knobs"," — ",[223,2274,1225],{},[223,2276,1229],{},", y qué features caras llevan kill-switches.",[139,2279,2280,2283],{},[84,2281,2282],{},"Nombra quién puede override"," — un ops owner para complimentary / cap overrides + hábito de audit log (aunque sea un spreadsheet al inicio).",[75,2285,2287],{"className":2286},[78],[80,2288,2289],{},"Cuando esas cinco son verdad, tienes el skeleton de Encode. Charge es una decisión posterior — no un sustituto de este trabajo.",[187,2291],{},[75,2293,2295,2301],{"className":2294},[113,114,115],[117,2296,2298],{"id":2297},"_11-cierre",[84,2299,2300],{},"11. Cierre",[80,2302,2303],{},[126,2304,2305],{"href":128},[84,2306,131],{},[75,2308,2310,2313,2319],{"className":2309},[78],[80,2311,2312],{},"Una pricing page vende la historia. Stripe (o cualquier MoR) mueve el dinero. Ninguno es la architecture.",[80,2314,2315,2318],{},[84,2316,2317],{},"Commercial architecture"," es la chain — catalog → agreement → provision → entitlements → meter → bill → cash — más el cost loop, más los actors que poseen cada eslabón. Construye Define y Enforce antes de celebrar Charge. Mantén one catalog. Trata overrides y growth gates como product, no como folklore.",[80,2320,2321],{},"Esa forma funciona en cualquier project. Los nombres de plans y providers cambiarán. La chain no debería.",[136,2323,2324,2330,2336],{},[139,2325,2326],{},[126,2327,2329],{"href":2328},"/blog/architecture","Explorar Architecture",[139,2331,2332],{},[126,2333,2335],{"href":2334},"/blog/strategy","Explorar Strategy",[139,2337,2338],{},[126,2339,2341],{"href":2340},"/blog/scalability","Explorar Scalability",[75,2343,2349],{"className":2344},[2345,2346,2347,2348],"text-md","text-center","mt-10","font-bold",[80,2350,2351],{},[126,2352,2353],{"href":128},[84,2354,131],{},[2356,2357,2358],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":221,"searchDepth":271,"depth":271,"links":2360},[2361,2362,2363,2364,2374,2375,2376,2377,2378,2379,2380,2381],{"id":119,"depth":271,"text":122},{"id":194,"depth":271,"text":197},{"id":471,"depth":271,"text":474},{"id":756,"depth":271,"text":759,"children":2365},[2366,2367,2368,2369,2370,2371,2372,2373],{"id":779,"depth":277,"text":782},{"id":910,"depth":277,"text":913},{"id":1095,"depth":277,"text":1098},{"id":1131,"depth":277,"text":1134},{"id":1164,"depth":277,"text":1167},{"id":1205,"depth":277,"text":1208},{"id":1233,"depth":277,"text":1236},{"id":1261,"depth":277,"text":1264},{"id":1306,"depth":271,"text":1309},{"id":1613,"depth":271,"text":1616},{"id":1784,"depth":271,"text":1787},{"id":1823,"depth":271,"text":1826},{"id":2078,"depth":271,"text":2081},{"id":2190,"depth":271,"text":2193},{"id":2227,"depth":271,"text":2230},{"id":2297,"depth":271,"text":2300},"2026-09-19","La monetización es una cadena gobernada con actores claros — product, GTM, platform, ops, billing, customer, FinOps, legal — no una pricing page ni un “añade Stripe después”.","md",{"src":2386},"/blog/archi/bff.png",{},{"title":39,"description":2383},"jf6VGmAXdKKPi_eVT6OqrMO67j78yqewjnV2iaWoAHE",[2391,2392],"en","fr",[2394],{"id":2395,"title":31,"authors":2396,"badge":2399,"body":2402,"date":5558,"description":5559,"extension":2384,"image":5560,"meta":5562,"navigation":2105,"path":32,"seo":5563,"stem":33,"__hash__":5564},"posts_es/es/blog/8. mcp-in-chat-demo.md",[2397],{"name":59,"description":60,"to":61,"avatar":2398},{"src":63},{"label":2400,"color":2401,"variant":67},"MCP, E-commerce, Demo","error",{"type":69,"value":2403,"toc":5508},[2404,2417,2432,2448,2452,2467,2471,2503,2507,2591,2595,2608,2612,2650,2654,3113,3128,3134,3138,3300,3306,3310,3521,3526,3530,3710,3715,3719,3911,3916,3931,3937,3941,3947,3952,3958,3962,3967,3971,3977,3981,3986,3990,3996,4011,4017,4021,4270,4274,4277,4327,4331,4693,4699,4714,4720,4724,4756,4760,4766,4770,4873,4888,4894,4898,4912,4916,5016,5020,5023,5043,5047,5050,5076,5091,5097,5101,5132,5136,5207,5211,5237,5252,5258,5262,5340,5344,5347,5379,5394,5400,5404,5436,5440,5443,5474,5477,5479,5484,5505],[75,2405,2407],{"className":2406},[78],[80,2408,2409,2410,2416],{},"El ",[126,2411,2415],{"href":2412,"rel":2413},"https://github.com/michaelwybraniec/mcp-in-chat",[2414],"nofollow","proyecto MCP-in-Chat"," representa una demostración completa y lista para producción de cómo los servidores del Protocolo de Contexto del Modelo (MCP) pueden transformar las interacciones de chatbots de e-commerce. Este ejemplo integral muestra un sistema de mantenimiento y ventas de calderas que conecta chatbots de IA externos (Claude, ChatGPT, Cursor) con lógica de negocio real a través de una arquitectura segura y escalable. Construido usando la metodología del Protocolo de Flujo de Trabajo Agéntico (AWP), este proyecto demuestra cómo crear servidores MCP sofisticados que conectan la IA conversacional con sistemas empresariales.",[75,2418,2420,2426],{"className":2419},[113,114,115],[117,2421,2423],{"id":2422},"_1-awp-protocolo-de-flujo-de-trabajo-agéntico",[84,2424,2425],{},"1. AWP - Protocolo de Flujo de Trabajo Agéntico",[80,2427,2428],{},[126,2429,2430],{"href":128},[84,2431,131],{},[75,2433,2435],{"className":2434},[78],[80,2436,2409,2437,2440,2441,2443,2444,2447],{},[84,2438,2439],{},"Protocolo de Flujo de Trabajo Agéntico (AWP)"," es una metodología de desarrollo agéntico creada por ",[84,2442,59],{}," y mantenida por la ",[84,2445,2446],{},"comunidad overvibing.com",". Este enfoque sistemático asegura resultados de desarrollo consistentes y de alta calidad al proporcionar flujos de trabajo estructurados que previenen la deriva de contexto llamada overvibing y permiten entrega rápida y confiable de proyectos mientras escalan el desarrollo con IA.",[777,2449,2451],{"id":2450},"video-demo","Video Demo",[75,2453,2455],{"className":2454},[2346],[75,2456,2458],{"style":2457},"padding:95.12% 0 0 0;position:relative;",[2459,2460],"iframe",{"src":2461,"frameBorder":2462,"allow":2463,"referrerPolicy":2464,"style":2465,"title":2466},"https://player.vimeo.com/video/1106052609?badge=0&autopause=0&player_id=0&app_id=58479","0","autoplay; fullscreen; picture-in-picture; clipboard-write; encrypted-media; web-share","strict-origin-when-cross-origin","position:absolute;top:0;left:0;width:100%;height:100%;","Agentic Workflow preventing Overvibing.com - #GreenTokens #MCP #VibeCoding",[777,2468,2470],{"id":2469},"resultados-de-implementación","Resultados de Implementación",[136,2472,2473,2479,2485,2491,2497],{},[139,2474,2475,2478],{},[84,2476,2477],{},"Cronograma",": 4 horas (incluyendo tareas no planificadas)",[139,2480,2481,2484],{},[84,2482,2483],{},"Alcance",": 100% de características planificadas implementadas",[139,2486,2487,2490],{},[84,2488,2489],{},"Calidad",": 100% de éxito en pruebas",[139,2492,2493,2496],{},[84,2494,2495],{},"Documentación",": Completa y comprensiva",[139,2498,2499,2502],{},[84,2500,2501],{},"Listo para Demo",": Totalmente funcional y probado",[777,2504,2506],{"id":2505},"fases-de-desarrollo","Fases de Desarrollo",[2244,2508,2509,2529,2552,2571],{},[139,2510,2511,2514,2515],{},[84,2512,2513],{},"Configuración del Proyecto y Arquitectura de Seguridad"," (45 minutos)",[136,2516,2517,2520,2523,2526],{},[139,2518,2519],{},"Inicializar proyecto Node.js con TypeScript",[139,2521,2522],{},"Configurar arquitectura en capas (MCP → API → Servicios → Base de Datos)",[139,2524,2525],{},"Crear archivos JSON de datos simulados con controles de acceso",[139,2527,2528],{},"Definir interfaces TypeScript y tipos de seguridad",[139,2530,2531,2534,2535],{},[84,2532,2533],{},"Desarrollo de Herramientas MCP Principales"," (90 minutos)",[136,2536,2537,2540,2543,2546,2549],{},[139,2538,2539],{},"Implementar herramienta de información de calderas con validación de API",[139,2541,2542],{},"Implementar herramienta de programación de mantenimiento con controles de acceso",[139,2544,2545],{},"Implementar herramienta de inventario con limitación de tasa",[139,2547,2548],{},"Implementar herramienta de compra con validación de transacciones",[139,2550,2551],{},"Implementar herramienta de email con filtrado de contenido",[139,2553,2554,2514,2557],{},[84,2555,2556],{},"Pruebas y Preparación de Demo",[136,2558,2559,2562,2565,2568],{},[139,2560,2561],{},"Probar Servidor MCP con herramientas locales",[139,2563,2564],{},"Crear instrucciones de demo para integración de chatbot",[139,2566,2567],{},"Preparar flujos de conversación de muestra",[139,2569,2570],{},"Crear README con instrucciones de configuración y uso",[139,2572,2573,2576,2577],{},[84,2574,2575],{},"Integración de Chatbot Externo"," (60 minutos)",[136,2578,2579,2582,2585,2588],{},[139,2580,2581],{},"Probar Servidor MCP con Claude (si está disponible)",[139,2583,2584],{},"Probar Servidor MCP con ChatGPT (si está disponible)",[139,2586,2587],{},"Documentar proceso de integración y resultados",[139,2589,2590],{},"Crear materiales de presentación de demo",[777,2592,2594],{"id":2593},"resumen-del-proyecto","Resumen del Proyecto",[75,2596,2598,2601],{"className":2597},[78],[80,2599,2600],{},"Servidor MCP de Mantenimiento de Calderas",[80,2602,2603,2604,2607],{},"El proyecto MCP-in-Chat es una ",[84,2605,2606],{},"demostración completada exitosamente"," que muestra cómo los servidores MCP pueden integrarse con chatbots externos para proporcionar valor comercial real. El sistema maneja servicios de mantenimiento de calderas, información del cliente, gestión de inventario y procesamiento de compras a través de una interfaz conversacional.",[777,2609,2611],{"id":2610},"características-principales","Características Principales",[136,2613,2614,2620,2626,2632,2638,2644],{},[139,2615,2616,2619],{},[84,2617,2618],{},"4 Herramientas MCP",": Información de calderas, programación de mantenimiento, procesamiento de compras y confirmación por email",[139,2621,2622,2625],{},[84,2623,2624],{},"4 Endpoints API",": Backend RESTful con autenticación y validación",[139,2627,2628,2631],{},[84,2629,2630],{},"8 Servicios Simulados",": Simulación completa de lógica de negocio con datos realistas",[139,2633,2634,2637],{},[84,2635,2636],{},"Integración Externa",": Listo para pruebas con Claude, ChatGPT y Cursor IDE",[139,2639,2640,2643],{},[84,2641,2642],{},"100% Cobertura de Pruebas",": Suite de pruebas comprensiva con 100% de éxito",[139,2645,2646,2649],{},[84,2647,2648],{},"Listo para Producción",": Middleware de seguridad, limitación de tasa y manejo de errores",[777,2651,2653],{"id":2652},"resumen-de-arquitectura","Resumen de Arquitectura",[215,2655,2657],{"className":256,"code":2656,"language":258,"meta":221,"style":221},"---\nheader: MCP-in-Chat System Architecture\nlegend:\n  - color: \"#3B82F6\"\n    text: \"External Systems\"\n  - color: \"#8B5CF6\"\n    text: \"MCP Protocol Layer\"\n  - color: \"#10B981\"\n    text: \"API & Security Layer\"\n  - color: \"#F59E0B\"\n    text: \"Business Services\"\n  - color: \"#EF4444\"\n    text: \"Data Layer\"\n---\ngraph TD\n    subgraph \"External Chatbots\"\n        A[Claude AI]\n        B[ChatGPT]\n        C[Cursor IDE]\n    end\n    \n    subgraph \"MCP Server Layer\"\n        D[MCP Server]\n        E[Boiler Info Tool]\n        F[Maintenance Tool]\n        G[Purchase Tool]\n        H[Email Tool]\n    end\n    \n    subgraph \"Backend API Layer\"\n        I[Express API Server]\n        J[Authentication]\n        K[Validation]\n        L[Rate Limiting]\n    end\n    \n    subgraph \"Business Services\"\n        M[Customer Service]\n        N[Boiler Service]\n        O[Payment Service]\n        P[Email Service]\n    end\n    \n    subgraph \"Mock Data Layer\"\n        Q[Customers JSON]\n        R[Boilers JSON]\n        S[Inventory JSON]\n        T[Orders JSON]\n    end\n    \n    A --> D\n    B --> D\n    C --> D\n    D --> E\n    D --> F\n    D --> G\n    D --> H\n    E --> I\n    F --> I\n    G --> I\n    H --> I\n    I --> J\n    J --> K\n    K --> L\n    L --> M\n    L --> N\n    L --> O\n    L --> P\n    M --> Q\n    N --> R\n    O --> S\n    P --> T\n    \n    classDef external fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n    classDef mcp fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n    classDef api fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n    classDef service fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n    classDef data fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n    \n    class A,B,C external\n    class D,E,F,G,H mcp\n    class I,J,K,L api\n    class M,N,O,P service\n    class Q,R,S,T data\n",[223,2658,2659,2663,2668,2672,2676,2681,2685,2690,2694,2699,2703,2708,2712,2717,2721,2726,2731,2736,2741,2746,2751,2756,2761,2766,2771,2776,2781,2786,2790,2794,2799,2804,2809,2815,2821,2826,2831,2837,2843,2849,2855,2861,2866,2871,2877,2883,2889,2895,2901,2906,2911,2917,2923,2929,2935,2941,2947,2953,2959,2965,2971,2977,2983,2989,2995,3001,3007,3013,3019,3025,3031,3037,3043,3048,3054,3060,3066,3072,3078,3083,3089,3095,3101,3107],{"__ignoreMap":221},[262,2660,2661],{"class":264,"line":265},[262,2662,268],{},[262,2664,2665],{"class":264,"line":271},[262,2666,2667],{},"header: MCP-in-Chat System Architecture\n",[262,2669,2670],{"class":264,"line":277},[262,2671,280],{},[262,2673,2674],{"class":264,"line":283},[262,2675,286],{},[262,2677,2678],{"class":264,"line":289},[262,2679,2680],{},"    text: \"External Systems\"\n",[262,2682,2683],{"class":264,"line":295},[262,2684,963],{},[262,2686,2687],{"class":264,"line":301},[262,2688,2689],{},"    text: \"MCP Protocol Layer\"\n",[262,2691,2692],{"class":264,"line":307},[262,2693,840],{},[262,2695,2696],{"class":264,"line":312},[262,2697,2698],{},"    text: \"API & Security Layer\"\n",[262,2700,2701],{"class":264,"line":318},[262,2702,298],{},[262,2704,2705],{"class":264,"line":324},[262,2706,2707],{},"    text: \"Business Services\"\n",[262,2709,2710],{"class":264,"line":330},[262,2711,982],{},[262,2713,2714],{"class":264,"line":336},[262,2715,2716],{},"    text: \"Data Layer\"\n",[262,2718,2719],{"class":264,"line":342},[262,2720,268],{},[262,2722,2723],{"class":264,"line":348},[262,2724,2725],{},"graph TD\n",[262,2727,2728],{"class":264,"line":354},[262,2729,2730],{},"    subgraph \"External Chatbots\"\n",[262,2732,2733],{"class":264,"line":360},[262,2734,2735],{},"        A[Claude AI]\n",[262,2737,2738],{"class":264,"line":366},[262,2739,2740],{},"        B[ChatGPT]\n",[262,2742,2743],{"class":264,"line":372},[262,2744,2745],{},"        C[Cursor IDE]\n",[262,2747,2748],{"class":264,"line":378},[262,2749,2750],{},"    end\n",[262,2752,2753],{"class":264,"line":384},[262,2754,2755],{},"    \n",[262,2757,2758],{"class":264,"line":389},[262,2759,2760],{},"    subgraph \"MCP Server Layer\"\n",[262,2762,2763],{"class":264,"line":395},[262,2764,2765],{},"        D[MCP Server]\n",[262,2767,2768],{"class":264,"line":401},[262,2769,2770],{},"        E[Boiler Info Tool]\n",[262,2772,2773],{"class":264,"line":407},[262,2774,2775],{},"        F[Maintenance Tool]\n",[262,2777,2778],{"class":264,"line":412},[262,2779,2780],{},"        G[Purchase Tool]\n",[262,2782,2783],{"class":264,"line":418},[262,2784,2785],{},"        H[Email Tool]\n",[262,2787,2788],{"class":264,"line":424},[262,2789,2750],{},[262,2791,2792],{"class":264,"line":430},[262,2793,2755],{},[262,2795,2796],{"class":264,"line":436},[262,2797,2798],{},"    subgraph \"Backend API Layer\"\n",[262,2800,2801],{"class":264,"line":442},[262,2802,2803],{},"        I[Express API Server]\n",[262,2805,2806],{"class":264,"line":1089},[262,2807,2808],{},"        J[Authentication]\n",[262,2810,2812],{"class":264,"line":2811},33,[262,2813,2814],{},"        K[Validation]\n",[262,2816,2818],{"class":264,"line":2817},34,[262,2819,2820],{},"        L[Rate Limiting]\n",[262,2822,2824],{"class":264,"line":2823},35,[262,2825,2750],{},[262,2827,2829],{"class":264,"line":2828},36,[262,2830,2755],{},[262,2832,2834],{"class":264,"line":2833},37,[262,2835,2836],{},"    subgraph \"Business Services\"\n",[262,2838,2840],{"class":264,"line":2839},38,[262,2841,2842],{},"        M[Customer Service]\n",[262,2844,2846],{"class":264,"line":2845},39,[262,2847,2848],{},"        N[Boiler Service]\n",[262,2850,2852],{"class":264,"line":2851},40,[262,2853,2854],{},"        O[Payment Service]\n",[262,2856,2858],{"class":264,"line":2857},41,[262,2859,2860],{},"        P[Email Service]\n",[262,2862,2864],{"class":264,"line":2863},42,[262,2865,2750],{},[262,2867,2869],{"class":264,"line":2868},43,[262,2870,2755],{},[262,2872,2874],{"class":264,"line":2873},44,[262,2875,2876],{},"    subgraph \"Mock Data Layer\"\n",[262,2878,2880],{"class":264,"line":2879},45,[262,2881,2882],{},"        Q[Customers JSON]\n",[262,2884,2886],{"class":264,"line":2885},46,[262,2887,2888],{},"        R[Boilers JSON]\n",[262,2890,2892],{"class":264,"line":2891},47,[262,2893,2894],{},"        S[Inventory JSON]\n",[262,2896,2898],{"class":264,"line":2897},48,[262,2899,2900],{},"        T[Orders JSON]\n",[262,2902,2904],{"class":264,"line":2903},49,[262,2905,2750],{},[262,2907,2909],{"class":264,"line":2908},50,[262,2910,2755],{},[262,2912,2914],{"class":264,"line":2913},51,[262,2915,2916],{},"    A --> D\n",[262,2918,2920],{"class":264,"line":2919},52,[262,2921,2922],{},"    B --> D\n",[262,2924,2926],{"class":264,"line":2925},53,[262,2927,2928],{},"    C --> D\n",[262,2930,2932],{"class":264,"line":2931},54,[262,2933,2934],{},"    D --> E\n",[262,2936,2938],{"class":264,"line":2937},55,[262,2939,2940],{},"    D --> F\n",[262,2942,2944],{"class":264,"line":2943},56,[262,2945,2946],{},"    D --> G\n",[262,2948,2950],{"class":264,"line":2949},57,[262,2951,2952],{},"    D --> H\n",[262,2954,2956],{"class":264,"line":2955},58,[262,2957,2958],{},"    E --> I\n",[262,2960,2962],{"class":264,"line":2961},59,[262,2963,2964],{},"    F --> I\n",[262,2966,2968],{"class":264,"line":2967},60,[262,2969,2970],{},"    G --> I\n",[262,2972,2974],{"class":264,"line":2973},61,[262,2975,2976],{},"    H --> I\n",[262,2978,2980],{"class":264,"line":2979},62,[262,2981,2982],{},"    I --> J\n",[262,2984,2986],{"class":264,"line":2985},63,[262,2987,2988],{},"    J --> K\n",[262,2990,2992],{"class":264,"line":2991},64,[262,2993,2994],{},"    K --> L\n",[262,2996,2998],{"class":264,"line":2997},65,[262,2999,3000],{},"    L --> M\n",[262,3002,3004],{"class":264,"line":3003},66,[262,3005,3006],{},"    L --> N\n",[262,3008,3010],{"class":264,"line":3009},67,[262,3011,3012],{},"    L --> O\n",[262,3014,3016],{"class":264,"line":3015},68,[262,3017,3018],{},"    L --> P\n",[262,3020,3022],{"class":264,"line":3021},69,[262,3023,3024],{},"    M --> Q\n",[262,3026,3028],{"class":264,"line":3027},70,[262,3029,3030],{},"    N --> R\n",[262,3032,3034],{"class":264,"line":3033},71,[262,3035,3036],{},"    O --> S\n",[262,3038,3040],{"class":264,"line":3039},72,[262,3041,3042],{},"    P --> T\n",[262,3044,3046],{"class":264,"line":3045},73,[262,3047,2755],{},[262,3049,3051],{"class":264,"line":3050},74,[262,3052,3053],{},"    classDef external fill:#3B82F6,stroke:#1E40AF,stroke-width:2px,color:#fff\n",[262,3055,3057],{"class":264,"line":3056},75,[262,3058,3059],{},"    classDef mcp fill:#8B5CF6,stroke:#7C3AED,stroke-width:2px,color:#fff\n",[262,3061,3063],{"class":264,"line":3062},76,[262,3064,3065],{},"    classDef api fill:#10B981,stroke:#059669,stroke-width:2px,color:#fff\n",[262,3067,3069],{"class":264,"line":3068},77,[262,3070,3071],{},"    classDef service fill:#F59E0B,stroke:#D97706,stroke-width:2px,color:#fff\n",[262,3073,3075],{"class":264,"line":3074},78,[262,3076,3077],{},"    classDef data fill:#EF4444,stroke:#DC2626,stroke-width:2px,color:#fff\n",[262,3079,3081],{"class":264,"line":3080},79,[262,3082,2755],{},[262,3084,3086],{"class":264,"line":3085},80,[262,3087,3088],{},"    class A,B,C external\n",[262,3090,3092],{"class":264,"line":3091},81,[262,3093,3094],{},"    class D,E,F,G,H mcp\n",[262,3096,3098],{"class":264,"line":3097},82,[262,3099,3100],{},"    class I,J,K,L api\n",[262,3102,3104],{"class":264,"line":3103},83,[262,3105,3106],{},"    class M,N,O,P service\n",[262,3108,3110],{"class":264,"line":3109},84,[262,3111,3112],{},"    class Q,R,S,T data\n",[75,3114,3116,3122],{"className":3115},[113,114,115],[117,3117,3119],{"id":3118},"_2-mcp-protocolo-de-contexto-del-modelo",[84,3120,3121],{},"2. MCP - Protocolo de Contexto del Modelo",[80,3123,3124],{},[126,3125,3126],{"href":128},[84,3127,131],{},[75,3129,3131],{"className":3130},[78],[80,3132,3133],{},"El servidor MCP expone cuatro herramientas especializadas que permiten a los chatbots interactuar con el sistema de mantenimiento de calderas. Cada herramienta está diseñada con lógica de negocio específica y controles de seguridad.",[777,3135,3137],{"id":3136},"herramienta-de-información-de-calderas","Herramienta de Información de Calderas",[215,3139,3143],{"className":3140,"code":3141,"language":3142,"meta":221,"style":221},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// Herramienta MCP: Obtener detalles de calderas del cliente e información de garantía\nconst boilerInfoTool = {\n  name: \"boiler-info\",\n  description: \"Obtener información de calderas del cliente y detalles de garantía\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" }\n    },\n    required: [\"customer_id\"]\n  }\n}\n","typescript",[223,3144,3145,3151,3168,3190,3206,3215,3231,3240,3265,3270,3290,3295],{"__ignoreMap":221},[262,3146,3147],{"class":264,"line":265},[262,3148,3150],{"class":3149},"sHwdD","// Herramienta MCP: Obtener detalles de calderas del cliente e información de garantía\n",[262,3152,3153,3157,3161,3165],{"class":264,"line":271},[262,3154,3156],{"class":3155},"spNyl","const",[262,3158,3160],{"class":3159},"sTEyZ"," boilerInfoTool ",[262,3162,3164],{"class":3163},"sMK4o","=",[262,3166,3167],{"class":3163}," {\n",[262,3169,3170,3174,3177,3180,3184,3187],{"class":264,"line":277},[262,3171,3173],{"class":3172},"swJcz","  name",[262,3175,3176],{"class":3163},":",[262,3178,3179],{"class":3163}," \"",[262,3181,3183],{"class":3182},"sfazB","boiler-info",[262,3185,3186],{"class":3163},"\"",[262,3188,3189],{"class":3163},",\n",[262,3191,3192,3195,3197,3199,3202,3204],{"class":264,"line":283},[262,3193,3194],{"class":3172},"  description",[262,3196,3176],{"class":3163},[262,3198,3179],{"class":3163},[262,3200,3201],{"class":3182},"Obtener información de calderas del cliente y detalles de garantía",[262,3203,3186],{"class":3163},[262,3205,3189],{"class":3163},[262,3207,3208,3211,3213],{"class":264,"line":289},[262,3209,3210],{"class":3172},"  inputSchema",[262,3212,3176],{"class":3163},[262,3214,3167],{"class":3163},[262,3216,3217,3220,3222,3224,3227,3229],{"class":264,"line":295},[262,3218,3219],{"class":3172},"    type",[262,3221,3176],{"class":3163},[262,3223,3179],{"class":3163},[262,3225,3226],{"class":3182},"object",[262,3228,3186],{"class":3163},[262,3230,3189],{"class":3163},[262,3232,3233,3236,3238],{"class":264,"line":301},[262,3234,3235],{"class":3172},"    properties",[262,3237,3176],{"class":3163},[262,3239,3167],{"class":3163},[262,3241,3242,3245,3247,3250,3253,3255,3257,3260,3262],{"class":264,"line":307},[262,3243,3244],{"class":3172},"      customer_id",[262,3246,3176],{"class":3163},[262,3248,3249],{"class":3163}," {",[262,3251,3252],{"class":3172}," type",[262,3254,3176],{"class":3163},[262,3256,3179],{"class":3163},[262,3258,3259],{"class":3182},"string",[262,3261,3186],{"class":3163},[262,3263,3264],{"class":3163}," }\n",[262,3266,3267],{"class":264,"line":312},[262,3268,3269],{"class":3163},"    },\n",[262,3271,3272,3275,3277,3280,3282,3285,3287],{"class":264,"line":318},[262,3273,3274],{"class":3172},"    required",[262,3276,3176],{"class":3163},[262,3278,3279],{"class":3159}," [",[262,3281,3186],{"class":3163},[262,3283,3284],{"class":3182},"customer_id",[262,3286,3186],{"class":3163},[262,3288,3289],{"class":3159},"]\n",[262,3291,3292],{"class":264,"line":324},[262,3293,3294],{"class":3163},"  }\n",[262,3296,3297],{"class":264,"line":330},[262,3298,3299],{"class":3163},"}\n",[80,3301,3302,3305],{},[84,3303,3304],{},"Caso de Uso",": Cuando un cliente pregunta \"¿Cuál es el estado de garantía de mi caldera?\", el chatbot puede recuperar información detallada sobre su modelo específico de caldera, fecha de instalación, cobertura de garantía e historial de mantenimiento.",[777,3307,3309],{"id":3308},"herramienta-de-programación-de-mantenimiento","Herramienta de Programación de Mantenimiento",[215,3311,3313],{"className":3140,"code":3312,"language":3142,"meta":221,"style":221},"// Herramienta MCP: Programar servicios de mantenimiento con consideración del clima\nconst maintenanceTool = {\n  name: \"maintenance\",\n  description: \"Programar servicios de mantenimiento\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" },\n      service_type: { type: \"string\", enum: [\"routine\", \"emergency\"] },\n      preferred_date: { type: \"string\" }\n    },\n    required: [\"customer_id\", \"service_type\"]\n  }\n}\n",[223,3314,3315,3320,3331,3346,3361,3369,3383,3391,3412,3463,3484,3488,3513,3517],{"__ignoreMap":221},[262,3316,3317],{"class":264,"line":265},[262,3318,3319],{"class":3149},"// Herramienta MCP: Programar servicios de mantenimiento con consideración del clima\n",[262,3321,3322,3324,3327,3329],{"class":264,"line":271},[262,3323,3156],{"class":3155},[262,3325,3326],{"class":3159}," maintenanceTool ",[262,3328,3164],{"class":3163},[262,3330,3167],{"class":3163},[262,3332,3333,3335,3337,3339,3342,3344],{"class":264,"line":277},[262,3334,3173],{"class":3172},[262,3336,3176],{"class":3163},[262,3338,3179],{"class":3163},[262,3340,3341],{"class":3182},"maintenance",[262,3343,3186],{"class":3163},[262,3345,3189],{"class":3163},[262,3347,3348,3350,3352,3354,3357,3359],{"class":264,"line":283},[262,3349,3194],{"class":3172},[262,3351,3176],{"class":3163},[262,3353,3179],{"class":3163},[262,3355,3356],{"class":3182},"Programar servicios de mantenimiento",[262,3358,3186],{"class":3163},[262,3360,3189],{"class":3163},[262,3362,3363,3365,3367],{"class":264,"line":289},[262,3364,3210],{"class":3172},[262,3366,3176],{"class":3163},[262,3368,3167],{"class":3163},[262,3370,3371,3373,3375,3377,3379,3381],{"class":264,"line":295},[262,3372,3219],{"class":3172},[262,3374,3176],{"class":3163},[262,3376,3179],{"class":3163},[262,3378,3226],{"class":3182},[262,3380,3186],{"class":3163},[262,3382,3189],{"class":3163},[262,3384,3385,3387,3389],{"class":264,"line":301},[262,3386,3235],{"class":3172},[262,3388,3176],{"class":3163},[262,3390,3167],{"class":3163},[262,3392,3393,3395,3397,3399,3401,3403,3405,3407,3409],{"class":264,"line":307},[262,3394,3244],{"class":3172},[262,3396,3176],{"class":3163},[262,3398,3249],{"class":3163},[262,3400,3252],{"class":3172},[262,3402,3176],{"class":3163},[262,3404,3179],{"class":3163},[262,3406,3259],{"class":3182},[262,3408,3186],{"class":3163},[262,3410,3411],{"class":3163}," },\n",[262,3413,3414,3417,3419,3421,3423,3425,3427,3429,3431,3434,3437,3439,3441,3443,3446,3448,3450,3452,3455,3457,3460],{"class":264,"line":312},[262,3415,3416],{"class":3172},"      service_type",[262,3418,3176],{"class":3163},[262,3420,3249],{"class":3163},[262,3422,3252],{"class":3172},[262,3424,3176],{"class":3163},[262,3426,3179],{"class":3163},[262,3428,3259],{"class":3182},[262,3430,3186],{"class":3163},[262,3432,3433],{"class":3163},",",[262,3435,3436],{"class":3172}," enum",[262,3438,3176],{"class":3163},[262,3440,3279],{"class":3159},[262,3442,3186],{"class":3163},[262,3444,3445],{"class":3182},"routine",[262,3447,3186],{"class":3163},[262,3449,3433],{"class":3163},[262,3451,3179],{"class":3163},[262,3453,3454],{"class":3182},"emergency",[262,3456,3186],{"class":3163},[262,3458,3459],{"class":3159},"] ",[262,3461,3462],{"class":3163},"},\n",[262,3464,3465,3468,3470,3472,3474,3476,3478,3480,3482],{"class":264,"line":318},[262,3466,3467],{"class":3172},"      preferred_date",[262,3469,3176],{"class":3163},[262,3471,3249],{"class":3163},[262,3473,3252],{"class":3172},[262,3475,3176],{"class":3163},[262,3477,3179],{"class":3163},[262,3479,3259],{"class":3182},[262,3481,3186],{"class":3163},[262,3483,3264],{"class":3163},[262,3485,3486],{"class":264,"line":324},[262,3487,3269],{"class":3163},[262,3489,3490,3492,3494,3496,3498,3500,3502,3504,3506,3509,3511],{"class":264,"line":330},[262,3491,3274],{"class":3172},[262,3493,3176],{"class":3163},[262,3495,3279],{"class":3159},[262,3497,3186],{"class":3163},[262,3499,3284],{"class":3182},[262,3501,3186],{"class":3163},[262,3503,3433],{"class":3163},[262,3505,3179],{"class":3163},[262,3507,3508],{"class":3182},"service_type",[262,3510,3186],{"class":3163},[262,3512,3289],{"class":3159},[262,3514,3515],{"class":264,"line":336},[262,3516,3294],{"class":3163},[262,3518,3519],{"class":264,"line":342},[262,3520,3299],{"class":3163},[80,3522,3523,3525],{},[84,3524,3304],{},": Los clientes pueden solicitar programación de mantenimiento, y el sistema automáticamente considera condiciones climáticas, disponibilidad de técnicos y preferencias del cliente para reservar citas óptimas.",[777,3527,3529],{"id":3528},"herramienta-de-procesamiento-de-compra","Herramienta de Procesamiento de Compra",[215,3531,3533],{"className":3140,"code":3532,"language":3142,"meta":221,"style":221},"// Herramienta MCP: Procesar órdenes de compra de calderas\nconst purchaseTool = {\n  name: \"purchase\",\n  description: \"Procesar órdenes de compra de calderas\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" },\n      boiler_model: { type: \"string\" },\n      installation_date: { type: \"string\" }\n    },\n    required: [\"customer_id\", \"boiler_model\"]\n  }\n}\n",[223,3534,3535,3540,3551,3566,3581,3589,3603,3611,3631,3652,3673,3677,3702,3706],{"__ignoreMap":221},[262,3536,3537],{"class":264,"line":265},[262,3538,3539],{"class":3149},"// Herramienta MCP: Procesar órdenes de compra de calderas\n",[262,3541,3542,3544,3547,3549],{"class":264,"line":271},[262,3543,3156],{"class":3155},[262,3545,3546],{"class":3159}," purchaseTool ",[262,3548,3164],{"class":3163},[262,3550,3167],{"class":3163},[262,3552,3553,3555,3557,3559,3562,3564],{"class":264,"line":277},[262,3554,3173],{"class":3172},[262,3556,3176],{"class":3163},[262,3558,3179],{"class":3163},[262,3560,3561],{"class":3182},"purchase",[262,3563,3186],{"class":3163},[262,3565,3189],{"class":3163},[262,3567,3568,3570,3572,3574,3577,3579],{"class":264,"line":283},[262,3569,3194],{"class":3172},[262,3571,3176],{"class":3163},[262,3573,3179],{"class":3163},[262,3575,3576],{"class":3182},"Procesar órdenes de compra de calderas",[262,3578,3186],{"class":3163},[262,3580,3189],{"class":3163},[262,3582,3583,3585,3587],{"class":264,"line":289},[262,3584,3210],{"class":3172},[262,3586,3176],{"class":3163},[262,3588,3167],{"class":3163},[262,3590,3591,3593,3595,3597,3599,3601],{"class":264,"line":295},[262,3592,3219],{"class":3172},[262,3594,3176],{"class":3163},[262,3596,3179],{"class":3163},[262,3598,3226],{"class":3182},[262,3600,3186],{"class":3163},[262,3602,3189],{"class":3163},[262,3604,3605,3607,3609],{"class":264,"line":301},[262,3606,3235],{"class":3172},[262,3608,3176],{"class":3163},[262,3610,3167],{"class":3163},[262,3612,3613,3615,3617,3619,3621,3623,3625,3627,3629],{"class":264,"line":307},[262,3614,3244],{"class":3172},[262,3616,3176],{"class":3163},[262,3618,3249],{"class":3163},[262,3620,3252],{"class":3172},[262,3622,3176],{"class":3163},[262,3624,3179],{"class":3163},[262,3626,3259],{"class":3182},[262,3628,3186],{"class":3163},[262,3630,3411],{"class":3163},[262,3632,3633,3636,3638,3640,3642,3644,3646,3648,3650],{"class":264,"line":312},[262,3634,3635],{"class":3172},"      boiler_model",[262,3637,3176],{"class":3163},[262,3639,3249],{"class":3163},[262,3641,3252],{"class":3172},[262,3643,3176],{"class":3163},[262,3645,3179],{"class":3163},[262,3647,3259],{"class":3182},[262,3649,3186],{"class":3163},[262,3651,3411],{"class":3163},[262,3653,3654,3657,3659,3661,3663,3665,3667,3669,3671],{"class":264,"line":318},[262,3655,3656],{"class":3172},"      installation_date",[262,3658,3176],{"class":3163},[262,3660,3249],{"class":3163},[262,3662,3252],{"class":3172},[262,3664,3176],{"class":3163},[262,3666,3179],{"class":3163},[262,3668,3259],{"class":3182},[262,3670,3186],{"class":3163},[262,3672,3264],{"class":3163},[262,3674,3675],{"class":264,"line":324},[262,3676,3269],{"class":3163},[262,3678,3679,3681,3683,3685,3687,3689,3691,3693,3695,3698,3700],{"class":264,"line":330},[262,3680,3274],{"class":3172},[262,3682,3176],{"class":3163},[262,3684,3279],{"class":3159},[262,3686,3186],{"class":3163},[262,3688,3284],{"class":3182},[262,3690,3186],{"class":3163},[262,3692,3433],{"class":3163},[262,3694,3179],{"class":3163},[262,3696,3697],{"class":3182},"boiler_model",[262,3699,3186],{"class":3163},[262,3701,3289],{"class":3159},[262,3703,3704],{"class":264,"line":336},[262,3705,3294],{"class":3163},[262,3707,3708],{"class":264,"line":342},[262,3709,3299],{"class":3163},[80,3711,3712,3714],{},[84,3713,3304],{},": Cuando los clientes quieren actualizar su caldera, el chatbot puede mostrar modelos disponibles, comparar especificaciones, procesar pagos y programar instalación.",[777,3716,3718],{"id":3717},"herramienta-de-confirmación-por-email","Herramienta de Confirmación por Email",[215,3720,3722],{"className":3140,"code":3721,"language":3142,"meta":221,"style":221},"// Herramienta MCP: Enviar emails de confirmación\nconst emailTool = {\n  name: \"email\",\n  description: \"Enviar emails de confirmación\",\n  inputSchema: {\n    type: \"object\",\n    properties: {\n      customer_id: { type: \"string\" },\n      email_type: { type: \"string\", enum: [\"maintenance\", \"purchase\", \"reminder\"] }\n    },\n    required: [\"customer_id\", \"email_type\"]\n  }\n}\n",[223,3723,3724,3729,3740,3755,3770,3778,3792,3800,3820,3874,3878,3903,3907],{"__ignoreMap":221},[262,3725,3726],{"class":264,"line":265},[262,3727,3728],{"class":3149},"// Herramienta MCP: Enviar emails de confirmación\n",[262,3730,3731,3733,3736,3738],{"class":264,"line":271},[262,3732,3156],{"class":3155},[262,3734,3735],{"class":3159}," emailTool ",[262,3737,3164],{"class":3163},[262,3739,3167],{"class":3163},[262,3741,3742,3744,3746,3748,3751,3753],{"class":264,"line":277},[262,3743,3173],{"class":3172},[262,3745,3176],{"class":3163},[262,3747,3179],{"class":3163},[262,3749,3750],{"class":3182},"email",[262,3752,3186],{"class":3163},[262,3754,3189],{"class":3163},[262,3756,3757,3759,3761,3763,3766,3768],{"class":264,"line":283},[262,3758,3194],{"class":3172},[262,3760,3176],{"class":3163},[262,3762,3179],{"class":3163},[262,3764,3765],{"class":3182},"Enviar emails de confirmación",[262,3767,3186],{"class":3163},[262,3769,3189],{"class":3163},[262,3771,3772,3774,3776],{"class":264,"line":289},[262,3773,3210],{"class":3172},[262,3775,3176],{"class":3163},[262,3777,3167],{"class":3163},[262,3779,3780,3782,3784,3786,3788,3790],{"class":264,"line":295},[262,3781,3219],{"class":3172},[262,3783,3176],{"class":3163},[262,3785,3179],{"class":3163},[262,3787,3226],{"class":3182},[262,3789,3186],{"class":3163},[262,3791,3189],{"class":3163},[262,3793,3794,3796,3798],{"class":264,"line":301},[262,3795,3235],{"class":3172},[262,3797,3176],{"class":3163},[262,3799,3167],{"class":3163},[262,3801,3802,3804,3806,3808,3810,3812,3814,3816,3818],{"class":264,"line":307},[262,3803,3244],{"class":3172},[262,3805,3176],{"class":3163},[262,3807,3249],{"class":3163},[262,3809,3252],{"class":3172},[262,3811,3176],{"class":3163},[262,3813,3179],{"class":3163},[262,3815,3259],{"class":3182},[262,3817,3186],{"class":3163},[262,3819,3411],{"class":3163},[262,3821,3822,3825,3827,3829,3831,3833,3835,3837,3839,3841,3843,3845,3847,3849,3851,3853,3855,3857,3859,3861,3863,3865,3868,3870,3872],{"class":264,"line":312},[262,3823,3824],{"class":3172},"      email_type",[262,3826,3176],{"class":3163},[262,3828,3249],{"class":3163},[262,3830,3252],{"class":3172},[262,3832,3176],{"class":3163},[262,3834,3179],{"class":3163},[262,3836,3259],{"class":3182},[262,3838,3186],{"class":3163},[262,3840,3433],{"class":3163},[262,3842,3436],{"class":3172},[262,3844,3176],{"class":3163},[262,3846,3279],{"class":3159},[262,3848,3186],{"class":3163},[262,3850,3341],{"class":3182},[262,3852,3186],{"class":3163},[262,3854,3433],{"class":3163},[262,3856,3179],{"class":3163},[262,3858,3561],{"class":3182},[262,3860,3186],{"class":3163},[262,3862,3433],{"class":3163},[262,3864,3179],{"class":3163},[262,3866,3867],{"class":3182},"reminder",[262,3869,3186],{"class":3163},[262,3871,3459],{"class":3159},[262,3873,3299],{"class":3163},[262,3875,3876],{"class":264,"line":318},[262,3877,3269],{"class":3163},[262,3879,3880,3882,3884,3886,3888,3890,3892,3894,3896,3899,3901],{"class":264,"line":324},[262,3881,3274],{"class":3172},[262,3883,3176],{"class":3163},[262,3885,3279],{"class":3159},[262,3887,3186],{"class":3163},[262,3889,3284],{"class":3182},[262,3891,3186],{"class":3163},[262,3893,3433],{"class":3163},[262,3895,3179],{"class":3163},[262,3897,3898],{"class":3182},"email_type",[262,3900,3186],{"class":3163},[262,3902,3289],{"class":3159},[262,3904,3905],{"class":264,"line":330},[262,3906,3294],{"class":3163},[262,3908,3909],{"class":264,"line":336},[262,3910,3299],{"class":3163},[80,3912,3913,3915],{},[84,3914,3304],{},": Después de cualquier reserva de servicio o compra, el sistema automáticamente envía emails de confirmación apropiados con detalles relevantes y próximos pasos.",[75,3917,3919,3925],{"className":3918},[113,114,115],[117,3920,3922],{"id":3921},"_3-escenarios-de-demo-y-flujos",[84,3923,3924],{},"3. Escenarios de Demo y Flujos",[80,3926,3927],{},[126,3928,3929],{"href":128},[84,3930,131],{},[75,3932,3934],{"className":3933},[78],[80,3935,3936],{},"El proyecto MCP-in-Chat incluye escenarios de demo comprensivos que muestran patrones de uso del mundo real y demuestran las capacidades del sistema.",[777,3938,3940],{"id":3939},"escenario-1-consulta-de-información-de-caldera","Escenario 1: Consulta de Información de Caldera",[80,3942,3943,3946],{},[84,3944,3945],{},"Cliente",": \"¿Cuál es el estado de garantía de mi caldera?\"",[80,3948,3949,3176],{},[84,3950,3951],{},"Respuesta del Chatbot",[215,3953,3956],{"className":3954,"code":3955,"language":220},[218],"Revisaré la información de tu caldera inmediatamente.\n\nSegún tus registros, tienes una Worcester Bosch 8000 Style instalada el 15 de marzo de 2023. \nTu garantía es válida hasta el 15 de marzo de 2028 (garantía del fabricante de 5 años).\n\nDetalles clave:\n- Modelo: Worcester Bosch 8000 Style 30kW\n- Fecha de Instalación: 15 de marzo de 2023\n- Estado de Garantía: Activa (3 años restantes)\n- Último Servicio: 12 de enero de 2024\n- Próximo Servicio: 12 de enero de 2025\n\n¿Te gustaría que programe tu servicio anual o verifique si hay reclamos de garantía?\n",[223,3957,3955],{"__ignoreMap":221},[777,3959,3961],{"id":3960},"escenario-2-programación-de-mantenimiento","Escenario 2: Programación de Mantenimiento",[80,3963,3964,3966],{},[84,3965,3945],{},": \"Necesito programar mantenimiento para mi caldera\"",[80,3968,3969,3176],{},[84,3970,3951],{},[215,3972,3975],{"className":3973,"code":3974,"language":220},[218],"Te ayudo a programar mantenimiento para tu caldera. Déjame revisar tu horario actual y espacios disponibles.\n\nSegún tu ubicación y preferencias, encontré estas citas disponibles:\n\nPróxima Semana:\n- Martes, 21 de enero: 9:00 AM - 11:00 AM\n- Jueves, 23 de enero: 2:00 PM - 4:00 PM\n\nEl pronóstico del clima muestra condiciones claras para ambos días. Tu técnico preferido, John Smith (registrado Gas Safe), está disponible el martes.\n\nRecomiendo martes a las 9:00 AM. El servicio incluirá:\n- Inspección completa del sistema\n- Verificaciones de seguridad\n- Pruebas de eficiencia\n- Limpieza de filtros\n\nCosto: £120 (incluye repuestos y mano de obra)\n\n¿Reservo esta cita para ti?\n",[223,3976,3974],{"__ignoreMap":221},[777,3978,3980],{"id":3979},"escenario-3-compra-de-actualización-de-caldera","Escenario 3: Compra de Actualización de Caldera",[80,3982,3983,3985],{},[84,3984,3945],{},": \"Quiero actualizar mi caldera a un modelo más eficiente\"",[80,3987,3988,3176],{},[84,3989,3951],{},[215,3991,3994],{"className":3992,"code":3993,"language":220},[218],"¡Excelente elección! Déjame mostrarte los modelos más eficientes disponibles y ayudarte con la actualización.\n\nCalderas de Alta Eficiencia Disponibles:\n\n1. **Worcester Bosch 8000 Style** (Clasificación A)\n   - Eficiencia: 94%\n   - Precio: £2,800\n   - Garantía de 10 años\n   - Termostato inteligente incluido\n\n2. **Vaillant ecoTEC plus** (Clasificación A)\n   - Eficiencia: 92%\n   - Precio: £2,600\n   - Garantía de 7 años\n   - Diseño compacto\n\n3. **Ideal Logic+** (Clasificación A)\n   - Eficiencia: 90%\n   - Precio: £2,200\n   - Garantía de 10 años\n   - Certificado Quiet Mark\n\nBasándome en tu sistema actual, recomiendo la Worcester Bosch 8000 Style para máxima eficiencia y confiabilidad.\n\n¿Te gustaría que:\n1. Muestre especificaciones detalladas\n2. Verifique disponibilidad de instalación\n3. Procese la compra\n4. Compare con tu caldera actual\n",[223,3995,3993],{"__ignoreMap":221},[75,3997,3999,4005],{"className":3998},[113,114,115],[117,4000,4002],{"id":4001},"_4-especificaciones-técnicas",[84,4003,4004],{},"4. Especificaciones Técnicas",[80,4006,4007],{},[126,4008,4009],{"href":128},[84,4010,131],{},[75,4012,4014],{"className":4013},[78],[80,4015,4016],{},"El proyecto MCP-in-Chat implementa una arquitectura sofisticada en capas que asegura seguridad, escalabilidad y mantenibilidad.",[777,4018,4020],{"id":4019},"arquitectura-de-seguridad","Arquitectura de Seguridad",[215,4022,4024],{"className":256,"code":4023,"language":258,"meta":221,"style":221},"---\nheader: MCP Security Flow and Authentication\n---\nsequenceDiagram\n    participant Chatbot as External Chatbot\n    participant MCP as MCP Server\n    participant API as Backend API\n    participant Auth as Authentication\n    participant Service as Business Service\n    participant DB as Mock Database\n    \n    rect rgb(59, 130, 246)\n    note right of Chatbot: External Systems\n    Chatbot->>+MCP: Request with customer_id\n    end\n    \n    rect rgb(139, 92, 246)\n    note right of MCP: MCP Protocol Layer\n    MCP->>+API: API call with validation\n    end\n    \n    rect rgb(16, 185, 129)\n    note right of API: Security & API Layer\n    API->>+Auth: Verify authentication\n    Auth-->>-API: Authentication result\n    end\n    \n    rect rgb(245, 158, 11)\n    note right of Service: Business Logic Layer\n    API->>+Service: Process business logic\n    Service->>+DB: Query with access controls\n    end\n    \n    rect rgb(239, 68, 68)\n    note right of DB: Data Storage Layer\n    DB-->>-Service: Return filtered data\n    end\n    \n    rect rgb(245, 158, 11)\n    note right of Service: Business Logic Layer\n    Service-->>-API: Processed response\n    end\n    \n    rect rgb(16, 185, 129)\n    note right of API: Security & API Layer\n    API-->>-MCP: API response\n    end\n    \n    rect rgb(139, 92, 246)\n    note right of MCP: MCP Protocol Layer\n    MCP-->>-Chatbot: Formatted result\n    end\n    \n    Note over Chatbot,DB: Secure communication flow with\u003Cbr/>authentication at each layer\n",[223,4025,4026,4030,4035,4039,4043,4048,4053,4058,4063,4068,4073,4077,4082,4087,4092,4096,4100,4105,4110,4115,4119,4123,4128,4133,4138,4143,4147,4151,4156,4161,4166,4171,4175,4179,4184,4189,4194,4198,4202,4206,4210,4215,4219,4223,4227,4231,4236,4240,4244,4248,4252,4257,4261,4265],{"__ignoreMap":221},[262,4027,4028],{"class":264,"line":265},[262,4029,268],{},[262,4031,4032],{"class":264,"line":271},[262,4033,4034],{},"header: MCP Security Flow and Authentication\n",[262,4036,4037],{"class":264,"line":277},[262,4038,268],{},[262,4040,4041],{"class":264,"line":283},[262,4042,1550],{},[262,4044,4045],{"class":264,"line":289},[262,4046,4047],{},"    participant Chatbot as External Chatbot\n",[262,4049,4050],{"class":264,"line":295},[262,4051,4052],{},"    participant MCP as MCP Server\n",[262,4054,4055],{"class":264,"line":301},[262,4056,4057],{},"    participant API as Backend API\n",[262,4059,4060],{"class":264,"line":307},[262,4061,4062],{},"    participant Auth as Authentication\n",[262,4064,4065],{"class":264,"line":312},[262,4066,4067],{},"    participant Service as Business Service\n",[262,4069,4070],{"class":264,"line":318},[262,4071,4072],{},"    participant DB as Mock Database\n",[262,4074,4075],{"class":264,"line":324},[262,4076,2755],{},[262,4078,4079],{"class":264,"line":330},[262,4080,4081],{},"    rect rgb(59, 130, 246)\n",[262,4083,4084],{"class":264,"line":336},[262,4085,4086],{},"    note right of Chatbot: External Systems\n",[262,4088,4089],{"class":264,"line":342},[262,4090,4091],{},"    Chatbot->>+MCP: Request with customer_id\n",[262,4093,4094],{"class":264,"line":348},[262,4095,2750],{},[262,4097,4098],{"class":264,"line":354},[262,4099,2755],{},[262,4101,4102],{"class":264,"line":360},[262,4103,4104],{},"    rect rgb(139, 92, 246)\n",[262,4106,4107],{"class":264,"line":366},[262,4108,4109],{},"    note right of MCP: MCP Protocol Layer\n",[262,4111,4112],{"class":264,"line":372},[262,4113,4114],{},"    MCP->>+API: API call with validation\n",[262,4116,4117],{"class":264,"line":378},[262,4118,2750],{},[262,4120,4121],{"class":264,"line":384},[262,4122,2755],{},[262,4124,4125],{"class":264,"line":389},[262,4126,4127],{},"    rect rgb(16, 185, 129)\n",[262,4129,4130],{"class":264,"line":395},[262,4131,4132],{},"    note right of API: Security & API Layer\n",[262,4134,4135],{"class":264,"line":401},[262,4136,4137],{},"    API->>+Auth: Verify authentication\n",[262,4139,4140],{"class":264,"line":407},[262,4141,4142],{},"    Auth-->>-API: Authentication result\n",[262,4144,4145],{"class":264,"line":412},[262,4146,2750],{},[262,4148,4149],{"class":264,"line":418},[262,4150,2755],{},[262,4152,4153],{"class":264,"line":424},[262,4154,4155],{},"    rect rgb(245, 158, 11)\n",[262,4157,4158],{"class":264,"line":430},[262,4159,4160],{},"    note right of Service: Business Logic Layer\n",[262,4162,4163],{"class":264,"line":436},[262,4164,4165],{},"    API->>+Service: Process business logic\n",[262,4167,4168],{"class":264,"line":442},[262,4169,4170],{},"    Service->>+DB: Query with access controls\n",[262,4172,4173],{"class":264,"line":1089},[262,4174,2750],{},[262,4176,4177],{"class":264,"line":2811},[262,4178,2755],{},[262,4180,4181],{"class":264,"line":2817},[262,4182,4183],{},"    rect rgb(239, 68, 68)\n",[262,4185,4186],{"class":264,"line":2823},[262,4187,4188],{},"    note right of DB: Data Storage Layer\n",[262,4190,4191],{"class":264,"line":2828},[262,4192,4193],{},"    DB-->>-Service: Return filtered data\n",[262,4195,4196],{"class":264,"line":2833},[262,4197,2750],{},[262,4199,4200],{"class":264,"line":2839},[262,4201,2755],{},[262,4203,4204],{"class":264,"line":2845},[262,4205,4155],{},[262,4207,4208],{"class":264,"line":2851},[262,4209,4160],{},[262,4211,4212],{"class":264,"line":2857},[262,4213,4214],{},"    Service-->>-API: Processed response\n",[262,4216,4217],{"class":264,"line":2863},[262,4218,2750],{},[262,4220,4221],{"class":264,"line":2868},[262,4222,2755],{},[262,4224,4225],{"class":264,"line":2873},[262,4226,4127],{},[262,4228,4229],{"class":264,"line":2879},[262,4230,4132],{},[262,4232,4233],{"class":264,"line":2885},[262,4234,4235],{},"    API-->>-MCP: API response\n",[262,4237,4238],{"class":264,"line":2891},[262,4239,2750],{},[262,4241,4242],{"class":264,"line":2897},[262,4243,2755],{},[262,4245,4246],{"class":264,"line":2903},[262,4247,4104],{},[262,4249,4250],{"class":264,"line":2908},[262,4251,4109],{},[262,4253,4254],{"class":264,"line":2913},[262,4255,4256],{},"    MCP-->>-Chatbot: Formatted result\n",[262,4258,4259],{"class":264,"line":2919},[262,4260,2750],{},[262,4262,4263],{"class":264,"line":2925},[262,4264,2755],{},[262,4266,4267],{"class":264,"line":2931},[262,4268,4269],{},"    Note over Chatbot,DB: Secure communication flow with\u003Cbr/>authentication at each layer\n",[777,4271,4273],{"id":4272},"implementación-de-servicios-simulados","Implementación de Servicios Simulados",[80,4275,4276],{},"El proyecto incluye 8 servicios simulados comprensivos que simulan operaciones de negocio reales:",[2244,4278,4279,4285,4291,4297,4303,4309,4315,4321],{},[139,4280,4281,4284],{},[84,4282,4283],{},"Servicio de Cliente",": Gestiona perfiles de clientes y preferencias",[139,4286,4287,4290],{},[84,4288,4289],{},"Servicio de Calderas",": Maneja información de calderas y datos de garantía",[139,4292,4293,4296],{},[84,4294,4295],{},"Servicio de Pago",": Procesa transacciones y validación de pagos",[139,4298,4299,4302],{},[84,4300,4301],{},"Servicio de Email",": Gestiona comunicación y notificaciones",[139,4304,4305,4308],{},[84,4306,4307],{},"Servicio de Clima",": Proporciona datos climáticos para programación",[139,4310,4311,4314],{},[84,4312,4313],{},"Servicio de Garantía",": Maneja información de garantía y reclamos",[139,4316,4317,4320],{},[84,4318,4319],{},"Servicio de Predicción IA",": Simula predicciones de mantenimiento",[139,4322,4323,4326],{},[84,4324,4325],{},"Servicio de Técnico",": Gestiona disponibilidad y programación de técnicos",[777,4328,4330],{"id":4329},"estructura-de-capa-de-datos","Estructura de Capa de Datos",[215,4332,4336],{"className":4333,"code":4334,"language":4335,"meta":221,"style":221},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"customers\": {\n    \"CUST001\": {\n      \"name\": \"John Smith\",\n      \"email\": \"john.smith@email.com\",\n      \"address\": \"123 Main St, London\",\n      \"phone\": \"+44 20 1234 5678\",\n      \"preferences\": {\n        \"contact_method\": \"email\",\n        \"appointment_time\": \"morning\",\n        \"technician_preference\": \"John Smith\"\n      }\n    }\n  },\n  \"boilers\": {\n    \"BOIL001\": {\n      \"customer_id\": \"CUST001\",\n      \"model\": \"Worcester Bosch 8000 Style\",\n      \"installation_date\": \"2023-03-15\",\n      \"warranty_expiry\": \"2028-03-15\",\n      \"last_service\": \"2024-01-12\",\n      \"next_service_due\": \"2025-01-12\"\n    }\n  }\n}\n","json",[223,4337,4338,4343,4357,4372,4394,4413,4433,4453,4466,4486,4506,4524,4529,4534,4539,4552,4565,4583,4603,4623,4643,4663,4681,4685,4689],{"__ignoreMap":221},[262,4339,4340],{"class":264,"line":265},[262,4341,4342],{"class":3163},"{\n",[262,4344,4345,4348,4351,4353,4355],{"class":264,"line":271},[262,4346,4347],{"class":3163},"  \"",[262,4349,4350],{"class":3155},"customers",[262,4352,3186],{"class":3163},[262,4354,3176],{"class":3163},[262,4356,3167],{"class":3163},[262,4358,4359,4362,4366,4368,4370],{"class":264,"line":277},[262,4360,4361],{"class":3163},"    \"",[262,4363,4365],{"class":4364},"sBMFI","CUST001",[262,4367,3186],{"class":3163},[262,4369,3176],{"class":3163},[262,4371,3167],{"class":3163},[262,4373,4374,4377,4381,4383,4385,4387,4390,4392],{"class":264,"line":283},[262,4375,4376],{"class":3163},"      \"",[262,4378,4380],{"class":4379},"sbssI","name",[262,4382,3186],{"class":3163},[262,4384,3176],{"class":3163},[262,4386,3179],{"class":3163},[262,4388,4389],{"class":3182},"John Smith",[262,4391,3186],{"class":3163},[262,4393,3189],{"class":3163},[262,4395,4396,4398,4400,4402,4404,4406,4409,4411],{"class":264,"line":289},[262,4397,4376],{"class":3163},[262,4399,3750],{"class":4379},[262,4401,3186],{"class":3163},[262,4403,3176],{"class":3163},[262,4405,3179],{"class":3163},[262,4407,4408],{"class":3182},"john.smith@email.com",[262,4410,3186],{"class":3163},[262,4412,3189],{"class":3163},[262,4414,4415,4417,4420,4422,4424,4426,4429,4431],{"class":264,"line":295},[262,4416,4376],{"class":3163},[262,4418,4419],{"class":4379},"address",[262,4421,3186],{"class":3163},[262,4423,3176],{"class":3163},[262,4425,3179],{"class":3163},[262,4427,4428],{"class":3182},"123 Main St, London",[262,4430,3186],{"class":3163},[262,4432,3189],{"class":3163},[262,4434,4435,4437,4440,4442,4444,4446,4449,4451],{"class":264,"line":301},[262,4436,4376],{"class":3163},[262,4438,4439],{"class":4379},"phone",[262,4441,3186],{"class":3163},[262,4443,3176],{"class":3163},[262,4445,3179],{"class":3163},[262,4447,4448],{"class":3182},"+44 20 1234 5678",[262,4450,3186],{"class":3163},[262,4452,3189],{"class":3163},[262,4454,4455,4457,4460,4462,4464],{"class":264,"line":307},[262,4456,4376],{"class":3163},[262,4458,4459],{"class":4379},"preferences",[262,4461,3186],{"class":3163},[262,4463,3176],{"class":3163},[262,4465,3167],{"class":3163},[262,4467,4468,4471,4474,4476,4478,4480,4482,4484],{"class":264,"line":312},[262,4469,4470],{"class":3163},"        \"",[262,4472,4473],{"class":3172},"contact_method",[262,4475,3186],{"class":3163},[262,4477,3176],{"class":3163},[262,4479,3179],{"class":3163},[262,4481,3750],{"class":3182},[262,4483,3186],{"class":3163},[262,4485,3189],{"class":3163},[262,4487,4488,4490,4493,4495,4497,4499,4502,4504],{"class":264,"line":318},[262,4489,4470],{"class":3163},[262,4491,4492],{"class":3172},"appointment_time",[262,4494,3186],{"class":3163},[262,4496,3176],{"class":3163},[262,4498,3179],{"class":3163},[262,4500,4501],{"class":3182},"morning",[262,4503,3186],{"class":3163},[262,4505,3189],{"class":3163},[262,4507,4508,4510,4513,4515,4517,4519,4521],{"class":264,"line":324},[262,4509,4470],{"class":3163},[262,4511,4512],{"class":3172},"technician_preference",[262,4514,3186],{"class":3163},[262,4516,3176],{"class":3163},[262,4518,3179],{"class":3163},[262,4520,4389],{"class":3182},[262,4522,4523],{"class":3163},"\"\n",[262,4525,4526],{"class":264,"line":330},[262,4527,4528],{"class":3163},"      }\n",[262,4530,4531],{"class":264,"line":336},[262,4532,4533],{"class":3163},"    }\n",[262,4535,4536],{"class":264,"line":342},[262,4537,4538],{"class":3163},"  },\n",[262,4540,4541,4543,4546,4548,4550],{"class":264,"line":348},[262,4542,4347],{"class":3163},[262,4544,4545],{"class":3155},"boilers",[262,4547,3186],{"class":3163},[262,4549,3176],{"class":3163},[262,4551,3167],{"class":3163},[262,4553,4554,4556,4559,4561,4563],{"class":264,"line":354},[262,4555,4361],{"class":3163},[262,4557,4558],{"class":4364},"BOIL001",[262,4560,3186],{"class":3163},[262,4562,3176],{"class":3163},[262,4564,3167],{"class":3163},[262,4566,4567,4569,4571,4573,4575,4577,4579,4581],{"class":264,"line":360},[262,4568,4376],{"class":3163},[262,4570,3284],{"class":4379},[262,4572,3186],{"class":3163},[262,4574,3176],{"class":3163},[262,4576,3179],{"class":3163},[262,4578,4365],{"class":3182},[262,4580,3186],{"class":3163},[262,4582,3189],{"class":3163},[262,4584,4585,4587,4590,4592,4594,4596,4599,4601],{"class":264,"line":366},[262,4586,4376],{"class":3163},[262,4588,4589],{"class":4379},"model",[262,4591,3186],{"class":3163},[262,4593,3176],{"class":3163},[262,4595,3179],{"class":3163},[262,4597,4598],{"class":3182},"Worcester Bosch 8000 Style",[262,4600,3186],{"class":3163},[262,4602,3189],{"class":3163},[262,4604,4605,4607,4610,4612,4614,4616,4619,4621],{"class":264,"line":372},[262,4606,4376],{"class":3163},[262,4608,4609],{"class":4379},"installation_date",[262,4611,3186],{"class":3163},[262,4613,3176],{"class":3163},[262,4615,3179],{"class":3163},[262,4617,4618],{"class":3182},"2023-03-15",[262,4620,3186],{"class":3163},[262,4622,3189],{"class":3163},[262,4624,4625,4627,4630,4632,4634,4636,4639,4641],{"class":264,"line":378},[262,4626,4376],{"class":3163},[262,4628,4629],{"class":4379},"warranty_expiry",[262,4631,3186],{"class":3163},[262,4633,3176],{"class":3163},[262,4635,3179],{"class":3163},[262,4637,4638],{"class":3182},"2028-03-15",[262,4640,3186],{"class":3163},[262,4642,3189],{"class":3163},[262,4644,4645,4647,4650,4652,4654,4656,4659,4661],{"class":264,"line":384},[262,4646,4376],{"class":3163},[262,4648,4649],{"class":4379},"last_service",[262,4651,3186],{"class":3163},[262,4653,3176],{"class":3163},[262,4655,3179],{"class":3163},[262,4657,4658],{"class":3182},"2024-01-12",[262,4660,3186],{"class":3163},[262,4662,3189],{"class":3163},[262,4664,4665,4667,4670,4672,4674,4676,4679],{"class":264,"line":389},[262,4666,4376],{"class":3163},[262,4668,4669],{"class":4379},"next_service_due",[262,4671,3186],{"class":3163},[262,4673,3176],{"class":3163},[262,4675,3179],{"class":3163},[262,4677,4678],{"class":3182},"2025-01-12",[262,4680,4523],{"class":3163},[262,4682,4683],{"class":264,"line":395},[262,4684,4533],{"class":3163},[262,4686,4687],{"class":264,"line":401},[262,4688,3294],{"class":3163},[262,4690,4691],{"class":264,"line":407},[262,4692,3299],{"class":3163},[80,4694,4695,4698],{},[84,4696,4697],{},"Resumen de Estructura de Datos",": El sistema usa archivos JSON para simular una base de datos real, con datos estructurados para clientes, calderas, horarios de mantenimiento y órdenes. Cada registro incluye información comprensiva necesaria para las interacciones del chatbot.",[75,4700,4702,4708],{"className":4701},[113,114,115],[117,4703,4705],{"id":4704},"_5-pruebas-y-control-de-calidad",[84,4706,4707],{},"5. Pruebas y Control de Calidad",[80,4709,4710],{},[126,4711,4712],{"href":128},[84,4713,131],{},[75,4715,4717],{"className":4716},[78],[80,4718,4719],{},"El proyecto MCP-in-Chat incluye una suite de pruebas comprensiva que asegura confiabilidad y funcionalidad en todos los componentes.",[777,4721,4723],{"id":4722},"cobertura-de-pruebas","Cobertura de Pruebas",[136,4725,4726,4732,4738,4744,4750],{},[139,4727,4728,4731],{},[84,4729,4730],{},"Herramientas MCP",": Todas las 4 herramientas probadas con varios escenarios de entrada",[139,4733,4734,4737],{},[84,4735,4736],{},"Endpoints API",": Pruebas completas de API REST con autenticación",[139,4739,4740,4743],{},[84,4741,4742],{},"Manejo de Errores",": Validación de respuestas de error y casos extremos",[139,4745,4746,4749],{},[84,4747,4748],{},"Integración",": Pruebas de flujo de trabajo de extremo a extremo",[139,4751,4752,4755],{},[84,4753,4754],{},"Rendimiento",": Pruebas de tiempo de respuesta y carga",[777,4757,4759],{"id":4758},"resumen-de-resultados-de-pruebas","Resumen de Resultados de Pruebas",[215,4761,4764],{"className":4762,"code":4763,"language":220},[218],"📊 RESUMEN DE PRUEBAS\n============================================================\nTotal de Pruebas: 5\nPasadas: 5 ✅\nFallidas: 0 ❌\nTasa de Éxito: 100.0%\n\n📋 RESULTADOS DETALLADOS\n------------------------------------------------------------\n1. boiler-info: ✅ PASÓ\n2. maintenance-get: ✅ PASÓ\n3. maintenance-schedule: ✅ PASÓ\n4. purchase: ✅ PASÓ\n5. email: ✅ PASÓ\n\n🎉 ¡Todas las pruebas pasaron! Las herramientas MCP están funcionando correctamente.\n",[223,4765,4763],{"__ignoreMap":221},[777,4767,4769],{"id":4768},"comandos-de-prueba-rápida","Comandos de Prueba Rápida",[215,4771,4775],{"className":4772,"code":4773,"language":4774,"meta":221,"style":221},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Ejecutar todas las pruebas de herramientas MCP\nnpm test\n\n# Probar componentes específicos\nnpm run test:api          # Pruebas de API backend\nnpm run test:mcp          # Integración MCP de Cursor\nnpm run test:protocol     # Validación de protocolo MCP\nnpm run test:compiled     # Prueba de versión compilada\nnpm run test:connection   # Prueba de conexión\nnpm run test:quick        # Verificación rápida de salud\n","bash",[223,4776,4777,4782,4790,4795,4800,4813,4825,4837,4849,4861],{"__ignoreMap":221},[262,4778,4779],{"class":264,"line":265},[262,4780,4781],{"class":3149},"# Ejecutar todas las pruebas de herramientas MCP\n",[262,4783,4784,4787],{"class":264,"line":271},[262,4785,4786],{"class":4364},"npm",[262,4788,4789],{"class":3182}," test\n",[262,4791,4792],{"class":264,"line":277},[262,4793,4794],{"emptyLinePlaceholder":2105},"\n",[262,4796,4797],{"class":264,"line":283},[262,4798,4799],{"class":3149},"# Probar componentes específicos\n",[262,4801,4802,4804,4807,4810],{"class":264,"line":289},[262,4803,4786],{"class":4364},[262,4805,4806],{"class":3182}," run",[262,4808,4809],{"class":3182}," test:api",[262,4811,4812],{"class":3149},"          # Pruebas de API backend\n",[262,4814,4815,4817,4819,4822],{"class":264,"line":295},[262,4816,4786],{"class":4364},[262,4818,4806],{"class":3182},[262,4820,4821],{"class":3182}," test:mcp",[262,4823,4824],{"class":3149},"          # Integración MCP de Cursor\n",[262,4826,4827,4829,4831,4834],{"class":264,"line":301},[262,4828,4786],{"class":4364},[262,4830,4806],{"class":3182},[262,4832,4833],{"class":3182}," test:protocol",[262,4835,4836],{"class":3149},"     # Validación de protocolo MCP\n",[262,4838,4839,4841,4843,4846],{"class":264,"line":307},[262,4840,4786],{"class":4364},[262,4842,4806],{"class":3182},[262,4844,4845],{"class":3182}," test:compiled",[262,4847,4848],{"class":3149},"     # Prueba de versión compilada\n",[262,4850,4851,4853,4855,4858],{"class":264,"line":312},[262,4852,4786],{"class":4364},[262,4854,4806],{"class":3182},[262,4856,4857],{"class":3182}," test:connection",[262,4859,4860],{"class":3149},"   # Prueba de conexión\n",[262,4862,4863,4865,4867,4870],{"class":264,"line":318},[262,4864,4786],{"class":4364},[262,4866,4806],{"class":3182},[262,4868,4869],{"class":3182}," test:quick",[262,4871,4872],{"class":3149},"        # Verificación rápida de salud\n",[75,4874,4876,4882],{"className":4875},[113,114,115],[117,4877,4879],{"id":4878},"_6-comenzando",[84,4880,4881],{},"6. Comenzando",[80,4883,4884],{},[126,4885,4886],{"href":128},[84,4887,131],{},[75,4889,4891],{"className":4890},[78],[80,4892,4893],{},"El proyecto MCP-in-Chat está diseñado para ser fácilmente accesible para desarrolladores que quieren entender e implementar servidores MCP para sus propios casos de uso.",[777,4895,4897],{"id":4896},"prerrequisitos","Prerrequisitos",[136,4899,4900,4903,4906,4909],{},[139,4901,4902],{},"Node.js 18+ y npm",[139,4904,4905],{},"Conocimiento de TypeScript",[139,4907,4908],{},"Comprensión básica del protocolo MCP",[139,4910,4911],{},"Acceso a chatbots externos (Claude, ChatGPT, Cursor)",[777,4913,4915],{"id":4914},"instalación","Instalación",[215,4917,4919],{"className":4772,"code":4918,"language":4774,"meta":221,"style":221},"# Clonar el repositorio\ngit clone https://github.com/michaelwybraniec/mcp-in-chat.git\ncd mcp-in-chat\n\n# Instalar dependencias\nnpm install\n\n# Construir el proyecto\nnpm run build\n\n# Iniciar el servidor API\nnpm run start:api\n\n# Iniciar el servidor MCP (en otra terminal)\nnpm run start:mcp\n",[223,4920,4921,4926,4937,4946,4950,4955,4962,4966,4971,4980,4984,4989,4998,5002,5007],{"__ignoreMap":221},[262,4922,4923],{"class":264,"line":265},[262,4924,4925],{"class":3149},"# Clonar el repositorio\n",[262,4927,4928,4931,4934],{"class":264,"line":271},[262,4929,4930],{"class":4364},"git",[262,4932,4933],{"class":3182}," clone",[262,4935,4936],{"class":3182}," https://github.com/michaelwybraniec/mcp-in-chat.git\n",[262,4938,4939,4943],{"class":264,"line":277},[262,4940,4942],{"class":4941},"s2Zo4","cd",[262,4944,4945],{"class":3182}," mcp-in-chat\n",[262,4947,4948],{"class":264,"line":283},[262,4949,4794],{"emptyLinePlaceholder":2105},[262,4951,4952],{"class":264,"line":289},[262,4953,4954],{"class":3149},"# Instalar dependencias\n",[262,4956,4957,4959],{"class":264,"line":295},[262,4958,4786],{"class":4364},[262,4960,4961],{"class":3182}," install\n",[262,4963,4964],{"class":264,"line":301},[262,4965,4794],{"emptyLinePlaceholder":2105},[262,4967,4968],{"class":264,"line":307},[262,4969,4970],{"class":3149},"# Construir el proyecto\n",[262,4972,4973,4975,4977],{"class":264,"line":312},[262,4974,4786],{"class":4364},[262,4976,4806],{"class":3182},[262,4978,4979],{"class":3182}," build\n",[262,4981,4982],{"class":264,"line":318},[262,4983,4794],{"emptyLinePlaceholder":2105},[262,4985,4986],{"class":264,"line":324},[262,4987,4988],{"class":3149},"# Iniciar el servidor API\n",[262,4990,4991,4993,4995],{"class":264,"line":330},[262,4992,4786],{"class":4364},[262,4994,4806],{"class":3182},[262,4996,4997],{"class":3182}," start:api\n",[262,4999,5000],{"class":264,"line":336},[262,5001,4794],{"emptyLinePlaceholder":2105},[262,5003,5004],{"class":264,"line":342},[262,5005,5006],{"class":3149},"# Iniciar el servidor MCP (en otra terminal)\n",[262,5008,5009,5011,5013],{"class":264,"line":348},[262,5010,4786],{"class":4364},[262,5012,4806],{"class":3182},[262,5014,5015],{"class":3182}," start:mcp\n",[777,5017,5019],{"id":5018},"integración-con-chatbots-externos","Integración con Chatbots Externos",[80,5021,5022],{},"El servidor MCP está diseñado para funcionar con cualquier chatbot compatible con MCP:",[2244,5024,5025,5031,5037],{},[139,5026,5027,5030],{},[84,5028,5029],{},"Claude Desktop",": Agregar el servidor MCP a la configuración de Claude",[139,5032,5033,5036],{},[84,5034,5035],{},"ChatGPT",": Usar el servidor MCP como herramienta personalizada",[139,5038,5039,5042],{},[84,5040,5041],{},"Cursor IDE",": Integrar directamente con el entorno de desarrollo",[777,5044,5046],{"id":5045},"personalización","Personalización",[80,5048,5049],{},"El proyecto está diseñado para ser fácilmente personalizable para diferentes dominios de negocio:",[2244,5051,5052,5058,5064,5070],{},[139,5053,5054,5057],{},[84,5055,5056],{},"Reemplazar Servicios Simulados",": Conectar a APIs y bases de datos reales",[139,5059,5060,5063],{},[84,5061,5062],{},"Agregar Nuevas Herramientas",": Extender el servidor MCP con funcionalidad adicional",[139,5065,5066,5069],{},[84,5067,5068],{},"Modificar Lógica de Negocio",": Adaptar los servicios para tu caso de uso específico",[139,5071,5072,5075],{},[84,5073,5074],{},"Mejorar Seguridad",": Agregar capas adicionales de autenticación y autorización",[75,5077,5079,5085],{"className":5078},[113,114,115],[117,5080,5082],{"id":5081},"_7-lecciones-aprendidas",[84,5083,5084],{},"7. Lecciones Aprendidas",[80,5086,5087],{},[126,5088,5089],{"href":128},[84,5090,131],{},[75,5092,5094],{"className":5093},[78],[80,5095,5096],{},"El proyecto MCP-in-Chat proporciona información valiosa sobre la construcción de servidores MCP listos para producción y su integración con chatbots externos.",[777,5098,5100],{"id":5099},"factores-clave-de-éxito","Factores Clave de Éxito",[2244,5102,5103,5109,5115,5121,5126],{},[139,5104,5105,5108],{},[84,5106,5107],{},"Arquitectura en Capas",": Separación clara entre herramientas MCP, capa de API y lógica de negocio",[139,5110,5111,5114],{},[84,5112,5113],{},"Pruebas Comprensivas",": 100% de cobertura de pruebas asegura confiabilidad",[139,5116,5117,5120],{},[84,5118,5119],{},"Seguridad Primero",": Autenticación, validación y limitación de tasa desde el inicio",[139,5122,5123,5125],{},[84,5124,2495],{},": Documentación completa para fácil incorporación",[139,5127,5128,5131],{},[84,5129,5130],{},"Servicios Simulados",": Simulación de datos realista para desarrollo y pruebas",[777,5133,5135],{"id":5134},"desafíos-comunes-y-soluciones","Desafíos Comunes y Soluciones",[2244,5137,5138,5157,5174,5191],{},[139,5139,5140,5143],{},[84,5141,5142],{},"Complejidad de Integración Externa",[136,5144,5145,5151],{},[139,5146,5147,5150],{},[84,5148,5149],{},"Desafío",": Probar con chatbots externos puede ser difícil",[139,5152,5153,5156],{},[84,5154,5155],{},"Solución",": Suite de pruebas locales comprensiva con escenarios realistas",[139,5158,5159,5162],{},[84,5160,5161],{},"Implementación de Seguridad",[136,5163,5164,5169],{},[139,5165,5166,5168],{},[84,5167,5149],{},": Asegurar comunicación segura entre componentes",[139,5170,5171,5173],{},[84,5172,5155],{},": Seguridad en capas con autenticación en cada nivel",[139,5175,5176,5179],{},[84,5177,5178],{},"Gestión de Datos",[136,5180,5181,5186],{},[139,5182,5183,5185],{},[84,5184,5149],{},": Mantener estado consistente entre servicios",[139,5187,5188,5190],{},[84,5189,5155],{},": Capa de datos centralizada con controles de acceso",[139,5192,5193,5195],{},[84,5194,4742],{},[136,5196,5197,5202],{},[139,5198,5199,5201],{},[84,5200,5149],{},": Manejo elegante de errores en interfaces conversacionales",[139,5203,5204,5206],{},[84,5205,5155],{},": Respuestas de error estructuradas con orientación accionable",[777,5208,5210],{"id":5209},"consideraciones-de-rendimiento","Consideraciones de Rendimiento",[136,5212,5213,5219,5225,5231],{},[139,5214,5215,5218],{},[84,5216,5217],{},"Tiempo de Respuesta",": Las herramientas MCP deben responder dentro de 2-3 segundos",[139,5220,5221,5224],{},[84,5222,5223],{},"Limitación de Tasa",": Implementar límites de tasa apropiados para prevenir abuso",[139,5226,5227,5230],{},[84,5228,5229],{},"Caché",": Cachear datos frecuentemente accedidos para mejorar rendimiento",[139,5232,5233,5236],{},[84,5234,5235],{},"Monitoreo",": Implementar logging y monitoreo comprensivos",[75,5238,5240,5246],{"className":5239},[113,114,115],[117,5241,5243],{"id":5242},"_8-mejoras-futuras",[84,5244,5245],{},"8. Mejoras Futuras",[80,5247,5248],{},[126,5249,5250],{"href":128},[84,5251,131],{},[75,5253,5255],{"className":5254},[78],[80,5256,5257],{},"El proyecto MCP-in-Chat sirve como base para implementaciones más sofisticadas de servidores MCP y proporciona una hoja de ruta para desarrollo futuro.",[777,5259,5261],{"id":5260},"mejoras-planificadas","Mejoras Planificadas",[2244,5263,5264,5283,5302,5321],{},[139,5265,5266,5269],{},[84,5267,5268],{},"Integración de Servicios Reales",[136,5270,5271,5274,5277,5280],{},[139,5272,5273],{},"Reemplazar servicios simulados con APIs reales",[139,5275,5276],{},"Integrar con pasarelas de pago",[139,5278,5279],{},"Conectar a bases de datos de clientes",[139,5281,5282],{},"Implementar servicios de email reales",[139,5284,5285,5288],{},[84,5286,5287],{},"Características Avanzadas",[136,5289,5290,5293,5296,5299],{},[139,5291,5292],{},"Soporte multiidioma",[139,5294,5295],{},"Integración de voz",[139,5297,5298],{},"Integración de aplicación móvil",[139,5300,5301],{},"Análisis avanzados y reportes",[139,5303,5304,5307],{},[84,5305,5306],{},"Mejoras de Escalabilidad",[136,5308,5309,5312,5315,5318],{},[139,5310,5311],{},"Arquitectura de microservicios",[139,5313,5314],{},"Balanceo de carga",[139,5316,5317],{},"Optimización de base de datos",[139,5319,5320],{},"Estrategias de caché",[139,5322,5323,5326],{},[84,5324,5325],{},"Mejoras de Seguridad",[136,5327,5328,5331,5334,5337],{},[139,5329,5330],{},"Integración OAuth 2.0",[139,5332,5333],{},"Control de acceso basado en roles",[139,5335,5336],{},"Logging de auditoría",[139,5338,5339],{},"Características de cumplimiento",[777,5341,5343],{"id":5342},"aplicaciones-de-la-industria","Aplicaciones de la Industria",[80,5345,5346],{},"La arquitectura MCP-in-Chat puede adaptarse para varias industrias:",[2244,5348,5349,5355,5361,5367,5373],{},[139,5350,5351,5354],{},[84,5352,5353],{},"Salud",": Programación de citas de pacientes y acceso a registros médicos",[139,5356,5357,5360],{},[84,5358,5359],{},"Finanzas",": Gestión de cuentas y procesamiento de transacciones",[139,5362,5363,5366],{},[84,5364,5365],{},"Educación",": Registro de cursos y servicios estudiantiles",[139,5368,5369,5372],{},[84,5370,5371],{},"Bienes Raíces",": Búsqueda de propiedades y gestión de reservas",[139,5374,5375,5378],{},[84,5376,5377],{},"Viajes",": Reserva de vuelos y gestión de itinerarios",[75,5380,5382,5388],{"className":5381},[113,114,115],[117,5383,5385],{"id":5384},"_9-conclusión",[84,5386,5387],{},"9. Conclusión",[80,5389,5390],{},[126,5391,5392],{"href":128},[84,5393,131],{},[75,5395,5397],{"className":5396},[78],[80,5398,5399],{},"El proyecto MCP-in-Chat demuestra el poder y potencial de los servidores del Protocolo de Contexto del Modelo en la creación de sistemas de IA conversacional sofisticados. Al proporcionar un ejemplo completo y listo para producción, sirve tanto como recurso de aprendizaje como base para implementaciones del mundo real.",[777,5401,5403],{"id":5402},"puntos-clave","Puntos Clave",[2244,5405,5406,5412,5418,5424,5430],{},[139,5407,5408,5411],{},[84,5409,5410],{},"Los Servidores MCP Habilitan Valor Comercial Real",": El proyecto muestra cómo los servidores MCP pueden conectar la IA conversacional con sistemas empresariales",[139,5413,5414,5417],{},[84,5415,5416],{},"El Desarrollo Sistemático Funciona",": La metodología AWP aseguró desarrollo consistente y de alta calidad",[139,5419,5420,5423],{},[84,5421,5422],{},"La Seguridad es Primordial",": La arquitectura de seguridad en capas es esencial para sistemas de producción",[139,5425,5426,5429],{},[84,5427,5428],{},"Las Pruebas son Críticas",": Las pruebas comprensivas aseguran confiabilidad y funcionalidad",[139,5431,5432,5435],{},[84,5433,5434],{},"La Documentación Importa",": La documentación completa permite adopción y personalización fáciles",[777,5437,5439],{"id":5438},"próximos-pasos","Próximos Pasos",[80,5441,5442],{},"Para desarrolladores interesados en servidores MCP:",[2244,5444,5445,5456,5462,5468],{},[139,5446,5447,5450,5451,5455],{},[84,5448,5449],{},"Estudiar el Código",": Revisar el ",[126,5452,5454],{"href":2412,"rel":5453},[2414],"repositorio MCP-in-Chat"," para entender la implementación",[139,5457,5458,5461],{},[84,5459,5460],{},"Ejecutar el Demo",": Configurar el proyecto localmente y probar con chatbots externos",[139,5463,5464,5467],{},[84,5465,5466],{},"Personalizar",": Adaptar la arquitectura para tu caso de uso específico",[139,5469,5470,5473],{},[84,5471,5472],{},"Contribuir",": Compartir mejoras y mejoras con la comunidad",[80,5475,5476],{},"El proyecto MCP-in-Chat representa un paso significativo hacia adelante en hacer los servidores MCP accesibles y prácticos para aplicaciones del mundo real. Al proporcionar un ejemplo completo y funcional, reduce la barrera de entrada para desarrolladores que quieren integrar IA conversacional con sus sistemas de negocio.",[187,5478],{},[80,5480,5481,3176],{},[84,5482,5483],{},"Recursos",[136,5485,5486,5492,5499],{},[139,5487,5488],{},[126,5489,5491],{"href":2412,"rel":5490},[2414],"Repositorio MCP-in-Chat",[139,5493,5494],{},[126,5495,5498],{"href":5496,"rel":5497},"https://modelcontextprotocol.io/",[2414],"Documentación del Protocolo de Contexto del Modelo",[139,5500,5501],{},[126,5502,2439],{"href":5503,"rel":5504},"https://github.com/michaelwybraniec/mcp-agentic-sldc",[2414],[2356,5506,5507],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":221,"searchDepth":271,"depth":271,"links":5509},[5510,5518,5524,5529,5534,5539,5545,5550,5554],{"id":2422,"depth":271,"text":2425,"children":5511},[5512,5513,5514,5515,5516,5517],{"id":2450,"depth":277,"text":2451},{"id":2469,"depth":277,"text":2470},{"id":2505,"depth":277,"text":2506},{"id":2593,"depth":277,"text":2594},{"id":2610,"depth":277,"text":2611},{"id":2652,"depth":277,"text":2653},{"id":3118,"depth":271,"text":3121,"children":5519},[5520,5521,5522,5523],{"id":3136,"depth":277,"text":3137},{"id":3308,"depth":277,"text":3309},{"id":3528,"depth":277,"text":3529},{"id":3717,"depth":277,"text":3718},{"id":3921,"depth":271,"text":3924,"children":5525},[5526,5527,5528],{"id":3939,"depth":277,"text":3940},{"id":3960,"depth":277,"text":3961},{"id":3979,"depth":277,"text":3980},{"id":4001,"depth":271,"text":4004,"children":5530},[5531,5532,5533],{"id":4019,"depth":277,"text":4020},{"id":4272,"depth":277,"text":4273},{"id":4329,"depth":277,"text":4330},{"id":4704,"depth":271,"text":4707,"children":5535},[5536,5537,5538],{"id":4722,"depth":277,"text":4723},{"id":4758,"depth":277,"text":4759},{"id":4768,"depth":277,"text":4769},{"id":4878,"depth":271,"text":4881,"children":5540},[5541,5542,5543,5544],{"id":4896,"depth":277,"text":4897},{"id":4914,"depth":277,"text":4915},{"id":5018,"depth":277,"text":5019},{"id":5045,"depth":277,"text":5046},{"id":5081,"depth":271,"text":5084,"children":5546},[5547,5548,5549],{"id":5099,"depth":277,"text":5100},{"id":5134,"depth":277,"text":5135},{"id":5209,"depth":277,"text":5210},{"id":5242,"depth":271,"text":5245,"children":5551},[5552,5553],{"id":5260,"depth":277,"text":5261},{"id":5342,"depth":277,"text":5343},{"id":5384,"depth":271,"text":5387,"children":5555},[5556,5557],{"id":5402,"depth":277,"text":5403},{"id":5438,"depth":277,"text":5439},"2025-08-06","Una demostración completa de cómo construir un servidor MCP para integración de chatbot de e-commerce, con servicios de mantenimiento de calderas, acceso a datos en tiempo real y flujos de trabajo automatizados usando AWP.",{"src":5561},"/blog/mcp/mcp-cover.png",{},{"title":31,"description":5559},"2VMxDIVd5QfKHgmn_QSybkhAHpJe2qn8yPq1CQkX4fI",1790785039113]