π¦
safari
MCP server for Safari web browser integration
0 installs
Trust: 39 β Low
Ai
Installation
npx @axivo/mcp-safariAsk AI about safari
Powered by Claude Β· Grounded in docs
I know everything about safari. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Loading tools...
Reviews
Documentation
Safari MCP Server
A MCP (Model Context Protocol) server for visual web access through Safari.
Features
- Visual Web Access: Viewport screenshots for visual inspection
- Full Authentication State: Operates on the user's actual Safari session with cookies preserved
- Tab-Aware Targeting: Act operations target a captured working tab, observe operations follow the user's focus
- Viewport Scrolling: Pixel amount or viewport-page index
- Element Inspection: Tag, visibility, attributes, bounding rect for any CSS selector
- Interaction Tools: Click, type, hover, select option
- Wait Conditions: Selector to appear, disappear, or page text to render
- Link Extraction: Anchor links as
{ text, href }pairs - Browser History: Back and forward navigation
- Console Error Capture: Two-phase injection during and after page load
Prerequisites
- macOS β System Settings β Desktop & Dock β Windows β "Prefer tabs when opening documents" option must be set to Always
- macOS β System Settings β Privacy & Security β Screen & System Audio Recording β Terminal app must be enabled
- Safari β Settings β Developer β Automation β "Allow JavaScript from Apple Events" option must be enabled
MCP Server Configuration
Add to mcp.json servers configuration:
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["-y", "@axivo/mcp-safari"],
"env": {
"SAFARI_WINDOW_HEIGHT": "1600"
}
}
}
}
Environment Variables
All variables are optional:
SAFARI_PAGE_TIMEOUT- Page load and selector wait timeout, in milliseconds (default:10000)SAFARI_WINDOW_BOUNDS- Browser window margin offset from top-left corner, in pixels (default:20)SAFARI_WINDOW_HEIGHT- Browser window height, in pixels (default:1024)SAFARI_WINDOW_WIDTH- Browser window width, in pixels (default:1280)
Prompt Examples
- "Open Safari and use
statustool for guidelines" - "Navigate to
example.com" - "Search for
example query" - "Take a screenshot of the current page"
- "Read the page content to understand what's on the page"
- "Click the 'Sign In' button"
- "Type my email into the login form and submit"
- "Refresh the page to see the latest changes"
- "Go back to the previous page"
- "Navigate forward two steps in browser history"
- "Scroll down 500 pixels"
- "Scroll to page 3 of this article"
- "Search for 'Claude AI' and click the first result"
- "List all open browser tabs"
- "Open a new browser tab and go to
example.com" - "Switch to the first browser tab"
- "Close the second browser tab"
- "Inspect the submit button before clicking it"
- "Hover over the Products menu"
- "Choose 'Canada' in the country dropdown"
- "Wait for the loading spinner to disappear"
- "Read all links on this page"
[!NOTE] The "use
statustool" instruction helps Claude pause and process the_meta.usageguidelines before interacting with the browser.
MCP Tools
Call status first at session start to get the runtime state and full tool surface:
- Act tools target a captured working tab
- Observe tools target the front window's current tab
-
click- Click an element on the working tab
- Type:
acttool - Optional inputs:
key(string): Key to press (e.g., Escape, ArrowRight, Enter, Tab)selector(string): CSS selector for the target elementtext(string): Visible text or aria-label to matchwait(string): CSS selector to wait for after clickx(number): X coordinate in pixelsy(number): Y coordinate in pixels
- Returns: Result with change detection
-
close- Close the working tab
- Type:
acttool
-
execute- Execute JavaScript in the working tab
- Type:
acttool - Required inputs:
script(string): JavaScript code
-
hover- Dispatch hover events to reveal hover-triggered UI
- Type:
acttool - Optional inputs (one is required):
selector(string): CSS selector for the target elementtext(string): Visible text to match
-
inspect- Return element metadata for a CSS selector
- Type:
observetool - Required inputs:
selector(string): CSS selector for the target element
- Optional inputs:
index(number): Tab index in the front window
- Returns:
{ found, tag, text, visible, disabled, attributes, rect }
-
navigate- Navigate the working tab to a URL or through history
- Type:
acttool - Optional inputs (
urlordirectionrequired):direction(string:backorforward)selector(string): CSS selector to wait for after loadsteps(number, default: 1): Steps for history navigationurl(string): URL to navigate to
-
open- Open a blank tab as the working target
- Type:
acttool
-
read- Get page title, URL, and text or links from a tab
- Type:
observetool - Optional inputs:
index(number): Tab index in the front windowmode(string:textorlinks, default:text)selector(string): CSS selector to scope extraction
-
refresh- Refresh the working tab
- Type:
acttool - Optional inputs:
hard(boolean, default: false): Bypass cacheselector(string): CSS selector to wait for after reload
-
screenshot- Capture viewport of the front tab as base64 PNG
- Type:
observetool
-
scroll- Scroll by direction or to a viewport-page index
- Type:
observetool - Optional inputs:
direction(string:upordown)page(number): Viewport-page index to scroll topixels(number): Pixels to scroll, paired withdirection
-
search- Search using the browser's default engine
- Type:
acttool - Required inputs:
text(string): Search query
-
select- Choose an option in a
<select>element - Type:
acttool - Required inputs:
selector(string): CSS selector for the<select>
- Optional inputs (one is required):
text(string): Option visible textvalue(string): Option value attribute
- Choose an option in a
-
status- Return current Safari tabs and full tool surface
- Type:
observetool - Returns:
{ tabs, tools }
-
type- Type text into an input field
- Type:
acttool - Required inputs:
text(string): Text to type
- Optional inputs:
append(boolean, default: false): Append instead of replaceselector(string): CSS selector for the inputsubmit(boolean, default: false): Press Enter after typing
-
wait- Wait for selector or page text condition
- Type:
observetool - Optional inputs (exactly one of the first three required):
selector(string): CSS selector to wait forselectorGone(string): CSS selector to wait absenttext(string): Page text to wait fortimeoutMs(number): Timeout in milliseconds
- Returns:
{ matched, elapsedMs }
-
window- Manage browser window tabs
- Type:
observetool - Required inputs:
action(string:close,list,open,switch)
- Optional inputs:
index(number): Tab index forcloseandswitchurl(string): URL foropen
