A community-driven registry for Claude, Cursor, Windsurf, Cline & more. Not affiliated with Anthropic.
Are you the author? Sign in to claim
claudeForSafari
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".
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
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 separatesafari-extension/folder.
git clone git@github.com:Lyosis/claudeForSafari.git
cd claudeForSafari
cd bridge
npm install
cd ..
app/claudeExtension.xcodeproj in XcodemacOS will show a banner: "claudeExtension wants to add a Safari extension" → click Open Safari Preferences and enable the extension.
Without this permission, script injection into pages will fail silently.
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.
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.
| 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_inputsupports<input>and<textarea>fields. Rich text editors usingcontenteditable(Notion, Gmail compose, etc.) are not yet supported.
"Safari extension not connected"
ps aux | grep bridge.jsclaude-safariPermission 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
The bridge listens on ws://localhost:45678 — localhost 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.
All extension file edits go in:
app/claudeExtension Extension/Resources/
After editing background.js or manifest.json:
The bridge (bridge/bridge.js) does not need a rebuild — Node.js picks up changes on the next Claude Desktop restart.
MIT
A Jetbrains IDE IntelliJ plugin aimed to provide coding agents the ability to leverage intelliJ's indexing of the codeba
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots