safari-browser-mcp
Drives the user's real Safari browser on macOS, allowing tabs to be listed, created, selected and closed; pages to be navigated, read as text or outlined with stable element refs; and interactions such as clicking, filling forms, pressing keys, scrolling, running JavaScript and capturing window screenshots.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@safari-browser-mcpOpen a new tab, search Hacker News for MCP, and summarize the top three results."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
safari-browser-mcp
Let Claude drive Safari the way Claude in Chrome drives Chrome.
This is an MCP server for macOS. Hook it up to Claude Code, the Claude desktop app or any other MCP client, and Claude can open tabs, read pages, click, fill forms, press keys, run JavaScript and take screenshots in your real Safari, with your real sign-ins.
Unofficial community project. Not affiliated with or endorsed by Anthropic or Apple.
How it works
Claude in Chrome is a Chrome extension. Safari can't run it, but Safari has a built-in scripting interface, so this server controls Safari from the outside:
Tabs and navigation go through Safari's JavaScript for Automation API (
osascript -l JavaScript).Reading and interacting with pages uses Safari's
do JavaScriptto run small scripts inside the tab. Elements get stableref_Nids so Claude can click or type into them later.Screenshots use
screencaptureon the Safari window.Key presses use System Events.
No browser extension and no Safari WebDriver session is needed. Claude works in the Safari you already have open.
Related MCP server: claudeForSafari
Tools
Tool | What it does |
| List open tabs ( |
| Open a new tab, optionally at a URL |
| Bring a tab to the front / close it |
| Load a URL, or |
| Readable text of the page |
| Outline of the page with |
| Search elements by role, name or text |
| Click by ref or CSS selector |
| Set inputs, textareas, selects, checkboxes; optionally submit |
| Real key presses, e.g. |
| Scroll the page or scroll an element into view |
| Run JS in the page ( |
| PNG of the Safari window |
Every page tool takes an optional tab. Without it, it uses the active tab of the front window.
Setup
Requires macOS and Node.js 18 or newer.
git clone https://github.com/riguillen1972/safari-browser-mcp.git
cd safari-browser-mcp
npm install1. Let Safari run JavaScript from automation
Safari > Settings > Advanced > turn on Show features for web developers.
In the menu bar: Develop > Allow JavaScript from Apple Events.
2. Add it to Claude
Claude Code:
claude mcp add safari -- node /absolute/path/to/safari-browser-mcp/src/index.jsClaude desktop app: add this to ~/Library/Application Support/Claude/claude_desktop_config.json, then restart the app:
{
"mcpServers": {
"safari": {
"command": "node",
"args": ["/absolute/path/to/safari-browser-mcp/src/index.js"]
}
}
}3. Approve the macOS prompts
The first time Claude uses it, macOS asks for permission for the app that runs the server (Terminal, iTerm, Claude, …):
Permission | Needed for | Where |
Automation → Safari | everything | prompted automatically |
Screen Recording |
| System Settings > Privacy & Security |
Accessibility |
| System Settings > Privacy & Security |
Check it works
With Safari open:
npm run smokeIt prints the tool list and your open tabs.
Try it
Open a new Safari tab, search Hacker News for "MCP" and summarise the top three results.
In my current Safari tab, fill in the contact form with test data but don't submit it.
Limits
clickandform_inputdispatch DOM events. They work on almost all sites, but a site that checksevent.isTrustedwill ignore them. Usepress_keyorjavascriptas a fallback.Pages inside cross-origin iframes can't be read or controlled.
screenshotandpress_keybring Safari to the front.Private windows can't be scripted.
Safety
Claude acts as you, in your signed-in browser. Watch what it does, keep sensitive tabs closed, and don't let it act on instructions it reads on web pages.
License
MIT
Available Tools
14 toolsclickB
Click an element by ref (from read_page/find) or CSS selector.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden for a real-world side-effecting action. It says nothing about whether the click waits for navigation/load, whether the element is scrolled into view or actionability-checked, what happens when the selector matches multiple or zero elements, or whether errors are raised or returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the action and its two targeting options come first. It is efficient but so terse that the tab-scoping default and mutual exclusivity are left entirely implicit.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Treating the description as a one-line definition of a browser action tool, it is complete enough to know what the tool does and how to target an element. The missing operational details (waiting, error handling, ref/selector precedence) are real gaps for a side-effecting action, so this is generous rather than a clean 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 33% — only 'tab' is documented in the schema, and the description usefully adds that 'ref' originates from read_page/find. However, neither the description nor the schema explains filter syntax for 'selector', which parameter wins when both are supplied, or that exactly one of ref/selector is expected despite required=[] allowing none at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (click) and the two targeting mechanisms (element ref or CSS selector), and names the sibling tools that produce refs (read_page/find). An agent can tell this apart from form_input, press_key and navigate without opening the schema, though it never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(from read_page/find)' implies the prerequisite workflow for refs, but there is no explicit when-to-use/when-not guidance, no statement of which targeting mode to prefer, and no mention of how this differs from press_key or form_input for interactive elements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findB
Find visible elements whose role/name/text contains the query. Returns up to 20 refs.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden but does disclose two real behavioral facts: only visible elements are matched, and results are capped at 20. It does not say what happens when more than 20 elements match (silent truncation?), whether matching is case-insensitive, or whether refs expire or are reusable across calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the matching semantics and ending with the result limit. Nothing is redundant and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should explain the return shape more fully. It says results are "refs" capped at 20 but never describes what a ref looks like or whether role/name come back with it, leaving the agent partially blind on a two-parameter tool whose output is the whole point.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, with `query` documented only as a bare string in the schema; the description compensates by explaining that it is substring-matched against role, name, and text. The `tab` parameter is well documented in the schema itself, so the remaining gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Find visible elements") plus the matching dimensions (role/name/text) and the result cap. This is enough to distinguish it from siblings like get_page_text or read_page, which retrieve content rather than locate interactable elements, though the description never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus read_page, get_page_text, or tabs_list, and no exclusions or prerequisites. The mention of "refs" implies a find-then-click workflow, but the agent must infer that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
form_inputB
Set the value of an input, textarea, select, checkbox or contenteditable. Optionally submit its form.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| value | Yes | ||
| submit | No | ||
| selector | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations, the description carries the full burden. It does earn credit for disclosing the important side effect that the form may be submitted, which is behavior beyond a plain value set. But it says nothing about how the target element is resolved, what happens if the element is missing or ambiguous, or whether events are dispatched so frameworks register the change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and the covered element types, ending with the optional side effect. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, no-annotation, no-output-schema browser mutation tool, this is under-specified: no element-resolution rule, no error behavior, no mention of what the call returns or how to confirm the value took effect. An agent would have to guess at the ref/selector contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% — just the 'tab' parameter is documented. The description does not explain the ref-versus-selector choice or precedence, why 'value' accepts string/boolean/number (boolean for checkbox), or what 'submit' actually triggers. It leaves the majority of parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Set the value of') and enumerates the exact element types it handles (input, textarea, select, checkbox, contenteditable), which distinguishes it from the click or press_key siblings. It stops short of naming an alternative or stating the resolution model, so it's clear but not differentiated against siblings by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The element-type list implies when to reach for this tool rather than click or press_key, but usage is only implied. There is no explicit statement of prerequisites (that a ref or selector must first come from find/read_page) and no when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_textB
Get the readable text of the page (main/article first, else body).
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| max_chars | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the content-selection behavior ('main/article first, else body'), which is beyond the schema. However, it does not mention truncation behavior for max_chars, whether the operation is read-only, or what the return value looks like beyond being text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. The parenthetical adds useful extraction behavior without bloating the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter text extraction tool, the description covers the core behavior, but because there is no output schema and no annotations, it should mention truncation via max_chars and the return format. It is minimally adequate but leaves meaningful gaps for an agent relying solely on the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: the tab parameter is described in the schema, but max_chars has no description in the schema or the tool description. The description adds no parameter meaning and does not compensate for the undocumented truncation parameter. Baseline would be 3 if schema coverage were high, but here the description must do more.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get the readable text of the page.' The parenthetical clarifies extraction priority (main/article first, else body), so the agent knows exactly what content is returned. It does not distinguish this tool from the sibling read_page, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to use it instead of siblings like read_page, find, or javascript. There are no exclusions or alternative-selection cues; usage is only implied by the purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
javascriptA
Run JavaScript in the page. Write a function body and return the value you want (await is allowed). Result is JSON-serialised.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| code | Yes | ||
| timeout_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that code runs in the page, may use await, and that the result is JSON-serialised, but it omits side effects, permissions/security implications, timeout behavior, and error semantics for a powerful arbitrary-execution tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler, and the core execution contract is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives enough to write a return-producing code snippet, but for an arbitrary JavaScript execution tool with no annotations and no output schema, it should also cover timeout behavior, error handling, and side-effect expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%. The description compensates for the undocumented code parameter by explaining the function-body and return contract, and tab is covered by the schema, but timeout_ms is undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run JavaScript in the page.' It is clearly distinct from the browser-interaction siblings such as click, navigate, and read_page, though it does not explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent how to structure the code parameter ('Write a function body and return the value you want') and that await is allowed. However, it gives no explicit when-to-use guidance versus siblings or when-not-to-use conditions for arbitrary page scripting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
press_keyA
Send real key presses to Safari, e.g. "Return", "Tab", "cmd+l", "shift+tab". Needs Accessibility permission.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| repeat | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that these are "real key presses" and that Accessibility permission is needed, but it does not describe side effects, failure behavior when permission is missing, target-focus requirements, or whether shortcuts like cmd+q/cmd+w can be dangerous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, front-loading the purpose and examples before the permission prerequisite. Every sentence adds useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter action tool with no output schema, the description covers the main purpose, key format examples, and the Accessibility prerequisite. It is still missing repeat semantics and behavioral details around focus and error handling, which are important given the absence of annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates partially by giving concrete key-string examples like "Return", "Tab", "cmd+l", and "shift+tab". It does not explain the optional repeat parameter or its 1-100 range, leaving half the parameters undocumented beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: sending real key presses to Safari, with concrete key examples such as "Return", "Tab", and "cmd+l". It is clearly distinct from sibling mouse/text-entry tools like click and form_input, though it does not explicitly name or contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the examples and by the note that Accessibility permission is required, making it clear this is for keyboard shortcuts in Safari. However, it does not state when to prefer this over click, form_input, or javascript, nor does it describe when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_pageB
Read the page as an outline. Interactive elements get [ref_N] ids usable with click / form_input / scroll.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| filter | No | all | |
| max_chars | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose the output shape (outline) and the ref_N linking mechanism. However it says nothing about truncation via max_chars, what 'outline' omits (e.g. plain text, hidden nodes), or that omitting `tab` targets the front window's active tab.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and then the actionable detail about ref ids and which follow-up tools consume them. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description should explain the return structure and truncation more fully. It covers the ref mechanism adequately but leaves the filter and size-limit parameters — and any indication of content being cut off — undocumented, so an agent can call it but cannot predict the response well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: `tab` is documented in the schema, but `filter` and `max_chars` have no descriptions there. The description does not compensate at all — it never mentions the all-vs-interactive filter or the character cap / truncation behavior, both of which materially change the result.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the page as an outline') and adds the key output trait: interactive elements carry [ref_N] ids. It implicitly distinguishes itself from get_page_text by promising an outline rather than raw text, but never names that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the entry point for obtaining refs before calling click / form_input / scroll. There is no explicit 'use this instead of get_page_text when...' routing or any exclusion, so a caller must infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
screenshotA
Screenshot the Safari window (brings it to the front). Needs Screen Recording permission.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose two non-obvious behaviors: it brings the window to the front (a focus-stealing side effect) and it requires Screen Recording permission (a likely failure mode). It omits what the call returns — image content versus a file path — which matters for a screenshot tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact parenthetical sentences with zero waste. The action is front-loaded and both supplementary facts (fronting behavior, permission need) earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The permission prerequisite and side effect cover the main failure modes, but with no output schema the description never indicates the return format — whether the agent receives image data, a path, or metadata. For a screenshot tool that is a meaningful gap in an otherwise lean definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'tab' parameter is fully documented in the schema, including the 'omit for active tab' default. The description adds nothing about the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Screenshot the Safari window.' An agent can tell this captures a visual image, distinct from text-extraction siblings like get_page_text or read_page. It does not explicitly name those siblings as alternatives, keeping it at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the scope ('the Safari window') — the agent must infer that this is the tool for visual capture rather than page content. No explicit when-to-use or when-not-to-use guidance is given, and no alternative tools are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scrollB
Scroll the page by ticks in a direction, or scroll an element (ref) into view.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| tab | No | Tab id "windowId:tabIndex" from tabs_list. Omit for the active tab of the front window. | |
| amount | No | ||
| direction | No | down |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full disclosure burden. It does not say whether scrolling is instant or animated, whether the call waits for scroll completion, what happens when ref is not found or scrolls off-page, or whether the operation is safe/reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with two well-packed clauses and zero filler; both modes are stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter UI action with no annotations and no output schema, the description covers the two modes adequately but omits failure behavior, return semantics, and tick magnitude, which an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only tab is documented), so the description has to compensate. It does add meaning to amount ('ticks') and ref ('element to scroll into view'), but leaves the size of a tick, the default of 5, the 1-50 bounds, and the interaction between ref and direction entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (scroll the page) and names both operating modes: by ticks in a direction, or by ref into view. It is clearly distinct from siblings like click or navigate, though it does not explicitly say so.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'or' clause implies when to supply ref (scroll an element into view) versus amount/direction (scroll the page), but it gives no explicit guidance on when to choose this tool over read_page, find, or screenshot, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_closeC
Close a tab.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing. It implies a destructive/irreversible mutation but says nothing about losing unsaved state, error conditions, or whether the closed tab's history is affected. Only the bare verb hints at the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single short sentence is front-loaded and wastes no words, but its brevity reflects under-specification rather than disciplined conciseness. There is room to add the essential missing context without bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-parameter tool with no annotations and no output schema, the description should state how the tab is identified and what happens on failure or when closing the last tab. Neither is covered, leaving the agent unable to call it reliably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'tab' parameter, and the description adds no clarification about whether it expects a tab ID, index, or URL. With one required parameter fully undocumented in both schema and description, the agent has to guess the identifier format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb (Close) and resource (a tab), which unambiguously separates it from siblings like tabs_create, tabs_list, and tabs_select. It lacks any scope detail (active tab vs. background tab), which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as tabs_select or navigate. No prerequisites, no note on what happens if the tab is the last one or currently active. The agent must infer all of this.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_createA
Open a new Safari tab (optionally at a URL) and make it active.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the burden. It does disclose the meaningful side effect ('make it active'), which tells the agent focus changes, but says nothing about whether a browser-automation permission prompt occurs, what is returned (tab handle/id), or what happens on an invalid URL.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the core action front-loaded and the optional-parameter note in parentheses; nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, non-annotated mutation tool this covers the essentials, but with no output schema the description never says what a caller gets back (a tab identifier is critical for chaining tabs_select/tabs_close), leaving a real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single parameter. It conveys that url is optional and is the initial page to load, but adds no format hints (scheme requirements, defaults such as blank tab) beyond the property name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Open a new Safari tab') plus the side effect of activation, so it is clearly distinct from tabs_list/tabs_close in spirit. It does not explicitly distinguish itself from 'navigate' (which presumably loads a URL in the existing tab), leaving that differentiation to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(optionally at a URL)' implies when the url parameter is worth passing, but there is no explicit guidance on when to create a tab versus reusing one with tabs_select or navigate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_listA
List every open Safari tab with its id, title and URL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and 'List every open ... tab' makes the read-only, non-mutating nature unambiguous. It also discloses the shape of what comes back (id, title, URL), which is the key behavioral fact for a caller. The remaining gap is that it does not say whether all windows/private tabs are covered or how results are ordered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scope, resource and returned fields all land immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey the return shape and it does (id, title, URL). It stops short of saying whether results span multiple windows, include non-active tabs, or are ordered, which an agent may want before enumerating.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is nothing parameter-level to explain and the baseline applies. The description usefully clarifies that the output includes an id alongside title and URL rather than only naming the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('List') plus specific resource ('every open Safari tab') and it names the returned fields. It is clearly distinguishable from siblings like tabs_select, tabs_close, read_page and get_page_text, which act on a single tab or page content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope 'every open tab' implies it is the enumeration step before tabs_select/tabs_close, and the result fields suggest a discovery role. But it never says when to prefer this over read_page or get_page_text, or that selection/close requires an id first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tabs_selectC
Bring a tab to the front.
| Name | Required | Description | Default |
|---|---|---|---|
| tab | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing beyond the one-line action. It doesn't say what happens if the tab isn't found, whether the switch persists for later tool calls, or whether any permissions/state are involved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; it is efficient rather than verbose. The brevity is under-specification rather than wasted text, but the structure itself is clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, no output schema, and an undocumented required parameter, the description should at minimum identify the identifier format and the effect on tab state. Neither is present, leaving the agent to guess how to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 0% schema coverage, and the description never explains what the 'tab' string should contain (ID, URL, title, or index). With low coverage the description is expected to compensate for the schema, and it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete action (bring to front) on a concrete resource (a tab), which is distinguishable from siblings like tabs_list, tabs_create, and tabs_close. It stops short of 5 because 'the front' is slightly colloquial and the description doesn't clarify whether this activates the tab for the browser or for subsequent tool calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this rather than alternatives, and no prerequisite stated (e.g., that the tab must already exist or that an identifier typically comes from tabs_list). The agent must infer the entire call context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
click - First observed
find - First observed
form_input - First observed
get_page_text - First observed
javascript - First observed
navigate - First observed
press_key - First observed
read_page - First observed
screenshot - First observed
scroll - First observed
tabs_close - First observed
tabs_create - First observed
tabs_list - First observed
tabs_select
TDQS
Scored across 14 tools
Tab lifecycle tools (tabs_*) are cleanly separated from page-interaction tools, and click/find/read_page have clear distinct roles. Minor overlaps exist: get_page_text vs read_page both return page content, find returns refs like read_page does, and tabs_create can open a URL that navigate also handles, but descriptions make the intended split reasonably clear.
Everything is snake_case, with a coherent noun_verb grouping for tab operations (tabs_list, tabs_create, tabs_select, tabs_close). The rest are bare verbs (navigate, click, find, scroll, screenshot), which is a deviation from the verb_noun pattern but is a systematic and readable split between tab management and page actions.
14 tools is squarely in the well-scoped range for a browser automation server. Each tool maps to a distinct capability (tab control, navigation, reading, interaction, scripting, capture) with no obvious redundancy.
Covers the full loop of tab management, navigation, reading (text/outline/find), interaction (click, form_input, press_key, scroll), JS execution, and screenshots. Minor gaps remain: no explicit wait-for-load tool, no hover, and no history/cookie or window management, though javascript can work around some of these.
Maintenance
Related MCP Connectors
Control a real browser from AI agents: navigate, click, type, screenshot, read the page.
Hosted browser for agents: open pages, search the web, extract data, read PDFs and take screenshots.
Give AI agents a real cloud Chrome: open sessions, navigate, read pages, click, type and screenshot.
181Hosted real Google Chrome MCP with per-user persistent state. Navigate, click, type, screenshot.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides AI assistants with Safari browser automation and developer tools access, enabling LLMs to control Safari, access console logs, monitor network activity, and perform browser automation tasks.139 npm33MIT
- AlicenseAqualityAmaintenanceSafari Web Extension + Node.js MCP bridge giving Claude Desktop full control over Safari — navigate, read pages, click elements, fill forms, and manage tabs. No Playwright or WebDriver dependency.4131MIT
- AlicenseNot gradedqualityDmaintenanceEnables browser automation through the Claude Chrome Extension, allowing agents to navigate websites, fill forms, take screenshots, and debug web apps via standard MCP protocols.1MIT
- FlicenseNot gradedqualityDmaintenanceProvides browser automation capabilities through Claude Desktop and other MCP clients, enabling navigation, screenshot capture, content extraction, and interactive control.-