safari-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| safari_tabsA | List every open tab across every Safari window. Each entry has window_index, tab_index, url, title, and is_current (whether it's that window's frontmost tab). |
| safari_openA | Navigate Safari to a URL. Reuses the real, already-logged-in Safari session (cookies, extensions, everything) rather than a separate automation profile. With new_tab=True opens a new tab; otherwise navigates the frontmost window's current tab in place. Waits for the page to finish loading by default so the returned title is accurate. |
| safari_closeA | Close a Safari tab. Omit both arguments to close the frontmost window's current tab. |
| safari_readA | Read a Safari tab's URL, title, and visible text (document.body's innerText). Set include_html=True to also get the full outerHTML. Omit window/tab to read the frontmost window's current tab. |
| safari_jsB | Evaluate arbitrary JavaScript in a Safari tab's page context and return the string-coerced result. Requires Safari's Develop menu > 'Allow JavaScript from Apple Events' to be enabled. |
| safari_clickA | Click the first element matching a CSS selector in a Safari tab. Returns found=False (not an error) if nothing matched the selector. |
| safari_fillA | Set an /'s value via a CSS selector, dispatching real 'input'/'change' events so JS-framework-backed forms (React, Vue, ...) observe the change. Returns found=False (not an error) if nothing matched the selector. |
| safari_element_existsC | Check whether a CSS selector matches any element in a Safari tab. |
| safari_wait_forA | Poll a Safari tab until a CSS selector matches an element, or time out. Useful after a click/navigation that loads content asynchronously. Returns found=False (not an error) on timeout. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 9 tools
Each tool targets a distinct action: tab-level operations (open, close, tabs) vs. page-level interactions (read, click, fill, js) vs. condition checks (element_exists, wait_for). The only conceivable overlap is between element_exists and wait_for, but one is a one-shot check and the other is a polling operation, so the descriptions make them unambiguous.
All tools share the consistent 'safari_' prefix and lowercase snake_case style, and most use a verb-like action word (close, read, click, fill, open). Minor deviations exist: 'safari_tabs' is a noun rather than a verb phrase like 'list_tabs', and 'safari_element_exists' is a noun+verb predicate, but the overall pattern remains predictable.
Nine tools is a well-scoped size for a Safari automation server, covering navigation, tab management, page reading, and DOM interaction without unnecessary bloat. Each tool earns its place for a focused browser-automation purpose.
The core workflows are covered: open URLs, read page content, interact via click/fill/JS, wait for elements, and manage tabs. Minor gaps exist, such as no explicit back/forward navigation, no screenshot capability, and no direct 'activate tab' tool, but these are workaroundable and the essential lifecycle of browsing automation is present.