safari-mcp
npm
v2.19.0
Source verified
Published by achiya-automation — publish provenance cryptographically ties this package to that repository. That is proof of origin, not an official vendor package.
Automates Safari natively on macOS with 96 tools via AppleScript and JavaScript, with no Chrome dependency.
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 1.2 = 99. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −1.2 | Package runs install-time scripts MTC-SUP-010 | supply-chain |
2. Client adoption risk — 99 − 6 = 93. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −6 | capability blast radius (high) — client exposure if the model is manipulated |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`safari.js:4249`): Reading private keys / cloud credentials, or serializing the whole environment, is a sensitive-data source that becomes exfiltration when combined with any egress. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ssh', '.gnupg', '.aws', '.config/gcloud', 'credentials', '.env', '.npmrc', '.netrc', 'id_rsa', 'id_ed25519', '.keychain'
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server safari.js
Tool "safari_eval_file" appears to run shell commands or evaluate code (keyword "eval" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.
Fix: Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.
Location: tool safari_eval_file
Tool "safari_run_script" appears to run shell commands or evaluate code (keyword "run_script" in tool name). Arbitrary execution driven by model input is one of the most dangerous MCP capabilities; combined with any untrusted input it becomes RCE.
Fix: Sandbox execution, allowlist commands/arguments, and never pass model output to a shell unescaped.
Location: tool safari_run_script
In the server's implementation (`index.js:23`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ecFileSync } from "node:child_process"; import { readFileSync, writeFileSync, existsSync, mkdirSync, unlinkSync, renameS
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server index.js
In the server's implementation (`safari.js:6`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: spawnSync } from "node:child_process"; import { promisify } from "node:util"; import { tmpdir, homedir } from "node:os"
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server safari.js
Untrusted-input tools ([safari_evaluate, safari_mock_route, safari_start_network_capture, safari_extract_meta]) co-exist with external-action tools ([safari_eval_file, safari_upload_file, safari_run_script]). A prompt injection could cause unwanted external actions, though no direct sensitive-data leak path was found.
Evidence: untrusted [safari_evaluate, safari_mock_route, safari_start_network_capture, safari_extract_meta] → sinks [safari_eval_file, safari_upload_file, safari_run_scri
Fix: Require confirmation for state-changing/egress actions triggered after processing untrusted content.
Location: flow safari_evaluate → safari_eval_file
Tool "safari_eval_file" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.
Fix: Declare accurate annotations, and gate destructive tools on user confirmation regardless.
Location: tool safari_eval_file
Tool "safari_run_script" can mutate/egress but declares no destructiveHint. Clients that don't default to spec-safe behavior may not prompt before running it.
Fix: Declare accurate annotations, and gate destructive tools on user confirmation regardless.
Location: tool safari_run_script
In a packaging/dev/install script (shipped, but not the server runtime) (`scripts/postinstall.cjs:6`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: spawnSync } = require("child_process"); const fs = require("fs"); const c = { reset: "\x1b[0m", bold: "\x1b[1m",
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server scripts/postinstall.cjs
"safari-mcp" executes postinstall script(s) at install time. An install hook runs at install time; most are routine build/setup, but review what it does before trusting it.
Evidence: node scripts/postinstall.cjs || true
Fix: Review the scripts; install with --ignore-scripts where possible and vet what they do.
Location: package safari-mcp
Each tool and what it can reach — statically extracted from the published source.
safari_eval_fileruns code / shellsafari_evaluateingests untrusted inputsafari_extract_metaingests untrusted inputsafari_mock_routeingests untrusted inputsafari_run_scriptruns code / shellsafari_start_network_captureingests untrusted inputsafari_upload_filenetwork egresssafari_accessibility_snapshotno sensitive capabilitysafari_analyze_pageno sensitive capabilitysafari_check_pwano sensitive capabilitysafari_clear_consoleno sensitive capabilitysafari_clear_fieldno sensitive capabilitysafari_clear_mocksno sensitive capabilitysafari_clear_networkno sensitive capabilitysafari_clickno sensitive capabilitysafari_click_and_readno sensitive capabilitysafari_click_and_waitno sensitive capabilitysafari_clipboard_readno sensitive capabilitysafari_clipboard_writeno sensitive capabilitysafari_close_tabno sensitive capabilitysafari_console_filterno sensitive capabilitysafari_css_coverageno sensitive capabilitysafari_delete_cookiesno sensitive capabilitysafari_delete_local_storageno sensitive capabilitysafari_delete_session_storageno sensitive capabilitysafari_detect_formsno sensitive capabilitysafari_doctorno sensitive capabilitysafari_double_clickno sensitive capabilitysafari_dragno sensitive capabilitysafari_emulateno sensitive capabilitysafari_export_storageno sensitive capabilitysafari_extract_imagesno sensitive capabilitysafari_extract_linksno sensitive capabilitysafari_extract_tablesno sensitive capabilitysafari_fillno sensitive capabilitysafari_fill_and_submitno sensitive capabilitysafari_fill_formno sensitive capabilitysafari_get_computed_styleno sensitive capabilitysafari_get_consoleno sensitive capabilitysafari_get_cookiesno sensitive capabilitysafari_get_elementno sensitive capabilitysafari_get_indexed_dbno sensitive capabilitysafari_get_sourceno sensitive capabilitysafari_go_backno sensitive capabilitysafari_go_forwardno sensitive capabilitysafari_handle_dialogno sensitive capabilitysafari_hoverno sensitive capabilitysafari_import_storageno sensitive capabilitysafari_inspect_viewportno sensitive capabilitysafari_list_indexed_dbsno sensitive capabilitysafari_list_tabsno sensitive capabilitysafari_local_storageno sensitive capabilitysafari_native_clickno sensitive capabilitysafari_native_hoverno sensitive capabilitysafari_native_keyboardno sensitive capabilitysafari_native_typeno sensitive capabilitysafari_navigateno sensitive capabilitysafari_navigate_and_readno sensitive capabilitysafari_networkno sensitive capabilitysafari_network_detailsno sensitive capabilitysafari_new_tabno sensitive capabilitysafari_override_geolocationno sensitive capabilitysafari_paste_imageno sensitive capabilitysafari_performance_metricsno sensitive capabilitysafari_press_keyno sensitive capabilitysafari_query_allno sensitive capabilitysafari_react_select_list_optionsno sensitive capabilitysafari_react_select_setno sensitive capabilitysafari_read_pageno sensitive capabilitysafari_reloadno sensitive capabilitysafari_reload_extensionno sensitive capabilitysafari_replace_editorno sensitive capabilitysafari_reset_emulationno sensitive capabilitysafari_resizeno sensitive capabilitysafari_right_clickno sensitive capabilitysafari_safe_area_insetsno sensitive capabilitysafari_save_pdfno sensitive capabilitysafari_screenshotno sensitive capabilitysafari_screenshot_elementno sensitive capabilitysafari_scrollno sensitive capabilitysafari_scroll_tono sensitive capabilitysafari_scroll_to_elementno sensitive capabilitysafari_select_optionno sensitive capabilitysafari_session_storageno sensitive capabilitysafari_set_cookieno sensitive capabilitysafari_set_local_storageno sensitive capabilitysafari_set_session_storageno sensitive capabilitysafari_snapshotno sensitive capabilitysafari_start_consoleno sensitive capabilitysafari_switch_tabno sensitive capabilitysafari_throttle_networkno sensitive capabilitysafari_type_textno sensitive capabilitysafari_verify_stateno sensitive capabilitysafari_waitno sensitive capabilitysafari_wait_forno sensitive capabilitysafari_wait_for_new_tabno sensitive capabilitysafari_webkit_compatno sensitive capabilityCross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).
Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v2.19.0 latest |
A 93/100 | 10 | 1.13.0 | 2026-09-07 |
v2.18.1 |
A 93/100 | 10 | 1.13.0 | 2026-09-05 |
v2.17.1 |
A 93/100 | 10 | 1.13.0 | 2026-09-04 |
v2.17.0 |
A 93/100 | 10 | 1.13.0 | 2026-08-29 |
v2.16.3 |
A 93/100 | 10 | 1.13.0 | 2026-08-25 |
v2.16.2 |
A 93/100 | 10 | 1.12.1 | 2026-08-21 |
v2.16.1 |
A 93/100 | 10 | 1.12.1 | 2026-08-19 |
v2.16.0 |
A 93/100 | 10 | 1.12.1 | 2026-08-15 |
v2.15.12 |
A 93/100 | 10 | 1.12.1 | 2026-08-06 |
v2.15.11 |
A 93/100 | 10 | 1.12.1 | 2026-07-31 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan safari-mcp --online
Independent packages implementing the same tool, scanned with the same engine. Compare all 3 side by side →
MCP server for Safari web browser integration
Security scan results for the Safari (npm) MCP server.
Model Context Protocol (MCP) server that integrates AgentQL data extraction capabilities.
Screenshot any URL or HTML as PNG/JPEG/WebP from your AI agent. Full-page, clean, no install.
MCP server for aria51 accessibility scanner
Bridge any browser web app to Claude Code via MCP
Browserbase’s official MCP server: cloud headless browsers for agents, with sessions and screenshots.
MCP server for AI web browser automation using Browserbase and Stagehand