[{"data":1,"prerenderedAt":742},["ShallowReactive",2],{"blog-webmcp-hu":3},{"slug":4,"published":5,"minutes":6,"category":7,"tags":8,"keywords":14,"about":21,"sources":29,"cover":53,"og":54,"expertise":55,"locales":56,"lang":59,"title":60,"description":61,"coverAlt":62,"metaTitle":63,"takeaways":64,"faq":70,"toc":83,"blocks":108,"others":469},"webmcp","2026-09-30",11,"web",[9,10,11,12,13],"WebMCP","Agent tools","JSON Schema","Chrome","MCP",[4,15,16,17,18,19,20],"webmcp vs mcp","document.modelContext registerTool","webmcp declarative api","browser agent tools","webmcp origin trial","webmcp chrome 149",[22,24,27],{"name":9,"url":23},"https:\u002F\u002Fgithub.com\u002Fwebmachinelearning\u002Fwebmcp",{"name":25,"url":26},"Model Context Protocol","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FModel_Context_Protocol",{"name":11,"url":28},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Schema",[30,33,36,39,42,45,48,50],{"title":31,"url":32},"Chrome for Developers: WebMCP (get started)","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fai\u002Fwebmcp",{"title":34,"url":35},"Chrome for Developers: Imperative API","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fai\u002Fwebmcp\u002Fimperative-api",{"title":37,"url":38},"Chrome for Developers: Declarative API","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fai\u002Fwebmcp\u002Fdeclarative-api",{"title":40,"url":41},"Chrome for Developers: WebMCP versus MCP","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fai\u002Fwebmcp\u002Fcompare-mcp",{"title":43,"url":44},"Chrome for Developers: WebMCP tool security","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fai\u002Fwebmcp\u002Fsecure-tools",{"title":46,"url":47},"Chrome for Developers: Build effective tools","https:\u002F\u002Fdeveloper.chrome.com\u002Fdocs\u002Fai\u002Fwebmcp\u002Fbuild-tools",{"title":49,"url":23},"WebMCP explainer and specification draft",{"title":51,"url":52},"WebMCP implementation status","https:\u002F\u002Fgithub.com\u002Fwebmachinelearning\u002Fwebmcp\u002Fblob\u002Fmain\u002Fimplementation-status.md","\u002Fimages\u002Fblog\u002Fwebmcp\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fwebmcp\u002Fog.jpg","ai-engineer",[57,58,59],"en","de","hu","WebMCP: eszközöket publikálni pixelek helyett","A WebMCP lehetővé teszi, hogy egy oldal tipizált, hívható eszközöket adjon át a böngészőben futó ügynöknek. Mit tesz a szabvány, mennyi érhető el belőle ma, és mikor marad jobb egy MCP-szerver.","Széles panel apró négyzetekből, a szélén rés ad át egy formált blokkot a fogadóhoz.","WebMCP: eszközök helyett pixelek · Balázs Csorba",[65,66,67,68,69],"A WebMCP böngészős API-javaslat, nem könyvtár: a Chrome 149 és az Edge 150 origin trialként szállítja, a Firefox és a Safari csak a standards-position szakaszban tart.","Az eszközök a tabhoz kötöttek, az oldal saját kódjában futnak, és a tools Permissions Policy szabályozza őket, nem az ügynök DOM-ból való tippelése.","A Chrome útmutatója 500 karakterre korlátozza az eszköz leírását és 1,5 KB-ra a kimenetét, tehát az eszközkatalógus kontextusablak-büdzsé.","Mind a négy annotáció alapértelmezés szerint hamis, így egy eszköz biztonsági tulajdonságai annyira őszinték, amennyire az őket regisztráló oldal.","Nincs felfedezési mechanizmus: a kliensnek meg kell látogatnia az oldalt, hogy tudja, vannak-e eszközei. Ez megváltoztatja a szabvány üzleti értékét.",[71,74,77,80],{"q":72,"a":73},"Mi a WebMCP?","A WebMCP javasolt webes szabvány, amely lehetővé teszi, hogy egy oldal tipizált, hívható eszközöket adjon át a böngészőben futó KI-ügynöknek. Az oldal regisztrál egy nevet, egy természetes nyelvű leírást, egy JSON sémát a bemenetre és egy execute függvényt, a böngésző pedig közvetíti az ügynök és a függvény közötti hívásokat. Az eszközök csak addig élnek, amíg a nyitott lap megvan.",{"q":75,"a":76},"A WebMCP az MCP helyettesítője?","Nem. A Chrome saját összehasonlító oldala mindkettőt partnernek tekinti, nem riválisnak: az MCP tartósan, bármely kliensnek ad backend képességeket, a WebMCP pedig efemeren adja egy oldal élő állapotát a böngészőbe integrált ügynöknek. A legtöbb éles rendszernél mindkettő megjelenik: MCP az üzleti logikára, WebMCP a felhasználó előtti felületre.",{"q":78,"a":79},"Kell a Chrome origin trial a helyi WebMCP-használathoz?","Nem. Helyi fejlesztéshez a chrome:\u002F\u002Fflags\u002F#enable-webmcp-testing jelzőkapcsoló token nélkül is bekapcsolja. Valódi felhasználóknak Chrome 149-től felfelé regisztrálni kell az origin trialba, az Edge 150 pedig külön trialt futtat, saját regisztrációval.",{"q":81,"a":82},"Mi a legnagyobb korlát ma?","A böngészőtámogatás, majd a felfedezhetőség. A specifikáció repository implementációs állapotfájlja Chrome- és Edge-origin trialokat, kísérleti támogatást a Brave Leo chatben és támogatást a ChatGPT Desktopban sorol fel, Firefoxban vagy Safariban viszont nincs szállított implementáció. Ehhez hozzájárul, hogy az API nem headless böngészős munkára készült, és a kliens csak egy látogatással tudja meg, hogy egy oldalnak vannak eszközei.",[84,87,90,93,96,99,102,105],{"id":85,"title":86},"what-it-is","Mi ez",{"id":88,"title":89},"how-it-works","Hogyan működik",{"id":91,"title":92},"getting-started","Első lépések",{"id":94,"title":95},"tool-design","Eszközök, amelyeket az ügynök kiválaszt",{"id":97,"title":98},"security","Biztonság és annotációk",{"id":100,"title":101},"where-it-shingles","Hol marad el",{"id":103,"title":104},"verdict","Ítélet",{"id":106,"title":107},"sources","Források",[109,113,116,119,131,191,192,195,201,204,205,208,210,217,221,224,226,244,251,252,255,283,286,318,319,322,344,347,357,358,361,407,410,411,420,432,441,442],{"type":110,"content":111},"paragraph",[112],"A WebMCP javasolt webes szabvány, amely lehetővé teszi, hogy egy oldal tipizált, hívható eszközöket publikáljon egy KI-ügynöknek, ahelyett hogy az ügynök a DOM-ból találgatná a szándékot. A javaslat kicsi, a böngészőtámogatás vékony, a tervezési döntés viszont helyes. Kezeld specifikációként, amit figyelni kell, és progresszív enhancementként feature detection mögött, nem pedig függőségként erre a negyedévre.",{"type":110,"content":114},[115],"A Model Context Protocol mellett áll, nem ellene. Egy MCP-szerver bármely kliensnek, bárhol ad backend képességeket; a WebMCP egy bejelentkezett oldal élő, tabon belüli állapotát adja át egy böngészőbe integrált ügynöknek, és eltűnik, ha a tab bezáródik. Az érdekes mérnöki kérdés nem az, melyik protokoll nyer. Az, melyik teszi elérhetővé a meglévő frontend-logikát anélkül, hogy hozzá kellene írni egy szervert.",{"type":117,"level":118,"id":85,"text":86},"heading",2,{"type":110,"content":120},[121,122,126,127,130],"A specifikáció a W3C Web Machine Learning Community Groupban él, és a WebMCP explainer dokumentálja a GitHubon, ahol a Chrome és az Edge csapatai a látható implementálók. A Chrome 149-től origin trial mögött szállítja, helyi fejlesztési kapcsolóval a ",{"tag":123,"children":124},"code",[125],"chrome:\u002F\u002Fflags\u002F#enable-webmcp-testing"," címen. Az API egy objektum a ",{"tag":123,"children":128},[129],"Document"," interfészen, és két formában létezik.",{"type":132,"ordered":133,"items":134},"list",false,[135,155,157,173,175,189],[136,139,140,143,144,143,147,150,151,154],{"tag":123,"children":137},[138],"document.modelContext"," biztosítja a ",{"tag":123,"children":141},[142],"registerTool()",", ",{"tag":123,"children":145},[146],"getTools()",{"tag":123,"children":148},[149],"executeTool()"," függvényeket és egy ",{"tag":123,"children":152},[153],"toolchange"," eseményt.",[156],"Egy eszköz egy névből, természetes nyelvű leírásból, a bemenetre szóló JSON sémából és az oldalon belül futó execute függvényből áll.",[158,159,143,162,143,165,168,169,172],"A deklaratív API egy annotált űrlapot alakít eszközzé a ",{"tag":123,"children":160},[161],"toolname",{"tag":123,"children":163},[164],"tooldescription",{"tag":123,"children":166},[167],"toolparamdescription"," és ",{"tag":123,"children":170},[171],"toolautosubmit"," attribútumokkal.",[174],"Az eszközök efemerek. Csak addig léteznek, amíg az oldal nyitva van, és az oldal saját sütijeivel és sessionjével futnak.",[176,177,180,181,184,185,188],"Mindkét API a ",{"tag":123,"children":178},[179],"tools"," Permissions Policy alá esik, amely alapértelmezés szerint ",{"tag":123,"children":182},[183],"self",", így a cross-origin iframe-ek kikapcsolnak, amíg a hoszt be nem állítja az ",{"tag":123,"children":186},[187],"allow=\"tools\""," attribútumot.",[190],"Az eszközök metaadatai a modell kontextusablakában vannak, ezért a regisztrált eszközök száma oldalankénti büdzsé, nem csak kódkérdés.",{"type":117,"level":118,"id":88,"text":89},{"type":110,"content":193},[194],"A regisztrálás egy hívás az oldalszkriptből; a meghívást a böngésző közvetíti az ügynök és az oldal között. A böngésző soha nem ad DOM-kezelőt az ügynöknek. Parszolja az argumentumokat, meghívja az execute függvényt, és a visszatérési értéket tool eredményként adja vissza. Ez az egész ergonómiai történet egy mondatban: az oldal dönti el, mi hívható, a böngésző pedig azt, ki hívhatja.",{"type":196,"src":197,"alt":198,"wide":199,"caption":200},"image","\u002Fimages\u002Fblog\u002Fwebmcp\u002Fdiagram-7.webp","WebMCP tool lifecycle A page registers a tool on document.modelContext. The browser mediates: it lists the tools to the agent, the agent invokes one, the execute function runs in the page, the page updates its own DOM and state, and the result travels back through the browser to the agent.",true,"A böngésző az ügynök és az oldal között ül. A hurokban semmi más nem bővítheti ezt a határt.",{"type":110,"content":202},[203],"A gyakorlati különbség az aktuáláshoz képest a hibakezelési ágon látszik. Egy kattintás egy rosszul renderelt elemen csendben elbukik, vagy a rossz handlert hívja meg. Egy rossz argumentummal érkező eszközhívás a saját validációnkba ütközik, és olyan üzenetet ad vissza, amit a modell el tud olvasni és használni. A Chrome útmutatója ezt kimondja, és azt javasolja, hogy a kódban szigorúan validáljunk, a séma viszont legyen laza, mert a séma elutasítása zsákutca az ügynök számára.",{"type":117,"level":118,"id":91,"text":92},{"type":110,"content":206},[207],"Az imperatív API az, amivel érdemes dolgozni, mert csak ez tud alkalmazásállapothoz nyúlni. Egy minimális read-only eszköz így néz ki.",{"type":123,"code":209},"\u002F\u002F Feature-detect: the API is behind a flag or an origin trial.\nif (typeof document.modelContext?.registerTool !== 'function') return;\n\nconst controller = new AbortController();\n\nawait document.modelContext.registerTool({\n  name: 'get_order_status',\n  description: 'Return the shipping status of one order for the signed-in customer.',\n  inputSchema: {\n    type: 'object',\n    properties: {\n      orderNumber: { type: 'string', description: 'Order number as shown in the order list.' },\n    },\n    required: ['orderNumber'],\n    additionalProperties: false,\n  },\n  annotations: { readOnlyHint: true },\n  execute: async ({ orderNumber }) => {\n    const order = await orders.findForCustomer(orderNumber);\n    \u002F\u002F A message the model can act on beats a thrown Error.\n    if (!order) return `No order ${orderNumber} is visible to this account.`;\n    return `Order ${orderNumber}: ${order.status}, arriving ${order.eta}.`;\n  },\n}, { signal: controller.signal });\n\n\u002F\u002F Unregister on route change. From Chrome 153 aborting no longer breaks a\n\u002F\u002F call that is already running.\ncontroller.abort();",{"type":110,"content":211},[212,213,216],"Három részlet fontosabb a többinél. A leírás az, amit a modell olvas el annak eldöntésére, hogy meghívja-e az eszközt, és a Chrome útmutatója 500 karakterre korlátozza. Az execute függvénynek azt a függvényt kellene újrahasznosítania, amit a látható gomb már meghív, hogy egyetlen kódút legyen, és a felület meg az eszköz ne mondjon ellent egymásnak. Az ",{"tag":123,"children":214},[215],"AbortSignal"," a leiratkozás útja, nem időzítő.",{"type":117,"level":218,"id":219,"text":220},3,"declarative-forms","Deklaratív űrlapok",{"type":110,"content":222},[223],"A deklaratív API egyszerű űrlapokra való, semmi másra. Annotáld az űrlapelemet, és a böngésző levezeti az eszköz definícióját a markupból és a mezőnevekből.",{"type":123,"code":225},"\u003Cform toolname=\"create_support_request\"\n      tooldescription=\"Submits a support request for the signed-in customer.\"\n      action=\"\u002Fsupport\"\n      toolautosubmit>\n  \u003Clabel for=\"subject\">Subject\u003C\u002Flabel>\n  \u003Cinput id=\"subject\" name=\"subject\" type=\"text\">\n\n  \u003Clabel for=\"reason\">Reason\u003C\u002Flabel>\n  \u003Cselect id=\"reason\" name=\"reason\" required\n          toolparamdescription=\"Determines which team handles the request.\">\n    \u003Coption value=\"returns\">Return a purchase\u003C\u002Foption>\n    \u003Coption value=\"delivery\">Where is my parcel\u003C\u002Foption>\n    \u003Coption value=\"site\">The website is broken\u003C\u002Foption>\n  \u003C\u002Fselect>\n\n  \u003Cbutton type=\"submit\">Submit\u003C\u002Fbutton>\n\u003C\u002Fform>",{"type":110,"content":227},[228,229,231,232,235,236,239,240,243],"A ",{"tag":123,"children":230},[171]," nélkül az ügynök kitölti az űrlapot, és az ember megnyomja a küldést. Ez a helyes alapértelmezés mindenki számára, akinek költsége van a műveletnek. A attribútummal a böngésző küld és navigál, a ",{"tag":123,"children":233},[234],"respondWith()"," pedig a ",{"tag":123,"children":237},[238],"SubmitEvent"," eseményen lehetővé teszi, hogy az oldal eredményt adjon vissza a modellnek. Az ",{"tag":123,"children":241},[242],"agentInvoked"," jelzőflag megmondja az oldalnak, hogy melyik úton fut a folyamat.",{"type":245,"variant":246,"title":247,"body":248},"callout","note","A szabvány olcsóbb fele",[249],[250],"A deklaratív API nem ér el JavaScript-only funkciót, mert az eszközdefinícióban nincs JavaScript. Az OpenAI site-tools dokumentációja kimondja, hogy a beépített böngésző egyáltalán nem implementálja a deklaratív API-t, így egy kizárólag űrlapokra épülő integráció ma láthatatlan a ChatGPT Work és a Codex számára.",{"type":117,"level":118,"id":94,"text":95},{"type":110,"content":253},[254],"A közzétett best practice útmutató szokatlanul előíró, és érdemes szó szerint követni. A gondolatmenet: az eszköz leírása olyan kód, amelyet egy valószínűségi olvasó minden munkamenetben egyszer értelmez. A karakterbüdzsék azért léteznek, hogy a teljes katalógus ezen olvasó figyelmén belül maradjon.",{"type":256,"head":257,"rows":262},"table",[258,260],[259],"Büdzsé",[261],"Ajánlott határ",[263,268,273,278],[264,266],[265],"Eszköz leírása",[267],"500 karakter",[269,271],[270],"Paraméter leírása",[272],"150 karakter",[274,276],[275],"Eszköznév és paraméternév",[277],"30 karakterenként",[279,281],[280],"Egy eszköz kimenete",[282],"1,5 KB karakter",{"type":110,"content":284},[285],"A táblázat feletti tanács a nehezebbik fel: egy funkció eszközönként, ne legyenek átfedő eszközök, és a regisztrálás kötődjön az oldal állapotához egy minden oldalon betöltött statikus katalógus helyett. Az átfedő eszközök a leggyakoribb okai annak, hogy az ügynök a rosszat választja.",{"type":132,"ordered":133,"items":287},[288,294,299,304,313],[289,293],{"tag":290,"children":291},"strong",[292],"Egy felelősség."," Egy funkció eszközönként, és ne legyen második eszköz, ami szinte ugyanezt teszi.",[295,298],{"tag":290,"children":296},[297],"Regisztrálás az aktuális állapothoz."," Szakítsd meg a controllert, amikor az útvonal vagy a dialógus változik, hogy az ügynök ne lásson már érvénytelen eszközöket.",[300,303],{"tag":290,"children":301},[302],"Fogadj nyers bemenetet."," Ha valaki azt mondja 11:00 és 15:00 között, vedd a stringet, és normalizáld kódban. Ne a modell számoljon.",[305,308,309,312],{"tag":290,"children":306},[307],"Olvasható enum értékek."," Az \"express\" jobb, mint a ",{"tag":123,"children":310},[311],"shipping_id = 1",", mert a modell az értéket olvassa, nem az adatbázisodat.",[314,317],{"tag":290,"children":315},[316],"Használható hibát adj vissza."," Írd le, mit kell tenni, nem azt, mi történt bent. Egy elbukó eszköznek is használhatónak kell maradnia.",{"type":117,"level":118,"id":97,"text":98},{"type":110,"content":320},[321],"Az annotációk a fő határvonal, amivel egy oldal szabályozhatja, hogyan bánnak a hosztok az eszközeivel, és mind a négy alapértelmezés szerint hamis. Ez a biztonságos alapértelmezés, de azt is jelenti, hogy egy eszköz biztonsági tulajdonságai annyira őszinték, amennyire az őket regisztráló oldal.",{"type":132,"ordered":133,"items":323},[324,329,334,339],[325,328],{"tag":123,"children":326},[327],"readOnlyHint"," az eszköz csak olvas, nem változtat semmit. Tedd rá minden kereső funkcióra.",[330,333],{"tag":123,"children":331},[332],"untrustedContentHint"," a visszatérési érték felhasználó által generált vagy külső adatot tartalmaz, és korlátozni kell, mielőtt eléri a modellt.",[335,338],{"tag":123,"children":336},[337],"consequentialHint"," a hívás foglal, fizet, küld vagy töröl. A kliensek megerősítést kényszeríthetnek ki vele.",[340,343],{"tag":123,"children":341},[342],"debugging"," Chrome 156-tól jelöli fejlesztői eszköznek, hogy az általános ügynökök kiszűrhessék.",{"type":110,"content":345},[346],"A Chrome biztonsági útmutatója a közvetett prompt injekciót megoldatlannak tekinti. A modellek valószínűségiek, dokumentáltak az agentikus rendszerek elleni ismételhető támadások, és egy eszköz visszatérési értéke olyan csatorna, amelyet egy támadó írhat. Az ajánlott mitigációk az annotációk, a karakterbüdzsék és az origin izoláció, vagyis kárcsökkentés, nem megoldás. Ugyanez az oldal megjegyzi, hogy egy host engedélyekkel rendelkező extension az oldalt WebMCP nélkül is tetszőleges JavaScripttel irányíthatja.",{"type":245,"variant":348,"title":349,"body":350},"warn","Az exposedTo az éles él",[351],[352,353,356],"Az ",{"tag":123,"children":354},[355],"exposedTo"," opció azokat a biztonságos origineket sorolja fel, amelyek felfedezhetik és futtathatják az eszközt, és az útmutató egyértelmű: egy read-only eszköz is kiszivárogtathat felhasználói adatot, az író eszköz pedig a felhasználó nevében jár el. Csak olyan origineket tegyél szabaddá, amelyeknek a hitelesítő adatokat is átadnád.",{"type":117,"level":118,"id":100,"text":101},{"type":110,"content":359},[360],"A gyengeségek jönnek először, mert ezek miatt ez figyelendő tétel, nem függőség. A támogatás gyakorlatilag egyetlen motorkészülékcsaládra korlátozódik. A specifikáció saját állapotfájlja origin trialt sorol fel a Chrome 149-ben és az Edge 150-ben, kísérleti támogatást a Brave Leo chatben, támogatást a ChatGPT Desktopban, valamint standards-position bejegyzéseket a Firefoxban és a WebKitben, implementáció nélkül. Emellett a Chrome dokumentációja a headless böngészős munkát a hatókörön kívül helyezi, figyelmeztet, hogy az összetett felületeket át kell alakítani az alkalmazás- és felületállapot szinkronban tartásához, és megjegyzi, hogy a klienseknek meg kell látogatniuk egy oldalt, hogy felfedezzék az eszközeit. Nincs nyilvántartás, nincs manifest, nincs index.",{"type":256,"head":362,"rows":370},[363,365,366,368],[364],"",[9],[367],"MCP-szerver",[369],"DOM-aktuálás",[371,380,389,398],[372,374,376,378],[373],"Életciklus",[375],"Tabhoz kötött, navigáláskor megszűnik",[377],"Folyamatos daemon",[379],"Egy kérés",[381,383,385,387],[382],"Lát",[384],"Élő DOM, sütik, session",[386],"Csak amit te kitálsz",[388],"Amit az ügynök lekapar",[390,392,394,396],[391],"Futtatja a kódodat",[393],"Igen, az oldalon belül",[395],"Nem, csak szerveroldalon",[397],"Nem",[399,401,403,405],[400],"Elérhető",[402],"Ma egy motorcsaládtól",[404],"Bármely MCP-kliensről",[406],"Bármely böngészőből",{"type":110,"content":408},[409],"A felfedezhetőségi pont megérdemli a kiemelést, mert lerombolja a szokásos üzleti érvelést. Egy backend MCP-szervert megtalálhat egy olyan ügynök is, amely soha nem látja az oldalt. Egy WebMCP eszközt nem. Az egyetlen reális felfedezési út ma egy felhasználó, aki megnyitja az oldalt. A WebMCP tehát egy már elkezdődött munkamenet minőségéért verseng, nem a hatókörért.",{"type":117,"level":118,"id":103,"text":104},{"type":110,"content":412},[413,414,419],"A WebMCP egy jól rajzolt API egy valós problémára, és jobban rajzolva, mint ahogy a legtöbb csapat maga megépítené. Még nem függőség. Építsd az eszközréteget feature check mögé, tartsd a emberi felületet elsődleges útként, és térj vissza, ha megjelenik a második motor, vagy ha a deklaratív fele már nem csak Chromium-egyedüli. A részletekhez az oldal ",{"tag":415,"to":416,"children":417},"link","\u002Fblog\u002Fwebmcp-agent-ready-website-guide",[418],"ügynékkészített weboldal deklarált eszközökkel"," című útmutatója ad részletes betekintést.",{"type":132,"ordered":199,"items":421},[422,424,426,428,430],[423],"Vedd fel termékfelületeken, ahol egy bejelentkezett felhasználó és egy ügynök ugyanazt az oldalt látja: foglalás, checkout, támogatási kérelmek, beállítások.",[425],"Hagyd ki az egyszerű olvasási feladatoknál. Az oldal Markdown-másolata olcsóbb, és nem is kell böngésző.",[427],"Hagyd ki, ha a folyamatid túlnyomórészt olyan űrlapok, amelyeket nem tudsz annotálni, vagy ha nem tudod szinkronban tartani a felületet az eszközúttal.",[429],"Ne építs MCP-szervert arra az elvárásra, hogy a WebMCP lecseréli. Különböző rétegek, és a hasznos architektúra mindkettőt használja.",[431],"A karakterbüdzséket és az egy-funkció-egy-eszköz szabályt kemény korlátnak kezeld a katalógusra, nem javaslatnak.",{"type":245,"variant":433,"title":434,"body":435},"tip","A legolcsóbb első kísérlet",[436],[437,438,440],"Vegyél egy meglévő gombkezelőt, csomagold be őszintén beállított annotációkkal a ",{"tag":123,"children":439},[142]," hívásba, és mérd meg, hogy az ügynök az eszközútat választja-e a kattintási út helyett. Ez az egyetlen mérés gyorsabban megválaszolja az adaptációs kérdést, mint a specifikáció olvasása.",{"type":117,"level":118,"id":106,"text":107},{"type":132,"ordered":199,"items":443},[444,448,451,454,457,460,463,466],[445],{"tag":446,"href":32,"children":447},"a",[31],[449],{"tag":446,"href":35,"children":450},[34],[452],{"tag":446,"href":38,"children":453},[37],[455],{"tag":446,"href":41,"children":456},[40],[458],{"tag":446,"href":44,"children":459},[43],[461],{"tag":446,"href":47,"children":462},[46],[464],{"tag":446,"href":23,"children":465},[49],[467],{"tag":446,"href":52,"children":468},[51],[470,545,601,674],{"slug":471,"published":472,"minutes":473,"category":7,"tags":474,"keywords":480,"about":492,"sources":501,"cover":538,"og":539,"expertise":540,"locales":541,"lang":59,"title":542,"description":543,"coverAlt":544},"schema-org-structured-data-b2b-shop","2026-10-17",10,[475,476,477,478,479],"Schema.org","Structured data","B2B e-commerce","Technical SEO","Nuxt",[481,482,483,484,485,486,487,488,489,490,491],"schema.org b2b shop","product structured data b2b","merchant listing structured data","product snippet vs merchant listing","unitpricespecification referencequantity","productgroup variants structured data","organization schema vatid","b2b prices behind login seo","json-ld nuxt schema org","merchant return policy structured data","mpn gtin structured data",[493,495,498],{"name":475,"url":494},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSchema.org",{"name":496,"url":497},"JSON-LD","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON-LD",{"name":499,"url":500},"Business-to-business","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBusiness-to-business",[502,505,508,511,514,517,520,523,526,529,532,535],{"title":503,"url":504},"Google Search Central: Introduction to Product structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct",{"title":506,"url":507},"Google Search Central: Merchant listing (Product, Offer) structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fmerchant-listing",{"title":509,"url":510},"Google Search Central: Product snippet structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-snippet",{"title":512,"url":513},"Google Search Central: Product variant structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fproduct-variants",{"title":515,"url":516},"Google Search Central: Organization structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Forganization",{"title":518,"url":519},"Google Search Central: Merchant return policy structured data","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Freturn-policy",{"title":521,"url":522},"Google Search Central: General structured data guidelines","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fsd-policies",{"title":524,"url":525},"Google Search Central: Generate structured data with JavaScript","https:\u002F\u002Fdevelopers.google.com\u002Fsearch\u002Fdocs\u002Fappearance\u002Fstructured-data\u002Fgenerate-structured-data-with-javascript",{"title":527,"url":528},"Schema.org: Offer","https:\u002F\u002Fschema.org\u002FOffer",{"title":530,"url":531},"Schema.org: UnitPriceSpecification","https:\u002F\u002Fschema.org\u002FUnitPriceSpecification",{"title":533,"url":534},"Unhead: Product schema (defineProduct)","https:\u002F\u002Funhead.unjs.io\u002Fdocs\u002Fschema-org\u002Fapi\u002Fschema\u002Fproduct",{"title":536,"url":537},"Nuxt SEO: Schema.org identity setup","https:\u002F\u002Fnuxtseo.com\u002Fdocs\u002Fschema-org\u002Fguides\u002Fsetup-identity","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fschema-org-structured-data-b2b-shop\u002Fog.jpg","b2b-ecommerce-developer",[57,58,59],"Schema.org strukturált adatok B2B webshopokhoz: bejelentkezés mögötti árak, egységek és változatok","Termék-markup B2B shopokhoz: snippet vagy kereskedői lista, melyik ár, cikkszámok, egységárak, változatok, Organization és SSR Nuxtban.","Terméktéglalap vékony kerettel, alsó kis mezőjét alacsony fal takarja el.",{"slug":546,"published":472,"minutes":547,"category":7,"tags":548,"keywords":553,"about":565,"sources":573,"cover":595,"og":596,"expertise":540,"locales":597,"lang":59,"title":598,"description":599,"coverAlt":600},"ai-assistant-b2b-shop-customer-support",9,[477,549,550,551,552],"AI assistant","Customer support","LLM agents","EU AI Act",[554,555,556,557,558,559,560,561,562,563,564],"ai assistant b2b shop","ai customer support b2b ecommerce","llm chatbot order status","ai agent customer service tools","chatbot liability air canada","klarna ai assistant results","human handoff chatbot design","eu ai act chatbot disclosure","owasp excessive agency","ai support resolution rate","b2b customer portal chatbot",[566,569,572],{"name":567,"url":568},"Customer service","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCustomer_service",{"name":570,"url":571},"Chatbot","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FChatbot",{"name":499,"url":500},[574,577,580,583,586,589,592],{"title":575,"url":576},"Klarna: AI assistant handles two-thirds of customer service chats in its first month (press release, 2024)","https:\u002F\u002Fwww.klarna.com\u002Finternational\u002Fpress\u002Fklarna-ai-assistant-handles-two-thirds-of-customer-service-chats-in-its-first-month\u002F",{"title":578,"url":579},"Entrepreneur: Klarna is hiring customer service agents again, according to its CEO (May 2025)","https:\u002F\u002Fwww.entrepreneur.com\u002Fbusiness-news\u002Fklarna-ceo-reverses-course-by-hiring-more-humans-not-ai\u002F491396",{"title":581,"url":582},"ABA Business Law Today: BC tribunal confirms companies remain liable for information provided by AI chatbot","https:\u002F\u002Fwww.americanbar.org\u002Fgroups\u002Fbusiness_law\u002Fresources\u002Fbusiness-law-today\u002F2024-february\u002Fbc-tribunal-confirms-companies-remain-liable-information-provided-ai-chatbot\u002F",{"title":584,"url":585},"OWASP GenAI Security Project: LLM06:2025 Excessive Agency","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm062025-excessive-agency\u002F",{"title":587,"url":588},"OWASP GenAI Security Project: LLM05:2025 Improper Output Handling","https:\u002F\u002Fgenai.owasp.org\u002Fllmrisk\u002Fllm052025-improper-output-handling\u002F",{"title":590,"url":591},"EU AI Act, Article 50: Transparency obligations","https:\u002F\u002Fartificialintelligenceact.eu\u002Farticle\u002F50\u002F",{"title":593,"url":594},"Intercom: Fin pricing and billable outcomes","https:\u002F\u002Ffin.ai\u002Fpricing","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fai-assistant-b2b-shop-customer-support\u002Fog.jpg",[57,58,59],"AI-asszisztens a B2B webshop ügyfélszolgálatához: eszközök, jogosultságok és átadás embernek","Hogyan építs AI ügyfélszolgálati asszisztenst B2B shophoz: mit automatizálj, eszközök ügyfélkontextusban, átadás embernek, AI Act és mérőszámok.","Magas fal keskeny réssel: nyíl halad át rajta a három négyzetből álló bekerített mezőbe, egy másik lefelé, egy tálca felé mutat.",{"slug":602,"published":472,"minutes":6,"category":7,"tags":603,"keywords":608,"about":620,"sources":630,"cover":667,"og":668,"expertise":669,"locales":670,"lang":59,"title":671,"description":672,"coverAlt":673},"vue-ai-chat-ui-streaming-accessibility",[604,479,605,606,607],"Vue","Accessibility","Streaming","AI chat",[609,610,611,612,613,614,615,616,617,618,619],"vue ai chat ui","nuxt llm streaming","sse vs fetch streaming","aria-live streaming text","accessible chat interface","abort fetch stream vue","dompurify markdown llm","role log chat","reduced motion chat ui","wcag 2.2 chat","screen reader streaming",[621,624,627],{"name":622,"url":623},"Web accessibility","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWeb_accessibility",{"name":625,"url":626},"Server-sent events","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",{"name":628,"url":629},"Vue.js","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FVue.js",[631,634,637,640,643,646,649,652,655,658,661,664],{"title":632,"url":633},"MDN: Using server-sent events","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FServer-sent_events\u002FUsing_server-sent_events",{"title":635,"url":636},"MDN: AbortController","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FAbortController",{"title":638,"url":639},"MDN: ReadableStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FReadableStream",{"title":641,"url":642},"MDN: TextDecoderStream","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAPI\u002FTextDecoderStream",{"title":644,"url":645},"MDN: ARIA log role","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FAccessibility\u002FARIA\u002FReference\u002FRoles\u002Flog_role",{"title":647,"url":648},"W3C: Understanding SC 4.1.3 Status Messages","https:\u002F\u002Fwww.w3.org\u002FWAI\u002FWCAG22\u002FUnderstanding\u002Fstatus-messages.html",{"title":650,"url":651},"W3C WAI: What's new in WCAG 2.2","https:\u002F\u002Fwww.w3.org\u002FWAI\u002Fstandards-guidelines\u002Fwcag\u002Fnew-in-22\u002F",{"title":653,"url":654},"MDN: prefers-reduced-motion","https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FCSS\u002F@media\u002Fprefers-reduced-motion",{"title":656,"url":657},"DOMPurify README","https:\u002F\u002Fgithub.com\u002Fcure53\u002FDOMPurify",{"title":659,"url":660},"markdown-it README","https:\u002F\u002Fgithub.com\u002Fmarkdown-it\u002Fmarkdown-it",{"title":662,"url":663},"AI SDK docs: useChat","https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fchatbot",{"title":665,"url":666},"Vue docs: nextTick","https:\u002F\u002Fvuejs.org\u002Fapi\u002Fgeneral.html#nexttick","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fvue-ai-chat-ui-streaming-accessibility\u002Fog.jpg","vue-nuxt-developer",[57,58,59],"AI-csevegő UI Vue-ban és Nuxtban: akadálymentes streaming","AI-csevegő Vue-ban vagy Nuxtban: fetch-stream, megszakítás és újrapróbálás, biztonságos markdown, aria-live bejelentések, billentyűzet és reduced motion.","Üzenetkártya villogó kurzorral, pontozott vonal hullámokká nyílik, mellette pipa.",{"slug":675,"published":472,"minutes":547,"category":7,"tags":676,"keywords":681,"about":693,"sources":703,"cover":736,"og":737,"expertise":669,"locales":738,"lang":59,"title":739,"description":740,"coverAlt":741},"llm-translation-pipeline-i18n",[677,678,679,604,680],"Translation","i18n","LLM","Localization",[682,683,684,685,686,687,688,689,690,691,692],"llm translation pipeline","icu messageformat placeholders","vue i18n llm translation","translation memory llm","glossary enforcement translation","german informal sie du","hungarian translation quality llm","structured output json translation","machine translation post-editing","locale file validation","cldr plural categories",[694,697,700],{"name":695,"url":696},"Internationalization and localization","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInternationalization_and_localization",{"name":698,"url":699},"ICU MessageFormat","https:\u002F\u002Funicode-org.github.io\u002Ficu\u002Fuserguide\u002Fformat_parse\u002Fmessages\u002F",{"name":701,"url":702},"Vue I18n","https:\u002F\u002Fvue-i18n.intlify.dev\u002F",[704,706,709,712,715,718,721,724,727,730,733],{"title":705,"url":699},"Unicode ICU User Guide: Formatting Messages",{"title":707,"url":708},"Vue I18n: Message Format Syntax","https:\u002F\u002Fvue-i18n.intlify.dev\u002Fguide\u002Fessentials\u002Fsyntax",{"title":710,"url":711},"Nuxt i18n: Getting started","https:\u002F\u002Fi18n.nuxtjs.org\u002Fdocs\u002Fgetting-started",{"title":713,"url":714},"Unicode CLDR: Plural rules","https:\u002F\u002Fcldr.unicode.org\u002Findex\u002Fcldr-spec\u002Fplural-rules",{"title":716,"url":717},"OpenAI: Structured outputs","https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Fguides\u002Fstructured-outputs",{"title":719,"url":720},"DeepL API: Glossaries","https:\u002F\u002Fdevelopers.deepl.com\u002Fdocs\u002Fapi-reference\u002Fglossaries",{"title":722,"url":723},"W3C: Localization vs. internationalization","https:\u002F\u002Fwww.w3.org\u002FInternational\u002Fquestions\u002Fqa-i18n",{"title":725,"url":726},"GNU gettext manual","https:\u002F\u002Fwww.gnu.org\u002Fsoftware\u002Fgettext\u002Fmanual\u002Fgettext.html",{"title":728,"url":729},"RFC 5646: Tags for Identifying Languages","https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc5646",{"title":731,"url":732},"Rat für deutsche Rechtschreibung","https:\u002F\u002Fwww.rechtschreibrat.com\u002F",{"title":734,"url":735},"Microsoft Writing Style Guide","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fstyle-guide\u002Fwelcome\u002F","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fllm-translation-pipeline-i18n\u002Fog.jpg",[57,58,59],"LLM-fordítási pipeline i18n-hez: glosszárium, helyőrzők és review","Termék- és weboldalszövegek fordítása LLM-mel úgy, hogy a helyőrzők, a többes szám és a hangnem épen maradjon: glosszárium, ICU üzenetek, QA-ellenőrzések.","Három forráskártya, egy lefordított kártya glosszárium-szalaggal, majd ellenőrzött tábla.",1792261155094]