Communitygithub.com

cli-anything-safari

macOS上のSafariブラウザを自動化するコマンドラインインターフェース。Python Click CLIでsafari-mcp MCPサーバーをラップします。

cli-anything-safari とは?

cli-anything-safariは、macOS上のSafariブラウザ自動化のためのCLIツールです。Node.jsベースのMCPサーバー「safari-mcp」をPythonのClick CLIでラップし、MCPプロトコルをネイティブにサポートしないエージェントフレームワーク(Codex CLI、GitHub Copilot CLI、カスタムスクリプトなど)でもSafariの全機能を利用できるようにします。84ものツールが自動生成されたClickコマンドとして利用可能で、ツールのスキーマは`safari-mcp`から自動的に抽出・バンドルされています。これにより、Safariの操作(ナビゲーション、クリック、フォーム入力、スクリーンショット、JavaScript評価など)をbashスクリプトやCI/CDパイプラインから簡単に実行できます。特筆すべきは「機能パリティ保証」で、すべてのClickコマンドが`safari-mcp`のツールスキーマと完全に一致するため、MCPネイティブ環境と同等の操作が可能です。また、ツールの内省コマンド(tools list/describe)により、動的に利用可能なツールとその引数スキーマを確認でき、エージェントが自己発見的に動作できます。

対応✓Claude Code✓Codex CLI✓Cursor
npx skills add https://github.com/HKUDS/CLI-Anything/tree/main/skills/cli-anything-safari

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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対応、サブプロセスフレンドリーな出力が必要な場合。
  • ターミナルから対話的にデバッグしている場合。

インストール

前提条件

  1. macOS — Safari MCPはmacOSのみ対応。
  2. Safari — macOSにすでにインストール済み。
  3. Node.js 18+ — brew install node または https://nodejs.org/ から。
  4. Python 3.10+
  5. SafariでApple Eventsを有効にする: Safari → 環境設定 → 詳細 → 「Apple EventsからJavaScriptを許可」

CLIのインストール

cd safari/agent-harness
pip install -e .

最初のtool呼び出しでsafari-mcp npmパッケージがダウンロードされます(初回のみ、数MB)。

コマンド構造

CLIには5つのトップレベルコマンドがあります:

コマンド目的
toolsafari-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をプログラムで使用する場合:

  1. 常に--jsonフラグを使用して解析可能な出力を取得してください。
  2. リターンコードを確認 — 0は成功、0以外はエラー(URL検証失敗、MCP呼び出し失敗、無効なJSON引数)。
  3. stderrを解析してエラーメッセージを取得し、stdoutをデータに使用します。
  4. ファイル操作ツールはパス引数名が一貫していません — 最初に必ずtools describe <name>を確認してください:
    • tool save-pdf --path /tmp/x.pdf
    • tool upload-file --selector ... --file-path /tmp/x.txt(注意: --file-path、--pathではありません)
    • tool export-storage — パス引数なし、JSON出力をファイルにパイプ
    • tool import-storage --path /tmp/x.json
    • tool screenshot / screenshot-element — JSONレスポンス内のbase64を返す、パス引数なし(自分でデコード)
  5. クリック前にスナップショット — tool snapshotからの参照は次のスナップショットで失効します。常にスナップショット → 参照を見つける → クリックを連続して行ってください。
  6. tools listでツールを発見 — バンドルされたレジストリが利用可能なツールの真実の情報源です。上流で変更される可能性のあるツール名をハードコードしないでください。
  7. 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

ツール選択戦略

  1. tool snapshot を tool screenshot より優先 — 参照ID付きの構造化テキストははるかにコストが低く、クリックに必要な参照を提供します。
  2. tool click --ref を tool click --selector より優先 — 参照は単一スナップショット内で安定していますが、セレクターは壊れやすい可能性があります。
  3. tool navigate-and-read を navigate + read-page より優先 — 1往復節約できます。
  4. tool click-and-read を click + read-page より優先 — 1往復節約できます。
  5. 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を介して再生成されます。

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

cli-anything-adguardhome

>-

cli-anything-anygen

>-

cli-anything-audacity

>-

cli-anything-blender

>-

cli-anything-browser

Browser automation CLI using DOMShell MCP server. Maps Chrome

cli-anything-calibre

>-

cli-anything-ccswitch

CLI interface for CC Switch — manage AI coding tool configurations from the terminal

cli-anything-chromadb

>-

cli-anything-cloudanalyzer

Command-line interface for CloudAnalyzer — Agent-friendly harness for CloudAnalyzer, a QA platform for mapping, localization, and perception outputs. Supports 27 commands across 8 groups: point cloud evaluation, trajectory evaluation, ground segmentation QA, config-driven quality gates, baseline evolution, processing, visualization, and interactive REPL.

cli-anything-cloudcompare

Command-line interface for CloudCompare — Agent-friendly harness for CloudCompare, the open-source 3D point cloud and mesh processing software. Supports 41 commands across 9 groups: project management, session control, point cloud operations (subsample, filter, segment, analyze), mesh operations, distance computation (C2C, C2M), transformations (ICP, matrix), export (LAS/LAZ/PLY/PCD/OBJ/STL/E57), and interactive REPL.

cli-anything-comfyui

>-

cli-anything-dify-workflow

Wrapper for the Dify workflow DSL CLI. Create, inspect, validate, edit, and export Dify workflow files through a CLI-Anything harness.

cli-anything-drawio

>-

cli-anything-eez-studio

Use EEZ Studio from the command line: inspect and modify native .eez-project files, edit LVGL screens/widgets, manage SCPI commands, and invoke the real EEZ Studio backend for LVGL builds.

cli-anything-eth2-quickstart

>-

cli-anything-exa

>-

cli-anything-firefly-iii

Firefly III CLI - Personal finance management via CLI-Anything

cli-anything-freecad

Complete CLI harness for FreeCAD parametric 3D CAD modeler (258 commands). Covers ALL workbenches: Part (29 primitives + boolean + mirror + loft + sweep), Sketcher (26 cmds: geometry + constraints + editing), PartDesign (38 cmds: pad/pocket/groove/fillet/chamfer/patterns/hole/datum), Assembly (11 cmds), Mesh (16 cmds), TechDraw (15 cmds: views + dimensions + PDF/SVG), Draft (33 cmds: 2D shapes + arrays + transforms), FEM (12 cmds), CAM/CNC (10 cmds), Surface (6 cmds), Spreadsheet (7 cmds), Import (13 formats), Export (17 formats), Measure (12 cmds), Materials (21 presets). Headless FreeCAD export to STEP/IGES/STL/OBJ/DXF/PDF/glTF/3MF.

cli-anything-gimp

>-

cli-anything-godot

>-

関連スキル