Skip to content

CASE STUDY

03/Work, selected

03 / 08

arc-control-mcp

An MCP server that lets agents drive the Arc browser.

What I ownedOwnership: Sole author

Sole creator: all 50 tools, the rule that an agent never touches the tab or window I am using, and the CI and npm release.

50Tools

Year
2026
Role
Creator
Category
Tooling

01/The problem

The Chrome MCP server can’t be pointed at Arc.

The bundled Chrome MCP server cannot be pointed at Arc, and Arc’s scripting dictionary differs from Chrome’s in exactly the places that matter.

02/What I built

50 tools that let an agent use the browser I’m signed in to, in a window of its own.

  1. 01

    50 tools in twelve modules read pages, click, fill forms and run JavaScript over Apple Events, using the browser I am already signed in to. A page snapshot gives every element a ref the agent can act on, so it never guesses selectors.

  2. 02

    An optional DevTools engine adds real clicks and typing that sites treat as a person, screenshots of background tabs, and console and network logs.

  3. 03

    Agent tabs live in one window of their own on my second display, anything that could move focus waits until I stop typing, and failures are reported as failures, never as a success that did not happen.

  4. 04

    Two runtime dependencies (the MCP SDK and Zod), no build step, CI, and a changelog and security policy.

03/Architecture

A tool call goes in, Apple Events run it, the page comes back.

An agent calls a tool over MCP. The server runs it through Apple Events, or the DevTools engine for real input and screenshots, in a tab inside the agent’s own window, and the result goes back to the agent.

01AI agent02MCP client03arc-control-mcp04Apple Events orDevTools05Arc06Agent window

04/Outcomes

Fifty tools, published on npm.

  1. 50

    Tools

    In twelve modules, as of version 0.4.0.

    From the repoSource: github.com

  2. 35

    Test files

    Cover the tool schemas, argument validation, the agent window and focus guard, the DevTools engine against a real Chromium, and live runs against Arc. There is no benchmark of agent task completion.

    From the repoSource: github.com

  3. 100

    npm downloads, last month

    Month ending October 1, 2026. Registry counts include automated installs.

    Third partySource: api.npmjs.org

Check these in the ledger

05/Production notes

Behind the numbers

All receipts for this project
Evaluation

Tested

Sixteen test files cover the advertised tool schemas, argument validation, timeouts, batch limits and an integration run. There is no benchmark of how often an agent completes a task with it.

What broke

A page script that threw was reported as ok: true, so a four-step batch in which nothing happened looked fully successful. An agent that drove the running server found it on 31 August 2026, in the 0.1.x builds I had been running. npm has only ever carried 0.3.0, which validates every argument and marks failures isError. The public git history starts at that release, so the fix is recorded in the changelog and the review rather than the commit log.

Reversed

A call with no tab_id used to fall back to the tab you were looking at, and an agent used that to navigate and reload a tab a person was reading. Tools that change a tab now refuse instead; only read-only tools may fall back.

Privacy

The server runs JavaScript in your signed-in browser. That is not a sandbox, and the threat model says so. The one guard is aimed at an agent’s mistake, not a hostile agent, and page content is treated as untrusted data.

Cost

Every call spawns an osascript process, a few hundred milliseconds each. That is why tab_id is not mandatory on every tool.

06/Stack

Built with

  • Node.js
  • MCP SDK
  • Zod
  • JXA
  • Apple Events
  • GitHub Actions