A side-by-side look at the Safari MCP and Charlotte MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Safari MCP for browser automation work as a local process; choose Charlotte for browser automation as a local process. You can also run both side by side in one mcpServers block.
safari_navigate, safari_go_back, safari_go_forward.charlotte_navigate, charlotte_back, charlotte_forward.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Browser Automation | Browser Automation |
| Quality signal | 67/100 · Great | 68/100 · Great |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | No auth required | Not declared |
| Pricing | Free | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 220 | 182 |
| Directory activity | 4 views 0 installs 0 upvotes | 2 views 0 installs 0 upvotes |
| Tools | 80 | 23 |
| Full listing | View Safari MCP | View Charlotte |
safari_navigateNavigate to URL (auto HTTPS, wait for load)safari_go_backGo back in historysafari_go_forwardGo forward in historysafari_reloadReload page (optional hard reload)safari_read_pageGet title, URL, and text contentsafari_get_sourceGet full HTML sourcesafari_navigate_and_readNavigate + read in one callsafari_clickClick by CSS selector, visible text, or coordinatessafari_double_clickDouble-click (select word, etc.)safari_right_clickRight-click (context menu)safari_hoverHover over elementsafari_click_and_waitClick + wait for navigationcharlotte_navigateLoad a URL in the active page. Returns page representation after navigation. Default minimal detail includes landmarks, headings, and interactive element counts — use charlotte_find to locate specific elements, or pass detail: 'summary' to get the full element list.charlotte_backNavigate back in browser history. Returns page representation after navigation.charlotte_forwardNavigate forward in browser history. Returns page representation after navigation.charlotte_reloadReload the current page. Returns page representation after reload.charlotte_observeGet current page state without performing any action. Use detail levels to control verbosity: "minimal" for landmarks, headings, and interactive element counts by landmark (use charlotte_find to get specific elements with actionable IDs, or observe({ detail: "summary" }) to see all elements), "summary" (default) for content summaries and full element list, "full" for all text content. Use view: "tree" for a compact structural outline (cheapest orientation tool), or view: "tree-labeled" to include labels on interactive elements (still much cheaper than minimal JSON, and shows which button/link/input is which).charlotte_findSearch for elements matching criteria. Filters interactive elements by text, role, type, or spatial proximity. Use the selector parameter to find DOM elements by CSS selector — this reaches elements not in the accessibility tree (custom widgets, non-semantic divs). Selector results return Charlotte element IDs usable with click, hover, drag, etc.charlotte_screenshotCapture a visual screenshot. Fallback for when structured representation isn't sufficient (complex visualizations, canvas elements, images). Use save: true to persist as a file artifact that can be referenced later.charlotte_screenshotsList all saved screenshot artifacts. Returns metadata for each saved screenshot including ID, filename, page URL, and timestamp.charlotte_screenshot_getRetrieve a previously saved screenshot artifact by its ID. Returns the image data and metadata.charlotte_screenshot_deleteDelete a saved screenshot artifact by its ID. Removes the file from disk.charlotte_diffCompare current page state to a previous snapshot. Returns structural diff showing added, removed, moved, and changed elements.charlotte_clickClick an interactive element on the page. Returns full page representation after the click.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"achiya-automation-safari-mcp": {
"command": "npx",
"args": [
"safari-mcp"
]
}
}
}
{
"mcpServers": {
"charlotte": {
"command": "npx",
"args": [
"@ticktockbent/charlotte"
]
}
}
}