Surf Connector — protocol 8
SurfConnector.pkg · 189 KB · installer version 1.8 · universal (Apple silicon and Intel) · macOS 13 or later · signed and notarized by Apple
Download protocol 8 — SurfConnector.pkgSHA-256 f69669f44b8d770659ffe40a6c2cee8060454a7e1c4a973f0b5a9ab70e8b3483
/usr/local/lib/surf/surf-connector --version
prints surf-connector protocol 8.What this is: a small program that lets Claude — or any other assistant that speaks MCP — work with Surf on your Mac: reading the page you point it at, clicking, typing, scrolling, and moving between pages. It costs nothing. It runs only while that software is running, only on your own machine, and Surf will not connect to anything until you switch the feature on yourself.
The Surf side needs Surf Pro, on a Mac. The connector itself is free and always will be — but installing it does not by itself switch the feature on.
Claude talks to other programs over a standard called MCP, which means starting a small program of its own. An app from the Mac App Store is not the right thing to be writing programs onto your disk for something else to run, so we ship this one separately, signed and notarized by Apple in its own installer. It is also why Surf asks you to point at it rather than guessing where it is: a guess that is wrong produces a setup that looks finished and quietly does nothing.
/usr/local/lib/surf/surf-connector.Already have it? This one is newer, and the difference is not cosmetic. Install it over the top — same steps, and your existing setup is kept. The change that matters most in protocol 8 is not something an older connector cannot do — it is something it describes wrongly. An older connector tells the assistant it can only see the tabs it opened, and leaves it to conclude that it is browsing in a sandbox of its own. It is not. Every tab it opens is an ordinary Surf tab using your ordinary cookies, so a site you are signed into is signed in for it, and a sign-in or a sign-out it performs is one your own browsing keeps afterwards. An assistant holding the older description will switch an account or sign out of one believing it is tidying up after itself; this one is told whose browser it is in, on every reply. Alongside it: it is now told when closing its own tab moved which tab you are looking at, rather than asking you about something you did not do; the key names it may send are the ones Surf actually accepts, and pressing a shifted key now types the shifted character; and a full-page capture reports the coordinates it was really taken in, which is the difference between a click that lands and one several hundred pixels adrift. Surf says so in Add-Ons when a connected session is running an older connector, and tells the session directly on every reply — the assistant is the one that needs to know, and it never looks at a panel. As above, quit the assistant and open it again afterwards, or it will keep using the copy it already started.
The connector is an ordinary MCP server, and nothing in it is specific to Claude — any tool that speaks MCP can drive Surf, with the same refusals, the same switch and the same per-session tabs. Surf’s own buttons write the config file Claude uses, so for anything else you add one entry to that tool’s own configuration. Below is a walkthrough for each.
Whatever the tool calls its config file, it is asking for the same three things.
/usr/local/lib/surf/surf-connectorAbout that timeout. Some tools default a request to about five seconds. Real browsing does not fit in five seconds: Surf waits up to fifteen for a page to finish loading before it answers, and up to six just to work out whether Surf is running at all. A five-second client gives up while Surf is still working, and what you see is a tool reporting that the server timed out or crashed — which looks exactly like a broken connector, so it sends you off fixing the one thing that is fine. Set 60 seconds and forget it.
One more thing worth doing if your tool offers it: give the server a working directory pointing at the project you are on. Surf names each connected session after that folder and the tool — my-project · opencode — and that name is what labels its tabs in the tab strip. Without it, two sessions look identical.
No terminal needed.
mcpServers block, paste just the "surf" entry inside it.What gets pasted looks like this:
{
"mcpServers": {
"surf": {
"command": "/usr/local/lib/surf/surf-connector"
}
}
}
One terminal command, once, and Surf works in every folder.
claude mcp add --scope user surf -- "/usr/local/lib/surf/surf-connector"claude session. Sessions already open will not see Surf.To set up a single folder instead, use Set Up One Folder… in Add-Ons — Surf writes a .mcp.json there and merges into anything already in it.
Edit opencode.json (or opencode.jsonc) — the global one in your config directory, or one in the project. The key is mcp, and the entry type is local:
{
"mcp": {
"surf": {
"type": "local",
"command": ["/usr/local/lib/surf/surf-connector"],
"enabled": true,
"timeout": 60000
}
}
}
The timeout line is not optional in practice. OpenCode’s own schema says it defaults to 5000 ms, which is shorter than a page load. OpenCode also accepts "cwd", and setting it to your project folder is what makes Surf’s session label useful.
Then start a new OpenCode session.
Open your Zed settings.json and add the server under context_servers. Zed asks for command, args and env, and the connector needs no arguments and no environment:
{
"context_servers": {
"surf": {
"command": "/usr/local/lib/surf/surf-connector",
"args": [],
"env": {}
}
}
}
Restart Zed afterwards.
Cursor uses the same shape as the Claude app, in ~/.cursor/mcp.json for everything, or .cursor/mcp.json inside a project:
{
"mcpServers": {
"surf": {
"command": "/usr/local/lib/surf/surf-connector",
"args": []
}
}
}
Restart Cursor, and check the MCP list in its settings shows surf as connected.
VS Code uses servers rather than mcpServers, in .vscode/mcp.json for one workspace, or the user-level mcp.json you reach with the MCP: Open User Configuration command:
{
"servers": {
"surf": {
"type": "stdio",
"command": "/usr/local/lib/surf/surf-connector"
}
}
}
Surf’s tools then appear in Copilot’s tool list in agent mode.
Copy any of the entries above and change the outer key to whatever your tool uses — the inside is the same three facts either way. (Newer versions of Surf have a Copy Setup button in Add-Ons that gives you a ready-made one.) Almost every tool uses one of these shapes:
| Tool | Where | Key |
|---|---|---|
| Claude app | claude_desktop_config.json (Settings › Developer › Edit Config) | mcpServers |
| Claude Code | ~/.claude.json, or .mcp.json in a folder | mcpServers |
| Cursor | ~/.cursor/mcp.json or .cursor/mcp.json | mcpServers |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | mcpServers |
| VS Code | .vscode/mcp.json, or the user mcp.json | servers |
| Zed | Zed settings.json | context_servers |
| OpenCode | opencode.json / opencode.jsonc | mcp |
Say Surf by name. If a Chrome extension is installed as well, “use the browser” is ambiguous and your assistant will usually reach for Chrome.
The Add-Ons panel lists every connected session by name, with its tab and request counts, so you can see the connection from Surf’s side without asking the assistant anything.
ls -l /usr/local/lib/surf/surf-connector. If you installed it elsewhere, use that path.While you have the feature switched on, Claude can read the address, visible text and elements of a page it is working with — including anything already typed into an ordinary form field on it — take a picture of it, and see the messages and network requests that page made. It can also click, type, scroll, go back and forward, open and close its own tabs, and resize the Surf window. Surf hands anything over only when asked.
Surf refuses some things in its own code, whatever it is asked. Private tabs are never exposed. Password fields are never filled, and Surf refuses any field it recognises as a card, security code or one-time code. What you typed into one is never read either: it is left out of what Claude is told, and Surf hides it for the moment a screenshot is taken, so it is not in the picture either. Recognising a card field depends on how the site marks it up, so treat it as a strong safeguard rather than a guarantee. A session can only touch tabs it opened, or a tab you have handed to it deliberately.
It browses as you, in your own browser. A tab a session opens is an ordinary Surf tab with your ordinary cookies — there is no separate, signed-out profile behind the feature. So a site you are signed into is a site the session is signed into: it can open your account there, read it, and act as you. That runs both ways — if a session signs in to a site, or signs out of one, that is what your own browsing finds the next time you go there. Tab ownership keeps a session out of your other tabs; it does not give it a browser of its own. Private tabs are the exception on both counts: they keep their own cookies in memory, and Surf never exposes them to a session at all.
You can see when it is happening. While a session is working, Surf draws a coloured edge around the page and shows a marker in the toolbar saying how many tabs that session has; clicking it takes you to the one being worked on. Each session gets its own colour, and the same colour marks its tabs in the tab strip. This matters because Claude usually works in a background tab — one you are not looking at — so the window itself has to tell you. Those signals need a window to appear in, though: Surf keeps running with its window closed so downloads finish, and nothing is drawn anywhere at that point. Automation › Stop Automation is in the menu bar the whole time, which is the switch to rely on.
What your assistant does with what it receives is between you and its provider — it will send that content on to be processed, and Surf can neither see nor limit that. A page's own text can also try to influence an assistant that is reading it. Surf is not immune to that, and no browser is. The feature does nothing until you switch it on for exactly these reasons, and Automation › Stop Automation is in the menu bar the whole time it is running so that turning it off never requires finding a settings pane.
Full detail is in the privacy policy, section 7.
The installer is signed by MW Supply Limited and notarized by Apple, so macOS verifies it for you before it will open. The certificate reads Developer ID Installer: Matthew Wong (6RZ8YV42XZ) — that is us; Apple issues these in the account holder’s name. If you would rather check it yourself:
shasum -a 256 SurfConnector.pkg
f69669f44b8d770659ffe40a6c2cee8060454a7e1c4a973f0b5a9ab70e8b3483
spctl --assess --type install -v SurfConnector.pkg should answer accepted · source=Notarized Developer ID.
Delete /usr/local/lib/surf/ and remove the surf entry from your Claude configuration. The installer adds nothing else and runs no scripts. While it is running the connector writes one small file inside Surf’s own storage — the port Surf should call it back on — and removes it again when it exits.
Surf and the Surf Connector are made by MW Supply Limited. Claude is a product of Anthropic, which does not sponsor or endorse Surf. You need your own Claude software and your own account; Surf has neither and never sees yours.