Loading...
Loading...
Safari browser automation CLI on macOS via safari-mcp. Controls real Safari (native, keeps logins) by wrapping the safari-mcp MCP server. Every one of the 84 MCP tools is exposed 1:1 with schema-accurate arguments — guaranteed parity, no manual drift.
npx skill4agent add hkuds/cli-anything cli-anything-safarisafari-mcpsafari-mcpresources/tools.jsonsafari-mcpcli-anything-safari --json tool snapshot | jq '...'brew install nodecd safari/agent-harness
pip install -e .toolsafari-mcp| Command | Purpose |
|---|---|
| Call any of safari-mcp's 84 tools (dynamic, schema-driven) |
| Inspect the bundled tool registry ( |
| Escape hatch — call a tool by full name with raw JSON args |
| In-memory session state (last URL, current tab) |
| Interactive REPL (default when no subcommand given) |
# Count of tools (sanity check — must match safari-mcp's registered tools)
cli-anything-safari tools count
# → 84
# List every tool
cli-anything-safari tools list
cli-anything-safari tools list --filter click # filter by substring
# Full schema for one tool (JSON or human format)
cli-anything-safari tools describe safari_scroll
cli-anything-safari --json tools describe safari_click# Navigate
cli-anything-safari tool navigate --url https://example.com
# Take a snapshot (preferred over screenshot — structured text with ref IDs)
cli-anything-safari --json tool snapshot
# Click by ref (refs come from snapshot; they expire on the next snapshot!)
cli-anything-safari tool click --ref 0_5
# Click by selector or visible text
cli-anything-safari tool click --selector "#submit"
cli-anything-safari tool click --text "Log in"
# Fill a field
cli-anything-safari tool fill --selector "#email" --value "user@example.com"
# Scroll by direction/amount (NOT x/y — note the schema!)
cli-anything-safari tool scroll --direction down --amount 500
# Drag one element onto another
cli-anything-safari tool drag \
--source-selector ".card" \
--target-selector ".trash"
# Screenshot — returns base64 JPEG in stdout. Decode with:
cli-anything-safari --json tool screenshot --full-page \
| python3 -c "import sys,json,base64; \
d=json.load(sys.stdin); \
open('/tmp/shot.jpg','wb').write(base64.b64decode(d['data']))"
# Save as PDF (this one writes to disk directly)
cli-anything-safari tool save-pdf --path /tmp/page.pdf
# Evaluate JavaScript (note: parameter is --script, not --code)
cli-anything-safari tool evaluate --script "document.title"cli-anything-safari --json tool navigate-and-read --url https://example.comsafari_fill_form{selector, value}cli-anything-safari tool fill-form --fields '[
{"selector": "#email", "value": "user@example.com"},
{"selector": "#password", "value": "hunter2"}
]'cli-anything-safari tools describe safari_fill_formcli-anything-safari tool start-network-capture
cli-anything-safari tool navigate --url https://example.com
cli-anything-safari --json tool network
cli-anything-safari tool performance-metricscli-anything-safari tool get-cookies
cli-anything-safari tool set-cookie --name session --value abc123 --domain example.com
cli-anything-safari tool local-storage --key theme
# export-storage returns JSON to stdout — no --path arg. Pipe to a file:
cli-anything-safari --json tool export-storage > /tmp/storage.jsoncli-anything-safari raw safari_evaluate \
--json-args '{"code":"[...document.querySelectorAll(\"a\")].map(a => a.href)"}'cli-anything-safari--jsoncli-anything-safari --json tool snapshot
cli-anything-safari --json tool list-tabs
cli-anything-safari --json tools listlast_urltool navigatetool navigate-and-readtool new-tabcurrent_tab_indextoolnpx safari-mcpHARNESS.mdTEST.mddict--json# Human output
cli-anything-safari tool snapshot
# JSON output for agents
cli-anything-safari --json tool snapshot
cli-anything-safari --json tools list
cli-anything-safari --json tools describe safari_click--jsontools describe <name>tool save-pdf --path /tmp/x.pdftool upload-file --selector ... --file-path /tmp/x.txt--file-path--pathtool export-storagetool import-storage --path /tmp/x.jsontool screenshotscreenshot-elementtool snapshottools listtools describe <name>safari_evaluate--script--code# Find all click-related tools
cli-anything-safari tools list --filter click
# Get the full schema (including every argument with type, description,
# required/optional, enum choices, defaults)
cli-anything-safari --json tools describe safari_clicktool snapshottool screenshottool click --reftool click --selectortool navigate-and-readnavigateread-pagetool click-and-readclickread-pagetool native-clicktool snapshot0_10_20_31_11_21_3tool new-tab --url ...npx not foundsafari-mcp package not found on npm registryNot macOSAppleScript deniedBlocked URL scheme: filesafari_navigatesafari_navigate_and_readsafari_new_tabfilejavascriptdatavbscriptaboutchromesafariwebkitx-applerawcli_anything.safari.utils.safari_backend.call()tool navigatetool navigate-and-readtool new-tabraw safari_navigate*urlutils/security.pyCLI_ANYTHING_SAFARI_BLOCK_PRIVATE=1SAFARI_PROFILEexport SAFARI_PROFILE="Automation"
cli-anything-safari tool navigate --url https://example.comtool evaluatetool run-scripttool clipboard-readtool clipboard-writesafari-mcppython scripts/extract_tools.py \
"$(npm root -g)/safari-mcp/index.js" \
cli_anything/safari/resources/tools.jsontest_parity.pycli_anything/safari/README.mdcli_anything/safari/tests/TEST.mdsafari/agent-harness/SAFARI.mdcli-anything-plugin/HARNESS.mdcli-anything-plugin/guides/mcp-backend.mdscripts/extract_tools.py