Claude For Safari

by Lyosis

353 downloads
Not rated
GitHub

About

Safari Web Extension + Node.js MCP bridge giving Claude Desktop full control over Safari — navigate, read pages, click elements, fill forms, and manage tabs. No Playwright or WebDriver dependency.

Details

Author
Lyosis
Downloads
353
Categories
AI, Automation

- 13 tools for Safari control including navigation, reading, and clicking
- Execute arbitrary JavaScript in the active tab
- List, create, close, and switch between tabs
- Read visible page text or full HTML
- Fill form input and textarea fields
- Find elements by CSS selector or text content
- Support for multiple Safari profiles

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Claude For Safari
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Clone the repository, install bridge dependencies with npm, build the Safari extension in Xcode, enable the extension in Safari settings, and add the server entry pointing to bridge/bridge.js in your claude_desktop_config.json. Safari must be open with the extension enabled; the bridge starts automatically with Claude Desktop.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "claude for safari": {
            "safari": {
                "command": "node",
                "args": [
                    "/path/to/claudeForSafari/bridge/bridge.js"
                ]
            }
        }
    }
}

McpServers

{
    "safari": {
        "command": "node",
        "args": [
            "/path/to/claudeForSafari/bridge/bridge.js"
        ]
    }
}

Claude for Safari

Gives Claude Desktop the ability to control Safari — navigate pages, read content, click elements, fill forms — via the MCP protocol, just like "Claude in Chrome".

claudeForSafari MCP server
claudeForSafari MCP server

Architecture

Claude Desktop  (MCP stdio)
      ↕  JSON-RPC
  bridge/bridge.js  (Node.js)
      ↕  WebSocket  ws://localhost:45678
Safari Extension background.js  (MV2)
      ↕  browser.tabs / executeScript
    Active Safari tab

---

Repository structure

claudeForSafari/                  ← git root
├── .gitignore
├── README.md
├── bridge/                       ← Node.js bridge (MCP ↔ WebSocket)
│   ├── bridge.js
│   ├── package.json
│   └── package-lock.json
└── app/                          ← Xcode project
    ├── claudeExtension.xcodeproj
    ├── claudeExtension/          ← Swift host app (macOS)
    └── claudeExtension Extension/
        └── Resources/            ← SINGLE SOURCE for extension files
            ├── manifest.json
            ├── background.js
            ├── content.js
            ├── popup.html / popup.js / popup.css
            ├── images/
            └── _locales/

> Rule: all extension file edits go directly in app/claudeExtension Extension/Resources/. There is no separate safari-extension/ folder.

---

Requirements

- macOS 14+ (Sonoma or later)
- Xcode 16+
- Node.js v18+ — nodejs.org if not yet installed
- An Apple developer account (free account is enough for local use)
- Claude Desktop with MCP support

---

Installation

Step 1 — Clone the repository

git clone git@github.com:Lyosis/claudeForSafari.git
cd claudeForSafari

Step 2 — Install bridge dependencies

cd bridge
npm install
cd ..

Step 3 — Build the extension in Xcode

1. Open app/claudeExtension.xcodeproj in Xcode
2. Select the claudeExtension scheme (the host app)
3. Choose My Mac as the destination
4. Press Cmd+R — Xcode builds and launches the app

macOS will show a banner: "claudeExtension wants to add a Safari extension" → click Open Safari Preferences and enable the extension.

Step 4 — Enable the extension in Safari

1. Safari → Settings (Cmd+,)Extensions tab
2. Check claudeExtension
3. In the right column → Allow on all websites

> Without this permission, script injection into pages will fail silently.

Step 5 — Configure Claude Desktop

Open (or create):

~/Library/Application Support/Claude/claude_desktop_config.json

Add the safari entry under mcpServers:

{
  "mcpServers": {
    "safari": {
      "command": "node",
      "args": [
        "/absolute/path/to/claudeForSafari/bridge/bridge.js"
      ]
    }
  }
}

Replace /absolute/path/to/ with the actual path where you cloned the repo.

If node is not in Claude Desktop's PATH, use its full path:

which node   # e.g. /usr/local/bin/node or /opt/homebrew/bin/node

Then restart Claude Desktop.

---

Usage

The bridge starts automatically with Claude Desktop.
Safari must be open with the extension enabled.

The extension reconnects automatically to the bridge after sleep or after visiting Safari Settings — no manual action required.

---

Available tools (13)

| Tool | Description |
|---|---|
| safari_list_profiles | List available Safari profiles |
| safari_navigate | Navigate to a URL |
| safari_get_page_text | Read the visible text of the current page |
| safari_read_page | Get the full HTML of the current page |
| safari_javascript | Execute arbitrary JavaScript |
| safari_find | Find elements by CSS selector or text content |
| safari_click | Click an element |
| safari_form_input | Fill an <input> or <textarea> field |
| safari_scroll | Scroll the page |
| safari_tabs_list | List open tabs |
| safari_tabs_create | Open a new tab |
| safari_tabs_close | Close a tab |
| safari_tabs_switch | Switch to a tab by ID |

> safari_form_input supports <input> and <textarea> fields. Rich text editors using contenteditable (Notion, Gmail compose, etc.) are not yet supported.

---

Troubleshooting

"Safari extension not connected"
- Is Safari open? Is the extension checked in Safari → Extensions?
- Check the bridge is running: ps aux | grep bridge.js
- Check logs: Console.app → filter by claude-safari

Permission denied on script injection
→ Safari → Settings → Extensions → claudeExtension → Allow on all websites

safari_get_page_text fails on an internal tab
→ Internal Safari pages (favorites://, about:blank, etc.) cannot be injected. Navigate to an http:// or https:// URL first.

Bridge won't start
→ Check Node.js: node -v (v18+ required)
→ Use the absolute path to node in claude_desktop_config.json

Xcode — "No signing certificate"
→ Xcode → Settings → Accounts → add your Apple ID → Download Manual Profiles

---

Security model

The bridge listens on ws://localhost:45678localhost only, never exposed to the network.

However, any local process can connect to that port. There is no cryptographic authentication between the bridge and the Safari extension. The threat model assumes that other processes running under your user account are trusted. If you run untrusted local software, be aware that it could theoretically connect to the bridge.

safari_javascript executes arbitrary JavaScript in the active tab by design. Treat it like browser DevTools — only use it on pages you trust.

Development

All extension file edits go in:

app/claudeExtension Extension/Resources/

After editing background.js or manifest.json:

1. Rebuild in Xcode (Cmd+R)
2. Safari → Settings → Extensions → disable then re-enable the extension
(or restart Safari)

The bridge (bridge/bridge.js) does not need a rebuild — Node.js picks up changes on the next Claude Desktop restart.

---

License

MIT

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.