[{"data":1,"prerenderedAt":700},["ShallowReactive",2],{"tool-webmcp-de":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":58,"title":60,"description":61,"coverAlt":62,"url":63,"pricing":64,"kind":65,"metaTitle":66,"takeaways":67,"faq":73,"toc":86,"blocks":111,"others":476},"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: Tools veröffentlichen statt Pixel ausliefern","WebMCP lässt eine Seite typisierte, aufrufbare Tools an einen Agenten im Browser publizieren. Was der Standard tut, wie viel heute ausgeliefert ist und wann ein MCP-Server die bessere Wahl bleibt.","Eine Seite registriert typisierte Tools im Browser, ein Browser-Agent ruft eines davon auf, und das Tool läuft in der Seite und aktualisiert deren Oberfläche.","https:\u002F\u002Fgithub.com\u002Fwebmcp","Emerging standard, open","Browser protocol","WebMCP: Tools statt Pixel veröffentlichen · Balázs Csorba",[68,69,70,71,72],"WebMCP ist ein API-Vorschlag für den Browser, keine Bibliothek: Chrome 149 und Edge 150 liefern ihn als Origin Trial, Firefox und Safari stehen bei der Standards-Position.","Tools sind an den Tab gebunden, laufen im Code der Seite selbst und werden über die tools-Permissions-Policy gesteuert, nicht durch ein Raten des Agenten im DOM.","Chromes Leitfaden begrenzt eine Tool-Beschreibung auf 500 Zeichen und die Ausgabe eines Tools auf 1,5 KB. Der Tool-Katalog ist also ein Budget im Kontextfenster.","Alle vier Tool-Annotationen stehen standardmäßig auf false. Die Sicherheitseigenschaften eines Tools sind also so ehrlich wie die Seite, die sie setzt.","Es gibt keinen Discovery-Mechanismus: Ein Client muss die Seite besuchen, um zu erfahren, dass es Tools gibt. Das ändert den geschäftlichen Wert des Standards.",[74,77,80,83],{"q":75,"a":76},"Was ist WebMCP?","WebMCP ist ein vorgeschlagener Webstandard, der es einer Seite erlaubt, typisierte, aufrufbare Tools an einen KI-Agenten im Browser zu publizieren. Die Seite registriert einen Namen, eine natürlichsprachliche Beschreibung, ein JSON Schema für die Eingabe und eine Execute-Funktion; der Browser vermittelt die Aufrufe zwischen Agent und Funktion. Die Tools leben nur so lange wie der geöffnete Tab.",{"q":78,"a":79},"Ist WebMCP ein Ersatz für MCP?","Nein. Chromes eigene Vergleichsseite behandelt beide als Partner, nicht als Rivalen: MCP exponiert Backend-Funktionen dauerhaft an jeden Client, WebMCP exponiert den Live-Zustand einer Seite ephemer an einen integrierten Browser-Agenten. In der Praxis landen die meisten Systeme bei beidem: MCP für die Fachlogik, WebMCP für die Oberfläche vor dem Nutzer.",{"q":81,"a":82},"Brauche ich das Chrome-Origin-Trial, um WebMCP lokal zu nutzen?","Nein. Für die lokale Entwicklung aktiviert das Flag chrome:\u002F\u002Fflags\u002F#enable-webmcp-testing die API ohne Token. Für echte Nutzer auf Chrome 149 oder neuer ist eine Registrierung für das Origin Trial nötig, Edge 150 hat ein eigenes Trial mit eigener Registrierung.",{"q":84,"a":85},"Was ist die größte Einschränkung heute?","Die Browser-Unterstützung, gefolgt von der Auffindbarkeit. Die Implementierungsstatus-Datei im Spezifikationsrepository nennt Origin Trials in Chrome und Edge, experimentelle Unterstützung in Braves Leo-Chat und Unterstützung in ChatGPT Desktop, und nichts Ausgeliefertes in Firefox oder Safari. Dazu kommt: Die API ist nicht für Headless-Browsing gedacht, und ein Client erfährt nur durch einen Besuch, dass eine Seite Tools anbietet.",[87,90,93,96,99,102,105,108],{"id":88,"title":89},"what-it-is","Was es ist",{"id":91,"title":92},"how-it-works","Wie es funktioniert",{"id":94,"title":95},"getting-started","Erste Schritte",{"id":97,"title":98},"tool-design","Tools, die Agenten auswählen",{"id":100,"title":101},"security","Sicherheit und Annotationen",{"id":103,"title":104},"where-it-shingles","Wo es zu kurz kommt",{"id":106,"title":107},"verdict","Urteil",{"id":109,"title":110},"sources","Quellen",[112,116,119,122,134,194,195,198,207,210,211,214,216,223,227,230,232,250,257,258,261,289,292,324,325,328,350,353,363,364,367,413,416,417,426,439,448,449],{"type":113,"content":114},"paragraph",[115],"WebMCP ist ein vorgeschlagener Webstandard, der es einer Seite erlaubt, typisierte, aufrufbare Tools an einen KI-Agenten zu publizieren, statt den Agenten die Absicht aus dem DOM erraten zu lassen. Der Vorschlag ist klein, die Browser-Unterstützung ist dünn, und die Designentscheidung ist die richtige. Behandle ihn als Spezifikation, die man verfolgt, und als progressive Enhancement hinter einer Feature Detection, nicht als Abhängigkeit für dieses Quartal.",{"type":113,"content":117},[118],"Er steht neben Model Context Protocol, nicht dagegen. Ein MCP-Server exponiert Backend-Funktionen an jeden Client, überall; WebMCP exponiert den Live-Zustand einer angemeldeten Seite im Tab an einen integrierten Browser-Agenten und verschwindet, wenn der Tab schließt. Die interessante technische Frage ist nicht, welches Protokoll gewinnt. Es ist, welches ohne zusätzlichen Server vorhandene Frontend-Logik erreichbar macht.",{"type":120,"level":121,"id":88,"text":89},"heading",2,{"type":113,"content":123},[124,125,129,130,133],"Die Spezifikation liegt in der W3C Web Machine Learning Community Group und ist im WebMCP-Explainer auf GitHub beschrieben, wo die Teams von Chrome und Edge die sichtbaren Implementierer sind. Chrome liefert sie ab Version 149 hinter einem Origin Trial, mit einem lokalen Entwicklungs-Flag unter ",{"tag":126,"children":127},"code",[128],"chrome:\u002F\u002Fflags\u002F#enable-webmcp-testing",". Die API ist ein Objekt auf ",{"tag":126,"children":131},[132],"Document",", und sie kommt in zwei Formen.",{"type":135,"ordered":136,"items":137},"list",false,[138,158,160,176,178,192],[139,142,143,146,147,146,150,153,154,157],{"tag":126,"children":140},[141],"document.modelContext"," stellt ",{"tag":126,"children":144},[145],"registerTool()",", ",{"tag":126,"children":148},[149],"getTools()",{"tag":126,"children":151},[152],"executeTool()"," und ein ",{"tag":126,"children":155},[156],"toolchange","-Event bereit.",[159],"Ein Tool besteht aus einem Namen, einer natürlichsprachlichen Beschreibung, einem JSON Schema für die Eingabe und einer Execute-Funktion, die in der Seite läuft.",[161,162,146,165,146,168,171,172,175],"Die deklarative API macht aus einem annotierten Formular ein Tool, über ",{"tag":126,"children":163},[164],"toolname",{"tag":126,"children":166},[167],"tooldescription",{"tag":126,"children":169},[170],"toolparamdescription"," und ",{"tag":126,"children":173},[174],"toolautosubmit",".",[177],"Tools sind ephemer. Sie existieren nur, solange die Seite geöffnet ist, und laufen mit deren Cookies und Session.",[179,180,183,184,187,188,191],"Beide APIs sind an die ",{"tag":126,"children":181},[182],"tools","-Permissions-Policy gebunden, die standardmäßig ",{"tag":126,"children":185},[186],"self"," ist. Cross-Origin-Iframes bleiben damit aus, solange der Host nicht ",{"tag":126,"children":189},[190],"allow=\"tools\""," setzt.",[193],"Tool-Metadaten liegen im Kontextfenster des Modells. Die Anzahl registrierter Tools ist damit ein Budget pro Seite und nicht nur eine Codefrage.",{"type":120,"level":121,"id":91,"text":92},{"type":113,"content":196},[197],"Registrieren ist ein Aufruf aus dem Seitenskript; der Aufruf selbst wird vom Browser zwischen Agent und Seite vermittelt. Der Browser gibt dem Agenten nie ein DOM-Handle. Er parst die Argumente, ruft deine Execute-Funktion auf und reicht den Rückgabewert als Tool-Ergebnis zurück. Das ist die ganze Ergonomie-Geschichte in einem Satz: Die Seite entscheidet, was aufrufbar ist, und der Browser entscheidet, wer es aufrufen darf.",{"type":199,"attrs":200,"inner":204,"caption":205},"diagram",{"viewBox":201,"role":202,"aria-labelledby":203},"0 0 720 320","img","wm-t wm-d","\u003Ctitle id=\"wm-t\">WebMCP tool lifecycle\u003C\u002Ftitle>\u003Cdesc id=\"wm-d\">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.\u003C\u002Fdesc>\u003Cdefs>\u003Cmarker id=\"ah-wm\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">\u003Cpath d=\"M0 0L10 5L0 10z\" class=\"d-head\" \u002F>\u003C\u002Fmarker>\u003C\u002Fdefs>\u003Crect x=\"20\" y=\"120\" width=\"160\" height=\"72\" rx=\"10\" class=\"d-box\" \u002F>\u003Ctext x=\"100\" y=\"150\" text-anchor=\"middle\" class=\"d-text\">your page\u003C\u002Ftext>\u003Ctext x=\"100\" y=\"172\" text-anchor=\"middle\" class=\"d-small\">registerTool()\u003C\u002Ftext>\u003Crect x=\"280\" y=\"120\" width=\"160\" height=\"72\" rx=\"10\" class=\"d-accent\" \u002F>\u003Ctext x=\"360\" y=\"150\" text-anchor=\"middle\" class=\"d-text\">model context\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"172\" text-anchor=\"middle\" class=\"d-small\">browser-mediated\u003C\u002Ftext>\u003Crect x=\"540\" y=\"40\" width=\"160\" height=\"72\" rx=\"10\" class=\"d-sky\" \u002F>\u003Ctext x=\"620\" y=\"70\" text-anchor=\"middle\" class=\"d-text\">agent\u003C\u002Ftext>\u003Ctext x=\"620\" y=\"92\" text-anchor=\"middle\" class=\"d-small\">getTools()\u003C\u002Ftext>\u003Crect x=\"540\" y=\"200\" width=\"160\" height=\"72\" rx=\"10\" class=\"d-gold\" \u002F>\u003Ctext x=\"620\" y=\"230\" text-anchor=\"middle\" class=\"d-text\">execute()\u003C\u002Ftext>\u003Ctext x=\"620\" y=\"252\" text-anchor=\"middle\" class=\"d-small\">your app logic\u003C\u002Ftext>\u003Crect x=\"280\" y=\"230\" width=\"160\" height=\"72\" rx=\"10\" class=\"d-mint\" \u002F>\u003Ctext x=\"360\" y=\"260\" text-anchor=\"middle\" class=\"d-text\">DOM and state\u003C\u002Ftext>\u003Ctext x=\"360\" y=\"282\" text-anchor=\"middle\" class=\"d-small\">same session\u003C\u002Ftext>\u003Cpath d=\"M180 156H278\" class=\"d-line\" marker-end=\"url(#ah-wm)\" \u002F>\u003Cpath d=\"M360 120V76H538\" class=\"d-line\" marker-end=\"url(#ah-wm)\" \u002F>\u003Ctext x=\"450\" y=\"66\" text-anchor=\"middle\" class=\"d-label\">2 discover\u003C\u002Ftext>\u003Ctext x=\"228\" y=\"146\" text-anchor=\"middle\" class=\"d-label\">1 register\u003C\u002Ftext>\u003Cpath d=\"M620 112V198\" class=\"d-line-accent\" marker-end=\"url(#ah-wm)\" \u002F>\u003Ctext x=\"640\" y=\"160\" class=\"d-label\">3 invoke\u003C\u002Ftext>\u003Cpath d=\"M540 236H442\" class=\"d-line\" marker-end=\"url(#ah-wm)\" \u002F>\u003Ctext x=\"490\" y=\"226\" text-anchor=\"middle\" class=\"d-label\">4 update\u003C\u002Ftext>\u003Cpath d=\"M360 230V196\" class=\"d-line\" marker-end=\"url(#ah-wm)\" \u002F>\u003Ctext x=\"374\" y=\"218\" class=\"d-label\">5 result\u003C\u002Ftext>",[206],"Der Browser sitzt zwischen Agent und Seite. Nichts anderes in der Schleife kann diese Grenze erweitern.",{"type":113,"content":208},[209],"Der praktische Unterschied zur Aktuierung zeigt sich im Fehlerpfad. Ein Klick auf ein falsch gerendertes Element scheitert still oder löst den falschen Handler aus. Ein Tool-Aufruf mit einem schlechten Argument trifft deine eigene Validierung und liefert eine Meldung, die das Modell lesen und darauf reagieren kann. Chromes Leitfaden sagt das ausdrücklich und empfiehlt, im Code streng zu validieren, das Schema aber locker zu halten, weil eine Schema-Ablehnung eine Sackgasse für den Agenten ist.",{"type":120,"level":121,"id":94,"text":95},{"type":113,"content":212},[213],"Die imperative API ist die richtige Wahl, weil nur sie Anwendungszustand erreichen kann. Ein minimales Read-only-Tool sieht so aus.",{"type":126,"code":215},"\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":113,"content":217},[218,219,222],"Drei Details sind wichtiger als der Rest. Die Beschreibung ist das Einzige, was das Modell liest, um zu entscheiden, ob es das Tool aufruft, und Chromes Leitfaden begrenzt sie auf 500 Zeichen. Die Execute-Funktion sollte die Funktion wiederverwenden, die der sichtbare Button schon aufruft, damit es einen Codepfad gibt und Oberfläche und Tool nicht auseinanderlaufen können. Das ",{"tag":126,"children":220},[221],"AbortSignal"," ist der Weg zum Abmelden, kein Timeout.",{"type":120,"level":224,"id":225,"text":226},3,"declarative-forms","Deklarative Formulare",{"type":113,"content":228},[229],"Die deklarative API ist für einfache Formulare und nichts sonst. Ein Formularelement annotieren, und der Browser leitet die Tool-Definition aus dem Markup und den Feldnamen ab.",{"type":126,"code":231},"\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":113,"content":233},[234,235,237,238,241,242,245,246,249],"Ohne ",{"tag":126,"children":236},[174]," füllt der Agent das Formular und der Mensch klickt auf Absenden. Das ist die richtige Voreinstellung für alles, was Kosten verursacht. Mit dem Attribut sendet und navigiert der Browser, und ",{"tag":126,"children":239},[240],"respondWith()"," auf dem ",{"tag":126,"children":243},[244],"SubmitEvent"," erlaubt der Seite, stattdessen ein Ergebnis an das Modell zurückzugeben. Das Flag ",{"tag":126,"children":247},[248],"agentInvoked"," sagt der Seite, welcher der beiden Wege gerade läuft.",{"type":251,"variant":252,"title":253,"body":254},"callout","note","Die günstige Hälfte des Standards",[255],[256],"Die deklarative API erreicht keine reine JavaScript-Funktion, weil in der Tool-Definition kein JavaScript steckt. OpenAIs Dokumentation zu den Site-Tools hält fest, dass der eingebaute Browser die deklarative API gar nicht implementiert. Eine reine Formular-Integration ist für ChatGPT Work und Codex heute also unsichtbar.",{"type":120,"level":121,"id":97,"text":98},{"type":113,"content":259},[260],"Der veröffentlichte Best-Practice-Leitfaden ist ungewöhnlich konkret, und es lohnt sich, ihm wörtlich zu folgen. Die Leitidee: Eine Tool-Beschreibung ist Code, den ein probabilistischer Leser einmal pro Sitzung interpretieren muss. Die Zeichenbudgets existieren, damit der gesamte Katalog in der Aufmerksamkeit dieses Lesers bleibt.",{"type":262,"head":263,"rows":268},"table",[264,266],[265],"Budget",[267],"Empfohlene Grenze",[269,274,279,284],[270,272],[271],"Tool-Beschreibung",[273],"500 Zeichen",[275,277],[276],"Parameter-Beschreibung",[278],"150 Zeichen",[280,282],[281],"Tool-Name und Parameter-Name",[283],"je 30 Zeichen",[285,287],[286],"Ausgabe eines Tools",[288],"1,5 KB Zeichen",{"type":113,"content":290},[291],"Der Rat oberhalb der Tabelle ist der schwierigere Teil: eine Funktion pro Tool, keine Überschneidungen, und Registrierung passend zum Seitenzustand statt eines statischen Katalogs auf jeder Seite. Überschneidende Tools sind der häufigste Grund, warum ein Agent das falsche wählt.",{"type":135,"ordered":136,"items":293},[294,300,305,310,319],[295,299],{"tag":296,"children":297},"strong",[298],"Eine Verantwortung."," Eine Funktion pro Tool und kein zweites Tool, das fast dasselbe tut.",[301,304],{"tag":296,"children":302},[303],"Für den aktuellen Zustand registrieren."," Den Controller abbrechen, wenn sich Route oder Dialog ändert, damit der Agent keine Tools mehr sieht, die nicht mehr gelten.",[306,309],{"tag":296,"children":307},[308],"Roheingaben akzeptieren."," Wenn jemand 11:00 to 15:00 sagt, nimm den String und normalisiere ihn im Code. Das Modell soll nicht rechnen.",[311,314,315,318],{"tag":296,"children":312},[313],"Lesbare Enum-Werte."," \"express\" ist besser als ",{"tag":126,"children":316},[317],"shipping_id = 1",", denn das Modell liest den Wert und nicht deine Datenbank.",[320,323],{"tag":296,"children":321},[322],"Handlungsfähige Fehler zurückgeben."," Sag, was zu tun ist, nicht was intern kaputtging. Auch ein fehlgeschlagenes Tool sollte nutzbar bleiben.",{"type":120,"level":121,"id":100,"text":101},{"type":113,"content":326},[327],"Annotationen sind der wichtigste Hebel, den eine Seite hat, um zu steuern, wie ein Host ihre Tools behandelt, und alle vier stehen standardmäßig auf false. Das ist die sichere Voreinstellung, bedeutet aber: Die Sicherheitseigenschaften eines Tools sind genau so ehrlich wie die Seite, die es registriert.",{"type":135,"ordered":136,"items":329},[330,335,340,345],[331,334],{"tag":126,"children":332},[333],"readOnlyHint"," das Tool liest und ändert nichts. Bei jeder Lookup-Funktion setzen.",[336,339],{"tag":126,"children":337},[338],"untrustedContentHint"," der Rückgabewert enthält nutzergenerierte oder extern bezogene Daten und muss begrenzt werden, bevor er das Modell erreicht.",[341,344],{"tag":126,"children":342},[343],"consequentialHint"," der Aufruf bucht, zahlt, sendet oder löscht. Clients können damit eine Bestätigung erzwingen.",[346,349],{"tag":126,"children":347},[348],"debugging"," ab Chrome 156 markiert das ein Entwickler-Tool, damit allgemeine Agenten es herausfiltern können.",{"type":113,"content":351},[352],"Chromes Sicherheitsleitfaden behandelt indirekte Prompt Injection als ungelöst. Modelle sind probabilistisch, wiederholbare Angriffe auf agentische Systeme sind dokumentiert, und der Rückgabewert eines Tools ist ein Kanal, den ein Angreifer beschreiben kann. Empfohlen werden Annotationen, Zeichenbudgets und Origin-Isolation, also Schadensbegrenzung und keine Lösung. Dieselbe Seite weist darauf hin, dass eine Extension mit Host-Berechtigungen die Seite auch ohne WebMCP bereits mit beliebigem JavaScript steuern kann.",{"type":251,"variant":354,"title":355,"body":356},"warn","exposedTo ist die scharfe Kante",[357],[358,359,362],"Die Option ",{"tag":126,"children":360},[361],"exposedTo"," listet sichere Origins, die ein Tool finden und ausführen dürfen, und der Leitfaden ist deutlich: Ein Read-only-Tool kann Nutzerdaten preisgeben, ein schreibendes Tool handelt im Namen des Nutzers. Gib nur Origins frei, denen du auch die Zugangsdaten geben würdest.",{"type":120,"level":121,"id":103,"text":104},{"type":113,"content":365},[366],"Die Schwächen kommen zuerst, weil sie der Grund sind, warum das hier ein Beobachtungsposten und keine Abhängigkeit ist. Die Unterstützung ist faktisch eine Engine-Familie. Die Statusdatei der Spezifikation nennt ein Origin Trial in Chrome 149 und Edge 150, experimentelle Unterstützung in Braves Leo-Chat, Unterstützung in ChatGPT Desktop sowie Standards-Position-Einträge in Firefox und WebKit ohne Implementierung dahinter. Chrome dokumentiert außerdem Headless-Browsing als außerhalb des Anwendungsbereichs, warnt davor, dass komplexe Oberflächen eine Umstrukturierung brauchen, um Anwendungs- und Oberflächenzustand synchron zu halten, und weist darauf hin, dass Clients eine Seite besuchen müssen, um ihre Tools zu entdecken. Es gibt kein Register, kein Manifest und keinen Index.",{"type":262,"head":368,"rows":376},[369,371,372,374],[370],"",[9],[373],"MCP-Server",[375],"DOM-Aktuierung",[377,386,395,404],[378,380,382,384],[379],"Lebenszyklus",[381],"An den Tab gebunden, weg beim Navigieren",[383],"Dauerhafter Daemon",[385],"Ein Request",[387,389,391,393],[388],"Sieht",[390],"Live-DOM, Cookies, Session",[392],"Nur das, was du exponierst",[394],"Was der Agent abgreift",[396,398,400,402],[397],"Führt deinen Code aus",[399],"Ja, in der Seite",[401],"Nein, nur serverseitig",[403],"Nein",[405,407,409,411],[406],"Erreichbar von",[408],"Heute eine Engine-Familie",[410],"Jedem MCP-Client",[412],"Jedem Browser",{"type":113,"content":414},[415],"Der Punkt zur Auffindbarkeit verdient Betonung, weil er das übliche Geschäftsargument zerschlägt. Ein Backend-MCP-Server kann von einem Agenten gefunden werden, der die Seite nie besucht. Ein WebMCP-Tool nicht. Der einzige realistische Discovery-Pfad heute ist ein Nutzer, der die Seite öffnet. WebMCP konkurriert damit um die Qualität einer bereits begonnenen Sitzung, nicht um Reichweite.",{"type":120,"level":121,"id":106,"text":107},{"type":113,"content":418},[419,420,425],"WebMCP ist eine sauber gezeichnete API für ein reales Problem, und besser gezeichnet, als die meisten Teams sie selbst gebaut hätten. Es ist noch keine Abhängigkeit. Baue die Tool-Schicht hinter eine Feature-Prüfung, lass die menschliche Oberfläche der Hauptpfad bleiben und schau wieder vorbei, wenn eine zweite Engine ausgeliefert wird oder die deklarative Hälfte nicht mehr Chromium-only ist. Für die Mechanik einer agentenfähigen Seite hat der Leitfaden des Sites zum ",{"tag":421,"to":422,"children":423},"link","\u002Fblog\u002Fwebmcp-agent-ready-website-guide",[424],"agentenfähigen Webaufbau mit deklarierten Tools"," die Implementierungsdetails im Detail.",{"type":135,"ordered":427,"items":428},true,[429,431,433,435,437],[430],"Nutze es auf Produktflächen, auf denen ein angemeldeter Nutzer und ein Agent dieselbe Seite sehen: Buchung, Checkout, Support-Anfragen, Einstellungen.",[432],"Lass es weg bei reinen Lese-Anwendungsfällen. Eine Markdown-Kopie der Seite ist billiger und braucht keinen Browser.",[434],"Lass es weg, wenn deine Abläufe überwiegend Formulare sind, die du nicht annotieren kannst, oder wenn du die Oberfläche nicht mit dem Tool-Pfad synchron halten kannst.",[436],"Baue keinen MCP-Server in der Erwartung, dass WebMCP ihn ersetzt. Beide sind verschiedene Schichten, und die nützliche Architektur nutzt beides.",[438],"Behandle die Zeichenbudgets und die Ein-Funktion-pro-Tool-Regel als harte Grenzen für den Katalog, nicht als Vorschläge.",{"type":251,"variant":440,"title":441,"body":442},"tip","Das billigste erste Experiment",[443],[444,445,447],"Nimm einen bestehenden Button-Handler, packe ihn mit ehrlich gesetzten Annotationen in ",{"tag":126,"children":446},[145]," und messe, ob der Agent den Tool-Pfad statt des Klick-Pfads nimmt. Diese eine Messung beantwortet die Adoptionsfrage schneller als jede Spezifikationslektüre.",{"type":120,"level":121,"id":109,"text":110},{"type":135,"ordered":427,"items":450},[451,455,458,461,464,467,470,473],[452],{"tag":453,"href":32,"children":454},"a",[31],[456],{"tag":453,"href":35,"children":457},[34],[459],{"tag":453,"href":38,"children":460},[37],[462],{"tag":453,"href":41,"children":463},[40],[465],{"tag":453,"href":44,"children":466},[43],[468],{"tag":453,"href":47,"children":469},[46],[471],{"tag":453,"href":23,"children":472},[49],[474],{"tag":453,"href":52,"children":475},[51],[477,534,581,635],{"slug":478,"published":5,"minutes":479,"category":7,"tags":480,"keywords":485,"about":493,"sources":497,"cover":527,"og":528,"expertise":55,"locales":529,"lang":58,"title":530,"description":531,"coverAlt":532,"url":496,"pricing":533,"kind":481},"browserbase-stagehand",10,[481,482,483,484,13],"Browser automation","Web agents","Headless browsers","Playwright",[486,487,488,489,490,491,492],"browserbase","stagehand","stagehand vs playwright","browserbase pricing","ai web agent framework","headless browser api","browserbase alternatives",[494],{"name":495,"url":496},"Browserbase","https:\u002F\u002Fwww.browserbase.com",[498,501,504,507,510,513,516,519,522,525],{"title":499,"url":500},"Browserbase pricing","https:\u002F\u002Fwww.browserbase.com\u002Fpricing",{"title":502,"url":503},"Browserbase plans and pricing docs","https:\u002F\u002Fdocs.browserbase.com\u002Fguides\u002Fplans-and-pricing",{"title":505,"url":506},"Stagehand documentation","https:\u002F\u002Fdocs.stagehand.dev\u002F",{"title":508,"url":509},"Stagehand quickstart","https:\u002F\u002Fdocs.stagehand.dev\u002Fv4\u002Ffirst-steps\u002Fquickstart",{"title":511,"url":512},"Stagehand v4 announcement","https:\u002F\u002Fwww.browserbase.com\u002Fblog\u002Fstagehand-v4",{"title":514,"url":515},"Stagehand repository","https:\u002F\u002Fgithub.com\u002Fbrowserbase\u002Fstagehand",{"title":517,"url":518},"Browser Use comparison of the two vendors","https:\u002F\u002Fbrowser-use.com\u002Fposts\u002Fbrowser-use-vs-browserbase",{"title":520,"url":521},"Browser Use pricing","https:\u002F\u002Fwww.browser-use.com\u002Fpricing",{"title":523,"url":524},"Skyvern pricing","https:\u002F\u002Fskyvern.com\u002Fpricing",{"title":484,"url":526},"https:\u002F\u002Fplaywright.dev\u002F","\u002Fimages\u002Fblog\u002Fbrowserbase-stagehand\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fbrowserbase-stagehand\u002Fog.jpg",[57,58,59],"Browserbase und Stagehand im Test: gemietetes Chrome für KI-Agenten","Browserbase vermietet verwaltetes Chrome pro Minute, Stagehand legt Natural-Language-Schritte obendrauf. Was es kostet, wo die Zähler laufen und wann Playwright gewinnt.","Abstrakte Pipeline-Grafik für die Browserbase- und Stagehand-Bewertung","From $20 per month · OSS library free",{"slug":535,"published":536,"minutes":479,"category":7,"tags":537,"keywords":540,"about":548,"sources":552,"cover":574,"og":575,"expertise":55,"locales":576,"lang":58,"title":577,"description":578,"coverAlt":579,"url":550,"pricing":580,"kind":481},"playwright","2026-05-27",[538,481,13,539],"End-to-end testing","Cross-browser",[535,541,542,543,544,545,546,547],"playwright vs selenium","playwright mcp","browser automation testing","playwright test runner","playwright for ai agents","playwright vs cypress","playwright cloud pricing",[549,551],{"name":484,"url":550},"https:\u002F\u002Fplaywright.dev",{"name":25,"url":26},[553,556,559,562,565,568,571],{"title":554,"url":555},"Playwright documentation: installation","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fintro",{"title":557,"url":558},"Playwright MCP introduction","https:\u002F\u002Fplaywright.dev\u002Fmcp\u002Fintroduction",{"title":560,"url":561},"Playwright CLI introduction","https:\u002F\u002Fplaywright.dev\u002Fagent-cli\u002Fintroduction",{"title":563,"url":564},"Playwright Test agents","https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Ftest-agents",{"title":566,"url":567},"npm package metadata for @playwright\u002Ftest","https:\u002F\u002Fregistry.npmjs.org\u002F@playwright\u002Ftest\u002Flatest",{"title":569,"url":570},"Microsoft Learn: Playwright Workspaces free trial","https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fapp-testing\u002Fplaywright-workspaces\u002Fhow-to-try-playwright-workspaces-free",{"title":572,"url":573},"Azure App Testing pricing","https:\u002F\u002Fazure.microsoft.com\u002Fen-us\u002Fpricing\u002Fdetails\u002Fapp-testing\u002F","\u002Fimages\u002Fblog\u002Fplaywright\u002Fcover.webp","\u002Fimages\u002Fblog\u002Fplaywright\u002Fog.jpg",[57,58,59],"Playwright: eine Browser-API für Tests, Skripte und Agents","Playwright steuert Chromium, Firefox und WebKit über eine Apache-2.0-API: Test-Runner, agent-taugliche CLI und MCP-Server. Was es kostet und wo es hapert.","Ein Playwright-Testlauf: eine Spec-Datei, ein Runner mit drei Browser-Engines und ein Agent, der Accessibility-Snapshots liest.","Apache-2.0 · cloud paid",{"slug":582,"published":536,"minutes":479,"category":7,"tags":583,"keywords":588,"about":595,"sources":602,"cover":626,"og":627,"expertise":55,"locales":628,"lang":58,"title":629,"description":630,"coverAlt":631,"url":632,"pricing":633,"kind":634},"elevenlabs",[584,585,586,587],"Text to speech","Voice API","Speech to text","Voice cloning",[582,589,590,591,592,593,594],"elevenlabs api pricing","elevenlabs vs openai tts","text to speech api comparison","elevenlabs flash latency","voice cloning api","eleven v4 model",[596,599],{"name":597,"url":598},"ElevenLabs","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElevenLabs",{"name":600,"url":601},"Speech synthesis","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSpeech_synthesis",[603,606,609,612,615,617,620,623],{"title":604,"url":605},"ElevenLabs pricing: plans and credits","https:\u002F\u002Felevenlabs.io\u002Fpricing",{"title":607,"url":608},"ElevenAPI pricing: per-product rates","https:\u002F\u002Felevenlabs.io\u002Fpricing\u002Fapi",{"title":610,"url":611},"ElevenLabs documentation: models","https:\u002F\u002Felevenlabs.io\u002Fdocs\u002Fmodels",{"title":613,"url":614},"API reference: create speech","https:\u002F\u002Felevenlabs.io\u002Fdocs\u002Fapi-reference\u002Ftext-to-speech\u002Fconvert",{"title":616,"url":598},"Wikipedia: ElevenLabs",{"title":618,"url":619},"Amazon Polly pricing","https:\u002F\u002Faws.amazon.com\u002Fpolly\u002Fpricing\u002F",{"title":621,"url":622},"OpenAI API pricing","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fpricing",{"title":624,"url":625},"SILMA AI: text to speech price comparison, August 2026","https:\u002F\u002Fsilma.ai\u002Fblog\u002Ftext-to-speech-price-comparison-august-2026","\u002Fimages\u002Fblog\u002Felevenlabs\u002Fcover.webp","\u002Fimages\u002Fblog\u002Felevenlabs\u002Fog.jpg",[57,58,59],"ElevenLabs: Sprachsynthese als API","Ein Review der ElevenLabs-Audio-API: Modellpalette, Latenzangaben, Guthaben- und Zeichenpreise, formatabhängige Stufen, und wo OpenAI und Amazon Polly besser sind.","ElevenLabs-Covermotiv mit Beschriftungen einer Sprach-API-Pipeline","https:\u002F\u002Felevenlabs.io","Free tier · from $5 per month","Voice and audio API",{"slug":636,"published":637,"minutes":479,"category":7,"tags":638,"keywords":644,"about":653,"sources":660,"cover":691,"og":692,"expertise":55,"locales":693,"lang":58,"title":694,"description":695,"coverAlt":696,"url":697,"pricing":698,"kind":699},"replicate","2026-05-22",[639,640,641,642,643],"Model hosting","Serverless GPU","Diffusion","Async jobs","Webhooks",[645,646,647,648,649,650,651,652],"replicate api","replicate vs fal.ai","serverless gpu inference pricing","replicate webhooks","replicate cold start","replicate vs baseten","how to run an open source model in production","replicate prediction api",[654,657],{"name":655,"url":656},"Replicate","https:\u002F\u002Freplicate.com\u002Fdocs",{"name":658,"url":659},"Serverless computing","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServerless_computing",[661,664,667,670,673,676,679,682,685,688],{"title":662,"url":663},"Replicate pricing","https:\u002F\u002Freplicate.com\u002Fpricing",{"title":665,"url":666},"Replicate docs: About predictions","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions",{"title":668,"url":669},"Replicate docs: Create a prediction","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Fcreate-a-prediction",{"title":671,"url":672},"Replicate docs: Prediction lifecycle","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Flifecycle",{"title":674,"url":675},"Replicate docs: Rate limits","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Frate-limits",{"title":677,"url":678},"Replicate docs: Data retention","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fpredictions\u002Fdata-retention",{"title":680,"url":681},"Replicate docs: Verify webhooks","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fwebhooks\u002Fverify-webhook",{"title":683,"url":684},"Replicate docs: Official models","https:\u002F\u002Freplicate.com\u002Fdocs\u002Ftopics\u002Fmodels\u002Fofficial-models",{"title":686,"url":687},"fal.ai pricing","https:\u002F\u002Ffal.ai\u002Fpricing",{"title":689,"url":690},"Baseten pricing","https:\u002F\u002Fwww.baseten.co\u002Fpricing\u002F","\u002Fimages\u002Fblog\u002Freplicate\u002Fcover.webp","\u002Fimages\u002Fblog\u002Freplicate\u002Fog.jpg",[57,58,59],"Replicate im Test: eine Modell-API pro Sekunde abgerechnet, mit allen scharfen Kanten benannt","Replicate stellt tausende offene Modelle hinter eine Prediction-API und rechnet pro Sekunde Rechenzeit ab. Ein Test zu Cold Boots, Versionsdrift und der Löschung nach einer Stunde.","Ein Request läuft von starting über processing in einen von vier Endzuständen: succeeded, failed, canceled oder aborted.","https:\u002F\u002Freplicate.com","Pay per second of compute","Model hosting API",1791383550493]