Safari browser automation for AI agents — native macOS, zero Chrome overhead. 96 tools via AppleScript + JavaScript.
Safari browser automation for AI agents — native macOS, zero Chrome overhead. 96 tools via AppleScript + JavaScript.
Your AI drives the Safari you're already logged into — Gmail, GitHub, Ahrefs, Slack, banking.
Compare MCP servers by category, or browse hosted MCP servers if you prefer an endpoint over a local process.
Check the linked publisher documentation and your connected client's tool list. Names and availability can vary with the server version and account permissions.
| Tool | What it does |
|---|---|
| safari_navigate | Navigate to URL (auto HTTPS, wait for load) |
| safari_go_back | Go back in history |
| safari_go_forward | Go forward in history |
| safari_reload | Reload page (optional hard reload) |
| safari_read_page | Get title, URL, and text content |
| safari_get_source | Get full HTML source |
| safari_navigate_and_read | Navigate + read in one call |
| safari_click | Click by CSS selector, visible text, or coordinates |
| safari_double_click | Double-click (select word, etc.) |
| safari_right_click | Right-click (context menu) |
| safari_hover | Hover over element |
| safari_click_and_wait | Click + wait for navigation |
| safari_click_and_read | Click then return the updated page — saves a round-trip (React Router + full loads) |
| safari_fill | Fill input (React/Vue/Angular compatible) |
| safari_clear_field | Clear input field |
| safari_select_option | Select dropdown option |
| safari_fill_form | Batch fill multiple fields |
| safari_fill_and_submit | Fill form + submit in one call |
| safari_type_text | Type real keystrokes (JS-based, no System Events) |
| safari_press_key | Press key with modifiers |
| safari_react_select_set | Set a react-select v5 value via React fiber — bypasses the menu UI |
| safari_react_select_list_options | List a react-select v5 dropdown's options without opening it |
| safari_replace_editor | Replace all content in a code editor (Monaco, CodeMirror, Ace, ProseMirror) |
| safari_verify_state | Verify an editor's framework-level state matches expected — catch stale DOM before Submit |
| safari_screenshot | Screenshot as PNG (viewport or full page) |
| safari_screenshot_element | Screenshot a specific element |
| safari_save_pdf | Export page as PDF |
| safari_scroll | Scroll up/down by pixels |
| safari_scroll_to | Scroll to exact position |
| safari_scroll_to_element | Smooth scroll to element |
| safari_list_tabs | List all tabs (index, title, URL) |
| safari_new_tab | Open new tab (background, no focus steal) |
| safari_close_tab | Close tab |
| safari_switch_tab | Switch to tab by index |
| safari_wait_for_new_tab | Wait for a new tab (e.g. OAuth popup) and auto-switch to it |
| safari_wait_for | Wait for element, text, or URL change |
| safari_wait | Wait for specified milliseconds |
| safari_evaluate | Execute arbitrary JavaScript, return result |
| safari_eval_file | Execute JavaScript read from a file path (avoids huge inline scripts) |
| safari_list_frames | List every document in the tab (main page + each iframe) with frameId, URL and text length — pass a frameId to safari_evaluate's frame to run inside a cross-ori |
| safari_get_element | Element details (tag, rect, attrs, visibility) |
| safari_query_all | Find all matching elements |
| safari_get_computed_style | Computed CSS styles |
| safari_detect_forms | Auto-detect all forms with field selectors |
| safari_accessibility_snapshot | Full a11y tree: roles, ARIA, focusable elements |
| safari_snapshot | Accessibility tree with ref IDs for every interactive element — preferred way to see page state |
| safari_drag | Drag between elements or coordinates |
| safari_upload_file | Upload file via JS DataTransfer (no file dialog!) |
| safari_paste_image | Paste image into editor (no clipboard touch!) |
| safari_handle_dialog | Handle alert/confirm/prompt |
| safari_resize | Resize browser window |
| safari_emulate | Emulate device (iPhone, iPad, Pixel, Galaxy) |
| safari_reset_emulation | Reset to desktop |
| safari_get_cookies | Get all cookies |
| safari_set_cookie | Set cookie with all options |
| safari_delete_cookies | Delete one or all cookies |
| safari_local_storage | Read localStorage |
| safari_set_local_storage | Write localStorage |
| safari_delete_local_storage | Delete/clear localStorage |
| safari_session_storage | Read sessionStorage |
| safari_set_session_storage | Write sessionStorage |
| safari_delete_session_storage | Delete/clear sessionStorage |
| safari_export_storage | Export all storage as JSON (backup/restore sessions) |
| safari_import_storage | Import storage state from JSON |
| safari_clipboard_read | Read clipboard text |
| safari_clipboard_write | Write text to clipboard |
| safari_network | Quick network requests via Performance API |
| safari_start_network_capture | Start detailed capture (fetch + XHR) |
| safari_network_details | Get captured requests with headers/timing |
| safari_clear_network | Clear captured requests |
| safari_mock_route | Mock network responses (intercept fetch/XHR) |
| safari_clear_mocks | Remove all network mocks |
| safari_start_console | Start capturing console messages |
| safari_get_console | Get all captured messages |
| safari_clear_console | Clear captured messages |
| safari_console_filter | Filter by level (log/warn/error) |
| safari_performance_metrics | Navigation timing, Web Vitals, memory |
| safari_throttle_network | Simulate slow-3g/fast-3g/4g/offline |
| safari_extract_tables | Tables as structured JSON |
| safari_extract_meta | All meta: OG, Twitter, JSON-LD, canonical |
| safari_extract_images | Images with dimensions and loading info |
| safari_extract_links | Links with rel, external/nofollow detection |
| safari_override_geolocation | Override browser geolocation |
| safari_list_indexed_dbs | List IndexedDB databases |
| safari_get_indexed_db | Read IndexedDB records |
| safari_css_coverage | Find unused CSS rules |
| safari_analyze_page | Full page analysis in one call |
| safari_doctor | Diagnose the macOS permission + daemon chain (Apple Events, Accessibility, Screen Recording, codesign) with per-failure fixes |
| safari_reload_extension | Hot-reload the Safari MCP Bridge extension without a manual toggle |
| safari_run_script | Run multiple actions in a single call (batch) |
| safari_native_click | OS-level mouse click (CGEvent, isTrusted: true) — bypasses WAF/bot detection when safari_click is blocked (405/403) |
| safari_native_hover | OS-level cursor hover — triggers real :hover/mouseenter for tooltips and obfuscated UIs |
| safari_native_type | Insert text via the real paste pipeline — ProseMirror/Slate/Draft.js process it natively so Submit sends real data |
| safari_native_keyboard | OS-level keypress + modifiers to Safari, no focus steal — reaches React trust-gated handlers (Discord/Slack send) |
| safari_inspect_viewport | Validate the tag for iOS Safari (device-width, zoom/WCAG, viewport-fit) |
| safari_safe_area_insets | Read live safe-area-inset values + viewport-fit / env() usage (notch / Dynamic Island) |
| safari_check_pwa | Audit iOS "Add to Home Screen" / PWA readiness (apple-touch-icon, manifest, theme-color, splash) |
| safari_webkit_compat | Check page CSS against this Safari via CSS.supports() — unsupported props, missing -webkit- prefixes, known quirks |
{
"mcpServers": {
"safari": {
"command": "npx",
"args": [
"safari-mcp"
]
}
}
}From the project documentation. Replace placeholders and example paths before connecting.
Use Microsoft’s Playwright MCP server to navigate pages, inspect accessibility snapshots, fill forms and capture browser screenshots.
The original Chromium automation reference server — simple, screenshot-driven browser control.
Give your coding agent the full DevTools toolbox: traces, network, console, heap snapshots and Lighthouse.
Puppeteer-powered browser control that drives pages from the accessibility tree instead of pixels.
Enables AI-powered applications to monitor and interact with browser data via a Chrome extension and MCP.
Automates browsers and APIs, enabling Large Language Models (LLMs) to interact with web pages for tasks like screenshot capture and JavaScript