Connection check
local install
safari-mcp
Native Safari browser automation for AI agents — 97 tools, zero Chrome overhead.
Tools
97
GitHub stars
181
Installs / wk
1.8k
Licence
MIT
Transport
stdio
Last checked
never
Tools & capabilities
97 toolsRead from the published package source — this server runs locally, so there is no endpoint to query. Names are taken from the code, not observed at runtime, and descriptions are often absent.
safari_accessibility_snapshot
from source
Get the accessibility tree of the page (roles, ARIA labels, focusable elements, form states). Essential for a11y auditing. Get the accessibility tree of the page (roles, ARIA labels, focusable elements, form states). Essential for a11y auditing.
safari_analyze_page
from source
Full page analysis in ONE call: title, URL, meta tags, OG, headings, link stats, image stats, forms, and text preview. Perfect for SEO/audit. Full page analysis in ONE call: title, URL, meta tags, OG, headings, link stats, image stats, forms, and text preview. Perfect for SEO/audit.
safari_check_pwa
from source
Audit the page for iOS Audit the page for iOS
safari_clear_console
from source
Clear all captured console messages Clear all captured console messages
safari_clear_field
from source
Clear an input field Clear an input field
safari_clear_mocks
from source
Remove all network route mocks (restore real network behavior) Remove all network route mocks (restore real network behavior)
safari_clear_network
from source
Clear all captured network requests Clear all captured network requests
safari_click
from source
Click element. Use ref (from snapshot), selector, text, or x/y. Works on React/Airtable/virtual DOM apps via full PointerEvent+MouseEvent sequence + React Fiber fallback. Pure JS —… Click element. Use ref (from snapshot), selector, text, or x/y. Works on React/Airtable/virtual DOM apps via full PointerEvent+MouseEvent sequence + React Fiber fallback. Pure JS — never touches user
safari_click_and_read
from source
Click an element then return the updated page — saves 1 full round-trip vs separate click+read_page. Handles both React Router navigation and full page loads. Click an element then return the updated page — saves 1 full round-trip vs separate click+read_page. Handles both React Router navigation and full page loads.
safari_click_and_wait
from source
Click an element AND wait for the result (page load or element). Use instead of click + wait_for separately. Click an element AND wait for the result (page load or element). Use instead of click + wait_for separately.
safari_clipboard_read
from source
Read the current clipboard content (text) Read the current clipboard content (text)
safari_clipboard_write
from source
Write text to the system clipboard Write text to the system clipboard
safari_close_tab
from source
Close the current tab. After a daemon/session restart, pass the opaque receipt returned by safari_new_tab or safari_list_tabs. Close the current tab. After a daemon/session restart, pass the opaque receipt returned by safari_new_tab or safari_list_tabs.
safari_console_filter
from source
Get console messages filtered by level (must call safari_start_console first) Get console messages filtered by level (must call safari_start_console first)
safari_css_coverage
from source
Analyze CSS coverage: find unused CSS rules across all stylesheets. Shows coverage percentage per stylesheet. Analyze CSS coverage: find unused CSS rules across all stylesheets. Shows coverage percentage per stylesheet.
safari_delete_cookies
from source
Delete a specific cookie or all cookies for the current page Delete a specific cookie or all cookies for the current page
safari_delete_local_storage
from source
Delete a localStorage key, or clear all localStorage (omit key to clear all) Delete a localStorage key, or clear all localStorage (omit key to clear all)
safari_delete_session_storage
from source
Delete a sessionStorage key, or clear all sessionStorage (omit key to clear all) Delete a sessionStorage key, or clear all sessionStorage (omit key to clear all)
safari_detect_forms
from source
Auto-detect all forms on the page with their fields, types, selectors, and submit buttons. Great for automated form filling. Auto-detect all forms on the page with their fields, types, selectors, and submit buttons. Great for automated form filling.
safari_doctor
from source
Diagnose the macOS permission + daemon chain in one shot: Safari running, Apple Events/Automation, native helper daemon, Accessibility (native clicks), Screen Recording, and the he… Diagnose the macOS permission + daemon chain in one shot: Safari running, Apple Events/Automation, native helper daemon, Accessibility (native clicks), Screen Recording, and the helper
safari_double_click
from source
Double-click an element by CSS selector or x/y coordinates (e.g. to select a word in text) Double-click an element by CSS selector or x/y coordinates (e.g. to select a word in text)
safari_drag
from source
Drag an element to another element or position. Use CSS selectors or x/y coordinates. Drag an element to another element or position. Use CSS selectors or x/y coordinates.
safari_emulate
from source
Emulate a mobile device by resizing window and setting user agent. Devices: iphone-14, iphone-14-pro-max, ipad, ipad-pro, pixel-7, galaxy-s24. Or use custom width/height. Emulate a mobile device by resizing window and setting user agent. Devices: iphone-14, iphone-14-pro-max, ipad, ipad-pro, pixel-7, galaxy-s24. Or use custom width/height.
safari_eval_file
from source
Execute JavaScript read from a FILE path (avoids passing huge scripts inline / manual copy). Same engine as safari_evaluate: extension-first (no focus steal), AppleScript fallback.… Execute JavaScript read from a FILE path (avoids passing huge scripts inline / manual copy). Same engine as safari_evaluate: extension-first (no focus steal), AppleScript fallback. Use to upload binary via a generated .js containing base64.
safari_evaluate
from source
Execute JavaScript in the current page (a returned Promise is awaited — fetch/timers work in background tabs; requestAnimationFrame never fires there). Automatically falls back to… Execute JavaScript in the current page (a returned Promise is awaited — fetch/timers work in background tabs; requestAnimationFrame never fires there). Automatically falls back to AppleScript when CSP blocks execution (e.g. Google Search Console, LinkedIn). For reading data, prefer safari_read_page or safari_snapshot. For interactions, prefer safari_click/fill with refs.
safari_export_storage
from source
Export all storage state (cookies + localStorage + sessionStorage) as JSON — useful for saving and restoring login sessions Export all storage state (cookies + localStorage + sessionStorage) as JSON — useful for saving and restoring login sessions
safari_extract_images
from source
Extract all images with src, alt, dimensions, loading strategy, viewport visibility Extract all images with src, alt, dimensions, loading strategy, viewport visibility
safari_extract_links
from source
Extract all links with href, text, rel, target, external/nofollow detection Extract all links with href, text, rel, target, external/nofollow detection
safari_extract_meta
from source
Extract all meta tags: title, description, canonical, OG tags, Twitter cards, JSON-LD, alternate languages, RSS feeds Extract all meta tags: title, description, canonical, OG tags, Twitter cards, JSON-LD, alternate languages, RSS feeds
safari_extract_tables
from source
Extract HTML tables as structured JSON (headers + rows). Perfect for scraping data tables. Extract HTML tables as structured JSON (headers + rows). Perfect for scraping data tables.
safari_fill
from source
safari_fill_and_submit
from source
Fill a form AND submit it in one operation. Finds submit button automatically if not specified. Fill a form AND submit it in one operation. Finds submit button automatically if not specified.
safari_fill_form
from source
Fill multiple form fields at once Fill multiple form fields at once
safari_get_computed_style
from source
Get computed CSS styles for an element. Optionally filter specific properties. Get computed CSS styles for an element. Optionally filter specific properties.
safari_get_console
from source
Get captured console messages (must call safari_start_console first) Get captured console messages (must call safari_start_console first)
safari_get_cookies
from source
Get cookies for the current page Get cookies for the current page
safari_get_element
from source
Get detailed info about an element (tag, text, rect, attributes, visibility) Get detailed info about an element (tag, text, rect, attributes, visibility)
safari_get_indexed_db
from source
Read records from an IndexedDB database store Read records from an IndexedDB database store
safari_get_source
from source
Get HTML source of current page Get HTML source of current page
safari_go_back
from source
Go back in browser history Go back in browser history
safari_go_forward
from source
Go forward in browser history Go forward in browser history
safari_handle_dialog
from source
Set up handler for the next alert/confirm/prompt dialog Set up handler for the next alert/confirm/prompt dialog
safari_hover
from source
Hover over element. Use ref, selector, or x/y Hover over element. Use ref, selector, or x/y
safari_import_storage
from source
Import storage state from JSON (as exported by safari_export_storage) — restores cookies, localStorage, sessionStorage Import storage state from JSON (as exported by safari_export_storage) — restores cookies, localStorage, sessionStorage
safari_inspect_viewport
from source
Validate the page Validate the page
safari_list_indexed_dbs
from source
List all IndexedDB databases on the current page List all IndexedDB databases on the current page
safari_list_tabs
from source
List every tab in this session List every tab in this session
safari_local_storage
from source
Get localStorage data for the current page Get localStorage data for the current page
safari_mock_route
from source
Intercept network requests matching a URL pattern and return a mock response. Works with both fetch and XHR. Useful for testing API error states, offline behavior, or replacing API… Intercept network requests matching a URL pattern and return a mock response. Works with both fetch and XHR. Useful for testing API error states, offline behavior, or replacing API responses.
safari_native_click
from source
safari_native_hover
from source
OS-level mouse hover via macOS CGEvent — moves the real cursor to an element to trigger native :hover / mouseenter handlers. Use for obfuscated UIs where JS-dispatched mouseenter i… OS-level mouse hover via macOS CGEvent — moves the real cursor to an element to trigger native :hover / mouseenter handlers. Use for obfuscated UIs where JS-dispatched mouseenter isn
safari_native_keyboard
from source
OS-level keyboard event via macOS CGEvent — sends a real keypress (with optional modifiers) to the Safari window WITHOUT activating Safari or stealing focus. Use when safari_press_… OS-level keyboard event via macOS CGEvent — sends a real keypress (with optional modifiers) to the Safari window WITHOUT activating Safari or stealing focus. Use when safari_press_key
safari_native_type
from source
safari_navigate
from source
Navigate this session Navigate this session
safari_navigate_and_read
from source
Navigate to a URL and return the page content in one step — saves 1 full round-trip vs navigate+read_page. Use instead of safari_navigate + safari_read_page. Navigate to a URL and return the page content in one step — saves 1 full round-trip vs navigate+read_page. Use instead of safari_navigate + safari_read_page.
safari_network
from source
Quick network overview via Performance API (no setup needed). Shows URLs and timing for resources loaded by the page. For detailed request/response info (headers, status codes, POS… Quick network overview via Performance API (no setup needed). Shows URLs and timing for resources loaded by the page. For detailed request/response info (headers, status codes, POST bodies), use safari_start_network_capture + safari_network_details instead.
safari_network_details
from source
Get captured network requests with full details (must call safari_start_network_capture first) Get captured network requests with full details (must call safari_start_network_capture first)
safari_new_tab
from source
Open a new background tab (never steals focus), optionally with a URL. Returns {tabIndex, safeUrl, receipt}. KEEP THE RECEIPT and pass it as Open a new background tab (never steals focus), optionally with a URL. Returns {tabIndex, safeUrl, receipt}. KEEP THE RECEIPT and pass it as
safari_override_geolocation
from source
Override the browser Override the browser
safari_paste_image
from source
Paste an image from a local file into the focused element via JS DataTransfer (no clipboard, no focus steal). Works on Medium, dev.to, HackerNoon, TOI, etc. Paste an image from a local file into the focused element via JS DataTransfer (no clipboard, no focus steal). Works on Medium, dev.to, HackerNoon, TOI, etc.
safari_performance_metrics
from source
Get detailed performance metrics: navigation timing, Web Vitals (FCP, LCP, CLS), resource breakdown, memory usage Get detailed performance metrics: navigation timing, Web Vitals (FCP, LCP, CLS), resource breakdown, memory usage
safari_press_key
from source
Press a keyboard key (enter, tab, escape, arrows, etc). Supports modifiers (cmd, shift, alt, ctrl). Press a keyboard key (enter, tab, escape, arrows, etc). Supports modifiers (cmd, shift, alt, ctrl).
safari_query_all
from source
Find all elements matching a CSS selector (returns tag, text, href, value) Find all elements matching a CSS selector (returns tag, text, href, value)
safari_react_select_list_options
from source
List available options of a react-select v5 dropdown without opening the menu. Returns JSON {ok, total, options:[{label,value}…]}. Useful when safari_react_select_set returns List available options of a react-select v5 dropdown without opening the menu. Returns JSON {ok, total, options:[{label,value}…]}. Useful when safari_react_select_set returns
safari_react_select_set
from source
safari_read_page
from source
Read page text content (title, URL, body text). Use for reading article text or page content. For interacting with elements, prefer safari_snapshot (gives ref IDs). Use selector to… Read page text content (title, URL, body text). Use for reading article text or page content. For interacting with elements, prefer safari_snapshot (gives ref IDs). Use selector to read specific element. Use maxLength to limit output.
safari_reload
from source
Reload the current page Reload the current page
safari_reload_extension
from source
safari_replace_editor
from source
Replace ALL content in a code editor (Monaco, CodeMirror, Ace, ProseMirror). Use ONLY for code editors — Airtable automations, GitHub gists, CodePen, n8n code nodes, etc. NOT for r… Replace ALL content in a code editor (Monaco, CodeMirror, Ace, ProseMirror). Use ONLY for code editors — Airtable automations, GitHub gists, CodePen, n8n code nodes, etc. NOT for rich text editors like Medium/LinkedIn (use safari_fill for those). Detects ProseMirror/Draft.js/CodeMirror/Monaco/Ace and uses their native API.
safari_reset_emulation
from source
Reset device emulation back to desktop mode Reset device emulation back to desktop mode
safari_resize
from source
Resize the Safari window Resize the Safari window
safari_right_click
from source
Right-click (context menu) an element by CSS selector or x/y coordinates Right-click (context menu) an element by CSS selector or x/y coordinates
safari_run_script
from source
safari_safe_area_insets
from source
Read the live CSS safe-area-inset values (top/right/bottom/left) as the page sees them, whether viewport-fit=cover is set, and whether env(safe-area-inset-*) is used in any stylesh… Read the live CSS safe-area-inset values (top/right/bottom/left) as the page sees them, whether viewport-fit=cover is set, and whether env(safe-area-inset-*) is used in any stylesheet. For notch / Dynamic Island layout debugging.
safari_save_pdf
from source
Save the current page as a PDF file. Uses screencapture + PDF rendering (no Safari UI interaction needed). Save the current page as a PDF file. Uses screencapture + PDF rendering (no Safari UI interaction needed).
safari_screenshot
from source
Take a visual screenshot (base64 JPEG). EXPENSIVE — use safari_snapshot instead for most tasks. Only use screenshot when you need to verify visual layout, styling, images, or color… Take a visual screenshot (base64 JPEG). EXPENSIVE — use safari_snapshot instead for most tasks. Only use screenshot when you need to verify visual layout, styling, images, or colors that snapshot can
safari_screenshot_element
from source
Take a screenshot of a specific element (by CSS selector). Returns base64 PNG image. Take a screenshot of a specific element (by CSS selector). Returns base64 PNG image.
safari_scroll
from source
Scroll the page up or down by a specified amount Scroll the page up or down by a specified amount
safari_scroll_to
from source
Scroll to a specific position on the page Scroll to a specific position on the page
safari_scroll_to_element
from source
Scroll to element by CSS selector OR text. For virtual DOM (Airtable) use text — scrolls down until text appears in DOM. Scroll to element by CSS selector OR text. For virtual DOM (Airtable) use text — scrolls down until text appears in DOM.
safari_select_option
from source
Select an option in a native <select> dropdown. Sets .value and dispatches change event. Pass Select an option in a native <select> dropdown. Sets .value and dispatches change event. Pass
safari_session_storage
from source
Get sessionStorage data for the current page Get sessionStorage data for the current page
safari_set_cookie
from source
Set a cookie on the current page Set a cookie on the current page
safari_set_local_storage
from source
Set a value in localStorage Set a value in localStorage
safari_set_session_storage
from source
Set a value in sessionStorage Set a value in sessionStorage
safari_snapshot
from source
PREFERRED way to see page state. Returns accessibility tree with ref IDs for every interactive element. Use refs with click/fill/type instead of CSS selectors. Workflow: snapshot →… PREFERRED way to see page state. Returns accessibility tree with ref IDs for every interactive element. Use refs with click/fill/type instead of CSS selectors. Workflow: snapshot → see refs → click({ref:
safari_start_console
from source
Start capturing console messages (log, warn, error, info). Call once per page. Start capturing console messages (log, warn, error, info). Call once per page.
safari_start_network_capture
from source
Start capturing detailed network requests (fetch + XHR) with headers, status, timing. Call once per page. Intercepts fetch/XHR — captures requests AFTER this call only. For quick o… Start capturing detailed network requests (fetch + XHR) with headers, status, timing. Call once per page. Intercepts fetch/XHR — captures requests AFTER this call only. For quick overview of already-loaded resources, use safari_network instead.
safari_switch_tab
from source
Switch the MCP session Switch the MCP session
safari_throttle_network
from source
Simulate slow network conditions. Profiles: slow-3g, fast-3g, 4g, offline. Or custom latency/speed. Call with no args to reset. Simulate slow network conditions. Profiles: slow-3g, fast-3g, 4g, offline. Or custom latency/speed. Call with no args to reset.
safari_type_text
from source
safari_upload_file
from source
Upload a file to a <input type= Upload a file to a <input type=
safari_verify_state
from source
Verify the framework-level state of an editor/input matches the expected value. Returns JSON {match, mode, actual, expected, hint?}. Modern editors (ProseMirror, Lexical, Closure,… Verify the framework-level state of an editor/input matches the expected value. Returns JSON {match, mode, actual, expected, hint?}. Modern editors (ProseMirror, Lexical, Closure, React-controlled inputs) maintain state separately from the DOM —
safari_wait
from source
Wait for a fixed time in milliseconds. Use only when you need a brief pause between actions. PREFER safari_wait_for (waits for element/text to appear) — it Wait for a fixed time in milliseconds. Use only when you need a brief pause between actions. PREFER safari_wait_for (waits for element/text to appear) — it
safari_wait_for
from source
Wait for an element or text to appear on the page Wait for an element or text to appear on the page
safari_wait_for_new_tab
from source
Wait for a new tab to appear (e.g. after OAuth login click opens popup). Automatically switches to the new tab. Wait for a new tab to appear (e.g. after OAuth login click opens popup). Automatically switches to the new tab.
safari_webkit_compat
from source