cli-anything-safari は何をしますか?
macOS上のSafariブラウザ自動化のためのコマンドラインインターフェース。Node.js製MCPサーバーsafari-mcpをPython Click CLIでラップします。
機能パリティを保証します。 すべてのClickコマンドはsafari-mcpのツールスキーマ(resources/tools.jsonとしてバンドル)から自動生成されています。84の全ツールが、MCPサーバーが期待する正確な引数名と型で利用可能です。
このCLIを使用すべき場合
各CLI呼び出しは新しいサブプロセスを起動するため、呼び出しごとにオーバーヘッドが発生します。エージェントがMCPをネイティブに話す場合(Claude Code、Cursor、Clineなど)、safari-mcpをMCP stdio経由で直接使用する方が高速です。
このCLIを使用すべき場合:
- エージェントフレームワークがMCPを話さない場合(Codex CLI、GitHub Copilot CLI、カスタムスクリプト、古いエージェントフレームワーク)。
- bashからブラウザ自動化をスクリプト化する必要がある場合 —
cli-anything-safari --json tool snapshot | jq '...'。 - CI/CDで実行し、cron対応、サブプロセスフレンドリーな出力が必要な場合。
- ターミナルから対話的にデバッグしている場合。
インストール
前提条件
- macOS — Safari MCPはmacOSのみ対応。
- Safari — macOSにすでにインストール済み。
- Node.js 18+ —
brew install nodeまたは https://nodejs.org/ から。 - Python 3.10+
- SafariでApple Eventsを有効にする: Safari → 環境設定 → 詳細 → 「Apple EventsからJavaScriptを許可」
CLIのインストール
cd safari/agent-harness
pip install -e .
最初のtool呼び出しでsafari-mcp npmパッケージがダウンロードされます(初回のみ、数MB)。
コマンド構造
CLIには5つのトップレベルコマンドがあります:
| コマンド | 目的 |
|---|---|
tool | safari-mcpの84ツールのいずれかを呼び出し(動的、スキーマ駆動) |
tools | バンドルされたツールレジストリを検査(list、describe、count) |
raw | 脱出ハッチ — 完全な名前と生JSON引数でツールを呼び出し |
session | メモリ内セッション状態(最後のURL、現在のタブ) |
repl | インタラクティブREPL(サブコマンドがない場合のデフォルト) |
使用例
ツールサーフェスの発見
# ツールの数(正常性チェック — safari-mcpの登録ツールと一致する必要があります)
cli-anything-safari tools count
# → 84
# すべてのツールを一覧表示
cli-anything-safari tools list
cli-anything-safari tools list --filter click # 部分文字列でフィルタ
# 1つのツールの完全なスキーマ(JSONまたは人間向けフォーマット)
cli-anything-safari tools describe safari_scroll
cli-anything-safari --json tools describe safari_click
ツールの呼び出し(スキーマ駆動)
# ナビゲート
cli-anything-safari tool navigate --url https://example.com
# スナップショットを取得(スクリーンショットより推奨 — 構造化テキストと参照ID)
cli-anything-safari --json tool snapshot
# 参照(ref)でクリック(refはスナップショットから取得、次のスナップショットで無効になります!)
cli-anything-safari tool click --ref 0_5
# セレクターまたは表示テキストでクリック
cli-anything-safari tool click --selector "#submit"
cli-anything-safari tool click --text "ログイン"
# フィールドに入力
cli-anything-safari tool fill --selector "#email" --value "[email protected]"
# 方向/量でスクロール(x/yではなく — スキーマに注意!)
cli-anything-safari tool scroll --direction down --amount 500
# 要素を別の要素にドラッグ
cli-anything-safari tool drag \
--source-selector ".card" \
--target-selector ".trash"
# スクリーンショット — 標準出力にbase64 JPEGを返します。デコード方法:
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']))"
# PDFとして保存(これは直接ディスクに書き込みます)
cli-anything-safari tool save-pdf --path /tmp/page.pdf
# JavaScriptを評価(パラメータは --script、--code ではないことに注意)
cli-anything-safari tool evaluate --script "document.title"
ナビゲートして読み取りを1往復で実行
cli-anything-safari --json tool navigate-and-read --url https://example.com
フォーム入力(一括)
safari_fill_formは{selector, value}オブジェクトの配列を受け取ります。JSON文字列として渡します:
cli-anything-safari tool fill-form --fields '[
{"selector": "#email", "value": "[email protected]"},
{"selector": "#password", "value": "hunter2"}
]'
cli-anything-safari tools describe safari_fill_formを実行して正確なスキーマを確認してください。safari-mcpが上流で追加する新しいフィールドも含まれます。
ネットワーク監視
cli-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-metrics
ストレージ
cli-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 はJSONを標準出力に返します — --path 引数はありません。ファイルにパイプ:
cli-anything-safari --json tool export-storage > /tmp/storage.json
生JSON脱出ハッチ
複雑なネストオブジェクトを渡す必要がある場合や、事前に作成したJSONブロブからCLIを駆動したい場合:
cli-anything-safari raw safari_evaluate \
--json-args '{"code":"[...document.querySelectorAll(\"a\")].map(a => a.href)"}'
インタラクティブREPL
cli-anything-safari
REPLのバナーにはこのSKILL.mdの絶対パスが表示されるため、エージェントは自己発見的に機能を把握できます。
JSON出力
すべてのコマンドはグローバルフラグとして--jsonをサポートしています:
cli-anything-safari --json tool snapshot
cli-anything-safari --json tool list-tabs
cli-anything-safari --json tools list
状態管理
CLIはREPL表示専用に少量のメモリ内状態を保持します:
last_url— CLIが最後にナビゲートしたURL(tool navigate、tool navigate-and-read、tool new-tabの成功後に更新)current_tab_index— 最後に認識されたアクティブなタブのインデックス
永続セッションはありません。元に戻す/やり直しも、ドキュメントモデルもありません。すべてのCLI呼び出しは新しい状態で始まります。Safari MCP自体は呼び出しごとにステートレスです: 各toolコマンドは新しいnpx safari-mcpサブプロセスを起動し、アクションを実行して終了します。これは意図的な設計上の選択です。標準の元に戻す/やり直しパターンからの逸脱の理由についてはHARNESS.mdとTEST.mdを参照してください。
出力フォーマット
すべてのコマンドは2つの出力モードをサポートしています:
- 人間可読(デフォルト):
dict結果の場合はインデント付きキー値テキスト、配列の場合は箇条書き、それ以外はプレーンテキスト - 機械可読(
--jsonフラグ): エージェント消費用の構造化JSON
# 人間向け出力
cli-anything-safari tool snapshot
# エージェント向けJSON出力
cli-anything-safari --json tool snapshot
cli-anything-safari --json tools list
cli-anything-safari --json tools describe safari_click
AIエージェント向け
このCLIをプログラムで使用する場合:
- 常に
--jsonフラグを使用して解析可能な出力を取得してください。 - リターンコードを確認 — 0は成功、0以外はエラー(URL検証失敗、MCP呼び出し失敗、無効なJSON引数)。
- stderrを解析してエラーメッセージを取得し、stdoutをデータに使用します。
- ファイル操作ツールはパス引数名が一貫していません — 最初に必ず
tools describe <name>を確認してください:tool save-pdf --path /tmp/x.pdftool upload-file --selector ... --file-path /tmp/x.txt(注意:--file-path、--pathではありません)tool export-storage— パス引数なし、JSON出力をファイルにパイプtool import-storage --path /tmp/x.jsontool screenshot/screenshot-element— JSONレスポンス内のbase64を返す、パス引数なし(自分でデコード)
- クリック前にスナップショット —
tool snapshotからの参照は次のスナップショットで失効します。常にスナップショット → 参照を見つける → クリックを連続して行ってください。 tools listでツールを発見 — バンドルされたレジストリが利用可能なツールの真実の情報源です。上流で変更される可能性のあるツール名をハードコードしないでください。tools describe <name>を使用して呼び出し前に正確なスキーマ(必須引数、列挙型の選択肢、JSON型引数)を学習してください。説明からパラメータ名を決して推測しないでください — たとえば、safari_evaluateは説明に「実行するJavaScriptコード」と書かれていても、--script(--codeではない)を受け取ります。
エージェント固有のガイダンス
適切なツールを見つける
内省コマンドを使用してください。CLIは保証されたMCPサーバーとの1:1対応です:
# クリック関連のすべてのツールを検索
cli-anything-safari tools list --filter click
# 完全なスキーマを取得(すべての引数、型、説明、必須/オプション、列挙型の選択肢、デフォルト値を含む)
cli-anything-safari --json tools describe safari_click
ツール選択戦略
tool snapshotをtool screenshotより優先 — 参照ID付きの構造化テキストははるかにコストが低く、クリックに必要な参照を提供します。tool click --refをtool click --selectorより優先 — 参照は単一スナップショット内で安定していますが、セレクターは壊れやすい可能性があります。tool navigate-and-readをnavigate+read-pageより優先 — 1往復節約できます。tool click-and-readをclick+read-pageより優先 — 1往復節約できます。tool native-clickは通常のクリックが405/403(WAFブロック、G2、Cloudflare)で失敗した場合のみ使用 — 物理的にカーソルを移動します。
参照の有効期限
tool snapshotからの参照は、新しいスナップショットを撮ると失効します:
- 最初のスナップショット: 参照
0_1、0_2、0_3... - 2回目のスナップショット: 参照
1_1、1_2、1_3...
常にスナップショット → クリックを連続して行ってください。不明な場合は、再度スナップショットを撮ってください。
タブ所有権の安全性
Safari MCPはセッションごとにタブの所有権を追跡します。タブを変更するツール(ナビゲート、クリック、入力)は、セッションが開いていないタブではブロックされます。特定のページで操作するには、必ずtool new-tab --url ...から始めてください。
エラーハンドリング
一般的なエラー:
npx not found→ Node.js 18+をインストールsafari-mcp package not found on npm registry→ ネットワークを確認Not macOS→ ハーネスはmacOSのみ対応AppleScript denied→ Safari → 環境設定 → 詳細で「Apple EventsからJavaScriptを許可」を有効Blocked URL scheme: file→ URL検証が入力を拒否しました(設計による)
URL検証
CLIはsafari_navigate、safari_navigate_and_read、safari_new_tabに渡す前にURLを検証します。ブロックされるスキーム: file、javascript、data、vbscript、about、chrome、safari、webkit、x-apple、およびその他のブラウザ内部スキーム。rawコマンドもナビゲーションツールに対してこれを強制します。
マルチセッション警告
Safari MCPは、10秒より古いスタブNode.jsプロセスを強制終了することで、単一のアクティブセッションを強制します。2つのCLIインスタンスを同時に実行すると、一方が他方のバックエンドを強制終了します。現在デーモンモードはありません — レイテンシーに敏感なワークフローの場合は、cli_anything.safari.utils.safari_backend.call()を直接インポートする長時間実行PythonスクリプトからCLIを駆動して、呼び出しごとにサブプロセスを再生成しないようにしてください。
リンク
セキュリティに関する考慮事項
URL検証
すべてのナビゲーションツール(tool navigate、tool navigate-and-read、tool new-tab、raw safari_navigate*)はurl引数をutils/security.pyに通し、危険なスキームをブロックし、オプションでプライベートネットワークをブロックします(CLI_ANYTHING_SAFARI_BLOCK_PRIVATE=1を設定)。
タブ分離
Safari MCPは上流でセッションごとのタブ所有権を強制します — ツールはセッションが開いていないタブでは操作できません。
プロファイル分離
SAFARI_PROFILE環境変数を設定して、自動化用に別のSafariプロファイルを使用します:
export SAFARI_PROFILE="Automation"
cli-anything-safari tool navigate --url https://example.com
これにより、Cookie/ログイン/履歴がユーザーのメインブラウジングから分離されます。
JavaScript実行
tool evaluateとtool run-scriptはページコンテキストで任意のJavaScriptを実行します。信頼できない入力は、他の動的コード実行パスと同様の注意で扱ってください。
クリップボード
tool clipboard-readとtool clipboard-writeはシステムクリップボードに触れます。ユーザーのアクティブセッション内で実行する場合は注意してください — タスクの途中でクリップボードを上書きすると混乱を招きます。
ツールレジストリの再生成
safari-mcpをアップグレードした場合は、バンドルされたスキーマを再生成します:
python scripts/extract_tools.py \
"$(npm root -g)/safari-mcp/index.js" \
cli_anything/safari/resources/tools.json
パリティテスト(test_parity.py)は期待されるツール数を固定しています。上流のツールリストが変更されたら更新してください。
詳細情報
- 完全なドキュメント: パッケージ内の
cli_anything/safari/README.md - テストカバレッジ: パッケージ内の
cli_anything/safari/tests/TEST.md - アーキテクチャ分析:
safari/agent-harness/SAFARI.md - 方法論:
cli-anything-plugin/HARNESS.md - MCPバックエンドパターン:
cli-anything-plugin/guides/mcp-backend.md
バージョン
1.0.0 — safari-mcp 2.7.8(84ツール)を対象。バンドルされたツールレジストリは、safari-mcpがアップグレードされたときにscripts/extract_tools.pyを介して再生成されます。