Safari 27: an MCP server for agents, customizable select and the model element
On September 17, 2026, the WebKit team published its features post for Safari 27.0. As usual, it’s a huge read: according to WebKit, the feature list grew from 58 to 80 since the first beta in June, and the total number of fixes reaches 844. I picked out what caught my attention as a developer, starting with the item I didn’t expect to see in a browser release.
An MCP server inside safaridriver
Safari 27 includes an MCP server that runs from safaridriver itself. With it, coding agents such as Claude Code and Codex, or “the agent of your choice”, in the post’s words, get access to the DOM, network requests, screenshots and console output. WebKit lists uses like checking rendering, form and checkout states, computed styles, accessibility issues and load timings.
Setup is short. First, enable “Allow remote automation and external agents” under Safari, Settings, Developer. Then register the server with your agent:
claude mcp add safari-mcp -- "/usr/bin/safaridriver" --mcp
For Codex, the command is the same with codex instead of claude; other agents use an mcpServers entry with the command /usr/bin/safaridriver and the argument --mcp. One point the post stresses: the server runs entirely on the local machine and, according to WebKit, makes no network calls of its own.
Customizable select, and model on macOS and iOS
Customizable <select> arrives in Safari. Applying appearance: base-select to select and ::picker(select) switches the control to the new default styles and unlocks the new features, such as the ::picker-icon and ::checkmark pseudo-elements, the <selectedcontent> element and HTML inside <option>. The post warns that the default styles changed since the June beta, so early testers should take another look.
The <model> element, which already existed on visionOS, now works in Safari on iOS, iPadOS and macOS. It accepts multiple <source> files, an <img> fallback and attributes such as environmentmap and stagemode.
JavaScript and WebAssembly
Two engine changes stand out. The first is JSPI (WebAssembly JavaScript Promise Integration), which, according to WebKit, lets synchronous-looking WebAssembly code suspend and wait for JavaScript Promises. That makes it easier to port C, C++ and Rust code that expects synchronous I/O.
The second is an ES module loader rewritten from scratch, now in native C++. WebKit says the rewrite fixes execution ordering and initialization bugs, was validated against test262 and Web Platform Tests, and closes a long-standing gap in top-level await.
On streams, for await...of now works on response.body, ReadableStream.from() creates a stream from a sync or async iterable, and streams can be transferred across contexts via postMessage().
Small things that save work
- Service Worker static routing: a service worker can declare rules so the browser bypasses it for certain requests.
sizes="auto": withloading="lazy", the browser calculates the image size from the actual layout width.- Scroll anchoring on by default: content inserted above the viewport no longer pushes the reader around;
overflow-anchor: noneopts out. - WebGPU: WGSL shaders support
clip_distancesfor custom clipping planes. Securecookies on loopback: on local hosts over HTTP, cookies markedSecurecan now be set, matching other browsers. Great for local development.- WKWebView:
WKJSHandlelets native code use JavaScript object references, andWKDOMNodeSnapshotclones DOM nodes, including shadow roots, between instances. - Web Inspector: the Network tab shows the whole redirect chain, not just the final destination.
My take
The MCP server is the most symbolic item in this release. Until now, giving an agent access to a real browser usually meant Chrome with some automation layer on top. Having it built into Safari, running locally, makes it much easier to ask an agent to check whether something broke specifically in WebKit, which has historically been where many layout bugs show up last.
Beyond that, what I like most is the convergence: customizable select, scroll anchoring by default, Secure cookies on localhost and the top-level await fix all take Safari off the list of exceptions. Less per-browser conditional code is a concrete win for anyone maintaining a front end.