~/blog

Safari ships an MCP server: local server, not a local pipeline

published

#safari#mcp#privacy#devtools

TL;DR

Safari now exposes an MCP server through safaridriver, so Claude Code, Codex or any MCP client can drive a real Safari window — read the DOM, click things, inspect network requests, take screenshots. WebKit says the server “runs entirely on your local machine and makes no network calls of its own.” That is true and it is narrower than it sounds: local describes the server, not the pipeline. Everything the server captures is handed to your agent, and your agent ships it to a model provider. Setup is one command plus two checkboxes, and the first checkbox is the one people miss.

What shipped

The Safari MCP server first appeared in Safari 27 beta and Safari Technology Preview 247, announced on 2026-07-01. It reached stable with macOS 27, which released on September 14, 2026, and WebKit’s Safari 27.0 features post on 2026-09-17 put it back in front of everyone.

There is no separate binary to install. It runs on safaridriver, the WebDriver executable already bundled with Safari. That is the genuinely nice part of the design: the automation surface Safari already had gets an MCP front door, and a coding agent can reach live DOM, console output, network request detail, computed styles and screenshots through it.

It is macOS-only. If you are on Linux or Windows, this post is not for you.

Setup, and the checkbox that hides the other checkbox

Two settings must be enabled, in this order, and the first one is what makes the second one visible:

  1. Safari > Settings > Advanced — check Show features for web developers.
  2. Safari > Settings > Developer — check Allow remote automation and external agents.

Most of the coverage quotes only step 2, which is exactly the step you cannot find if you skipped step 1, because the Developer tab is not there yet.

Then register the server with your agent:

claude mcp add safari-mcp -- "/usr/bin/safaridriver" --mcp

Codex takes the same shape with codex substituted; other clients point an mcp.json entry at the same binary and flag.

What the tools cover

WebKit’s post lists the tools in a table. I am deliberately not giving you a count — I read that page twice and the prose disagreed with itself about the number both times, while the list of names stayed identical. Recount it yourself if the figure matters to you.

What the names tell you is that the set is scoped to the debugging loop rather than to general automation:

AreaTools
Navigationnavigate_to_url, wait_for_navigation, page_info
Tabslist_tabs, create_tab, switch_tab, close_tab
Reading the pageget_page_content, screenshot, evaluate_javascript
Networklist_network_requests, get_network_request
Console and dialogsbrowser_console_messages, browser_dialogs
Interactionpage_interactions
Environmentset_viewport_size, set_emulated_media

set_emulated_media is the one worth noticing: it is how an agent checks your dark-mode and print styles without you toggling anything, and it is the kind of tedious verification pass that is worth handing off.

What is not here: no profiling timeline, no coverage tooling, no direct access to the Web Inspector’s own panels. This drives a browser and reads what it sees.

Where the privacy line actually sits

This is the part worth being precise about, because “runs locally” is doing a lot of work in the coverage.

WebKit’s own sentence: “The Safari MCP server runs entirely on your local machine and makes no network calls of its own.” That is a statement about the server process. The same post continues: when it captures page content, screenshots or console logs, “that data goes directly to the agent you’re running — not to Apple.”

Read those together and the boundary is clear. Apple is not in the loop. Your model provider is — because the agent’s whole job is to send what it reads to a model. A get_page_content call on a page behind your company SSO puts that page’s DOM in a prompt. A screenshot of a staging dashboard uploads that screenshot. list_network_requests can surface tokens in request headers.

WebKit says the quiet part itself, and it is the last line of that section: “As with any agent you give access to your browser, only use ones you trust.”

That is not a reason to avoid this. It is a reason to know which tab is in front when you let an agent look.

Practical rules

Caveats

References