{"slug": "the-road-to-the-agentic-browser-a-kitesurf-update", "title": "The road to the agentic browser: A Kitesurf update", "summary": "Cloudflare announced that Kitesurf, its agent-focused browser that runs entirely on Cloudflare Workers, now supports WebMCP, letting agents call site functions such as searchFlights() instead of simulating clicks. The update also adds URL-based module resolution, JSON modules and import map handling, backed by Cloudflare's new Workers module registry, and improves iframe loading, isolation and multilingual text rendering. Developers can test WebMCP support in Cloudflare's public Kitesurf playground by opening Cloudflare Radar and viewing the WebMCP tools in the DevTools Application tab.", "body_md": "# The road to the agentic browser: A Kitesurf update\n\nIn August, we introduced Kitesurf, a browser for the agentic age that runs entirely on Cloudflare Workers.  We built it around what agents need from the web, rather than carrying all the features and bloat of a browser designed for humans. If this is the first you’re hearing about it, we highly recommend you read the blog post [__where we introduced Kitesurf__](https://blog.cloudflare.com/kitesurf/), for all the juicy technical details of how we did it.\n\nSince then, we’ve put Kitesurf through increasingly realistic tasks and used internal and external feedback from customers to make it more capable and more efficient. Here’s what has changed, how you can try it today, and where we’re going next.\n\n## WebMCP support\n\nWebsites were not built for agents to use. Browsing today is a messy process of clicking pixels and hoping the right element loads. In a programmatic world this is slow and fragile. [__WebMCP__](https://developer.chrome.com/docs/ai/webmcp) helps by allowing developers to expose site functionality directly to agents, where they can call functions like **searchFlights()** instead of simulating clicks.\n\nCloudflare has been supporting WebMCP since its early days; just a few weeks ago we announced that site owners can now turn on WebMCP [__with one switch__](https://blog.cloudflare.com/webmcp/), so browser agents can discover and use tools on their sites without changing the site’s code, and Browser Run has been [__supporting WebMCP__](https://developers.cloudflare.com/browser-run/features/webmcp/) when using Chrome [__beta__](https://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/) for some time now.\n\nToday we are announcing that Kitesurf now supports WebMCP.\n\nYou can test this by going to our public [__Kitesurf playground__](https://kitesurf.cloudflare.app?url=https://radar.cloudflare.com/), opening Cloudflare Radar, and navigating to WebMCP on the Application tab in the DevTools panel. As you can see, Radar [__exposes__](https://developers.cloudflare.com/changelog/post/2026-08-07-radar-researcher-and-webmcp/) a list of WebMCP tools like **navigate-to** or **set-location** which allow clients to interact with the page and explore Radar programmatically.\n\nIf you target Kitesurf with your AI Agent:\n\n```\n{\n  \"mcp\": {\n    \"kitesurf\": {\n      \"type\": \"local\",\n      \"command\": [\n        \"npx\",\n        \"-y\",\n        \"chrome-devtools-mcp@latest\",\n        \"--wsEndpoint=wss://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/browser-run/devtools/browser?browser=kitesurf\",\n        \"--wsHeaders={\\\"Authorization\\\":\\\"Bearer <BEARER_TOKEN>\\\"}\",\n        \"--category-experimental-webmcp\"\n      ],\n      \"enabled\": true\n    }\n  }\n}\n```\n\nYou can see that the AI model can interact with the exposed WebMCP tools which you can use to complete tasks more reliably.\n\nYou can read more about how to use WebMCP with Kitesurf and Browser Run [__here__](https://developers.cloudflare.com/browser-run/features/webmcp/).\n\n## New APIs, better WPT coverage\n\nSince the initial announcement, we’ve been adding more browser standards so that agents can render more sophisticated pages. The list of the APIs that Kitesurf supports has grown, and now includes:\n\nWe added [__URL-based module resolution__](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules), [__JSON modules__](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import), and [__import map__](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/script/type/importmap) handling—important for sites that load JavaScript in chunks. Additionally we are using the new [__Cloudflare Workers’ module registry__](https://blog.cloudflare.com/workers-module-registry-nodejs/) to support imports from URLs.\n\nIframe behavior has improved as well; now they load at the right time, stay better isolated, and display text correctly across more languages and encodings.\n\nAs we said at launch, running tests is how we keep the quality of both code and results under control without losing velocity while improving Kitesurf. [__Web Platform Tests (WPT)__](https://github.com/web-platform-tests/wpt) is a shared, open-source test suite that checks whether browsers implement web standards consistently.\n\nWe now pass 730,000+ [__WPT subtests__](https://github.com/web-platform-tests/wpt) and are growing. That’s 500,000 more subtests than when we launched. Here you can see the evolution over time, up to the latest version since we started the project:\n\n## Efficiency optimized for agents\n\nFor an AI agent, efficiency isn’t so much about loading pages fast, but about the latency of the agentic loop. To make Kitesurf truly agentic, we’ve aggressively optimized the browser engine’s internals so that every DOM traversal, timer, and font fetch is as lightweight as possible, ensuring the agent spends its compute cycles on reasoning, not waiting for the browser to catch up.\n\nThese optimizations include:\n\n- Improved JavaScript execution with less work crossing between [__Boa__](https://boajs.dev/) and the DOM, making the boundary more compatible with real Web frameworks. Common reads such as**getAttribute** ,**id** , and**parentNode** can now be answered inside the Wasm DOM instead of making repeated Boa → JavaScript shim → Wasm trips.\n- Kitesurf does less repeated work when running timers and loading scripts, and releases memory from objects it no longer needs. It also handles objects and classes more consistently when code moves between its two JavaScript engines, resulting in running busy pages more efficiently.\n- Kitesurf now loads fonts when they’re needed, fetches fewer fonts a page won’t use, checks which characters appear on the page before fetching language-specific font files and renders synthetic italics more faithfully.\n\nTogether, these optimizations help keep Kitesurf efficient for agents. Despite adding support for more web standards—and bringing Kitesurf closer to the capabilities of full-featured browsers like Chrome—its wall-clock time and CPU usage remain roughly in line with our launch benchmarks, and in some cases they have improved.\n\n## Plays better with Browser Run\n\n[__Browser Run__](https://developers.cloudflare.com/browser-run/) is our developer platform product that lets you programmatically control and run headless browser instances. When you use this API, you can select from a list of browser flavors we support, including Kitesurf.\n\nThis means that we have to make sure that all of our browsers are supported across the API surface. Starting today, Kitesurf has full Browser Run API coverage. You can use Kitesurf with [__CDP__](https://developers.cloudflare.com/browser-run/cdp/), [__Playwright__](https://developers.cloudflare.com/browser-run/playwright/), [__Puppeteer__](https://developers.cloudflare.com/browser-run/puppeteer/), or [__MCP__](https://github.com/cloudflare/mcp-server-cloudflare/tree/main/apps/browser-rendering).\n\nOne of the most popular Browser Run features, [__Quick Actions__](https://developers.cloudflare.com/browser-run/quick-actions/), provide simple interfaces for common browser tasks like capturing screenshots, extracting HTML content, generating PDFs, and more. When we launched Kitesurf, you could use Quick Actions from our REST API. Now you can also use them from inside a Worker script using the **env.BROWSER.quickAction()** binding:\n\n```\ninterface Env {\n\tBROWSER: BrowserRun;\n}\n\nexport default {\n\tasync fetch(request, env): Promise<Response> {\n\t\treturn await env.BROWSER.quickAction(\"screenshot\", {\n\t\t\turl: \"https://example.com\",\n\t\t\tbrowser: \"kitesurf\"\n\t\t});\n\t},\n} satisfies ExportedHandler<Env>;\n```\n\n## Kitesurf runs in the terminal now\n\nAs we detailed in the [__How we built it__](https://blog.cloudflare.com/kitesurf/#how-we-built-it) section of our announcement blog post, Kitesurf separates [__PageScript__](https://blog.cloudflare.com/kitesurf/#pagescript), the isolate that handles the page session and runs the page code, from [__PageRenderer__](https://blog.cloudflare.com/kitesurf/#pagerenderer), which is responsible for generating the actual pixels from the computed page objects.\n\nThis not only gives great isolation and flexibility, but it also allows us to decouple and move the rendering logic to outside Kitesurf (to the client, for example, or to another Worker), while keeping the security-critical parts server-side, running in our network.\n\nIf this model sounds familiar, it may be because Cloudflare has another SASE product called [__Cloudflare Browser Isolation__](https://www.cloudflare.com/sase/products/browser-isolation/), which runs all untrusted web code at the edge of our global network while it “streams” the rendering data back to the clients.\n\nWe can do something similar with Kitesurf. To prove it, we moved PageRenderer to our [__Playground__](https://kitesurf.dev/) Worker and patched this version so that instead of converting scene data into an image, it outputs to [__Kitty__](https://sw.kovidgoyal.net/kitty/graphics-protocol/)—a terminal graphics protocol supported by modern terminals like Kitty [__itself__](https://sw.kovidgoyal.net/kitty/), [__Ghostty__](https://ghostty.org/), [__WezTerm__](https://wezterm.org/), and others. We even went a step further and added a pure ANSI text mode for environments where Kitty isn't available.\n\nThe result is that you can now quickly open and render a page using Kitesurf without leaving the comfort of your terminal application. This is super useful not only because you can now browse the modern Web at a glance without context-switching, but you can also use this tool to see how an agent using Kitesurf “sees” a page.\n\nTo install the terminal version of Kitesurf, do this:\n\n``` bash\n$ brew install cloudflare/cloudflare/kitesurf\n```\n\nFrom now on just type this in terminal:\n\n``` bash\n$ kitesurf https://blog.cloudflare.com\n$ kitesurf --help\n```\n\nHere’s a demo of it working.\n\nThe terminal also sends back scrolling and click events, so you use the keyboard, arrows, or the mouse normally, as if you were in a dedicated browser application window.\n\nAnd here is our [__Silent Space Marine__](https://silentspacemarine.com/) Doom demo running in Kitesurf inside the terminal:\n\n## Where we go from here\n\nWe continue to iterate rapidly on the road to the best agentic browser for our customers and developers. Expect ever-better performance benchmarks and for the list of supported Web standards and WPT test coverage to continue to rise quickly. In fact, we’ve decided to publish the results [__here__](https://kitesurf.dev/wpt) and [__here__](https://kitesurf.dev/benchmarks), in the open, so that you track them as we move forward, in real time.\n\nWe are going to continue exploring scenarios where decoupling Kitesurf and moving PageRenderer away from PageScript is an advantage for agents, or where higher frame rates are important. We may or may not have a 30fps Doom version running in Kitesurf as we write this.\n\nWe also want to address the elephant in the room: While we are currently prioritizing rapid development, we remain committed to open-sourcing Kitesurf. This is coming soon, but we want to do this right, so we are set up to support it for the long term.\n\nKitesurf stays true to its initial design goal: It runs entirely on top of Workers just like any other customer application does; that means we only use our publicly available features and APIs and have no access to any special privileges. This is not only a great way to dogfood and prove our own platform, but also the only way to make Kitesurf very cheap and scale automatically across the Cloudflare global network.\n\nGive Kitesurf a try in the refreshed [__kitesurf.dev__](https://kitesurf.dev) playground, and use it in your projects via [__Browser Run__](https://developers.cloudflare.com/browser-run/kitesurf/). It’s **available for free while in beta**, behind per-account [__limits__](https://developers.cloudflare.com/browser-run/limits/?cf_page=kitesurf%2F). Keep an eye on our [__changelog__](https://developers.cloudflare.com/browser-run/changelog/?cf_page=kitesurf%2F) and come chat with the team on [__Discord__](https://discord.com/invite/cloudflaredev). Share your experience and send us feedback—we’ll be listening.", "url": "https://wpnews.pro/news/the-road-to-the-agentic-browser-a-kitesurf-update", "canonical_source": "https://blog.cloudflare.com/kitesurf-update/", "published_at": "2026-09-28 13:00:00+00:00", "updated_at": "2026-09-28 13:19:57.037350+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools", "developer-tools", "ai-infrastructure"], "entities": ["Cloudflare", "Kitesurf", "WebMCP", "Cloudflare Workers", "Cloudflare Radar", "Browser Run", "Chrome DevTools MCP"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/the-road-to-the-agentic-browser-a-kitesurf-update", "markdown": "https://wpnews.pro/news/the-road-to-the-agentic-browser-a-kitesurf-update.md", "text": "https://wpnews.pro/news/the-road-to-the-agentic-browser-a-kitesurf-update.txt", "jsonld": "https://wpnews.pro/news/the-road-to-the-agentic-browser-a-kitesurf-update.jsonld"}}