Safari MCP について
Safari MCPは、使用中のログイン済みSafariをAIエージェントが自動操作するためのmacOS向けMCPサーバーです。ブラウザー操作ツールを提供し、Chromeやブラウザー自動化用依存関係なしでバックグラウンド実行できます。
主な機能
- 01ページ移動、クリック、フォーム入力
- 02スクリーンショットとアクセシビリティスナップショット
- 03ネットワークとストレージへのアクセス
- 04Safariのバックグラウンド操作
- 05セッションごとのタブ所有権
- 06stdioと共有HTTPトランスポート
活用シーン
- 01ログイン済みサイトでの作業を自動化
- 02操作前にページ構造を確認
- 03React、Vue、Angular、Svelteのフォーム入力
- 04タブ状態を分離して複数エージェントを実行
MCP 対応
stdioまたは共有HTTPデーモンを通じて、Safariブラウザー自動化ツールをMCPクライアントに公開します。セッションごとにタブの所有権を管理し、並行するクライアントの操作対象を分離します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
🦁 Safari MCP
コーディングエージェントのためのブラウザーです。
ログイン済みの実際の Safari — Chrome も、発熱も、ヘッドレスも不要です。
VS Code にインストール · VS Code Insiders · Cursor にインストール
98 個のツール · Chrome/Puppeteer/Playwright は不要 · コマンドあたり約 5ms · Chrome より CPU 使用率を 60% 削減
クイックスタート · 98 個すべてのツール · 使用例 · Safari MCP を選ぶ理由 · アーキテクチャ · 変更履歴

❌ Safari MCP がない場合
AI エージェントがブラウザーを使う必要がある場合、次のいずれかになります。
- Playwright で Chromium を起動する — ログイン情報も Cookie もセッションもありません
- Chrome DevTools MCP を使う — 2 つ目のブラウザーを動かしてファンをフル回転させます
- ヘッドレススクレイパーに頼る — Cloudflare、reCAPTCHA、ボット検知によってブロックされます
✅ Safari MCP がある場合
AI が操作するのは、すでにログインしている Safariです — Gmail、GitHub、Ahrefs、Slack、銀行など。
ネイティブ WebKit。CPU 使用率を約 60% 削減。バックグラウンド動作。98 個のツール。npx コマンド 1 つ。macOS 専用です。
📰 freeCodeCamp に掲載: macOS で AI コーディングエージェントをブラウザーに接続する方法 · HackerNoon:React、Shadow DOM、CSP のリバースエンジニアリング
🍎 Apple が公式の Safari MCP をリリースしました —
safaridriver --mcpは Safari Technology Preview 247(2026 年 7 月)で初登場し、Safari 27.0 以降の安定版にも搭載されています。これはデバッグ用に分離された自動化セッションを操作します。safari-mcp が操作するのは、すでにログインしている実際の Safariです — Cookie とセッションをそのまま使い、バックグラウンドで 98 個のツールを利用できます。詳しい比較は以下をご覧ください。
主な特長
- 98 個のツール — ナビゲーション、クリック、フォーム、スクリーンショット、ネットワーク、ストレージ、アクセシビリティなど
- 発熱ゼロ — Apple Silicon 上のネイティブ WebKit を使用し、Chrome より CPU 使用率を約 60% 削減
- 実際のブラウザーを使用 — すべてのログイン情報、Cookie、セッションを保持します(Gmail、GitHub、Ahrefs など)
- バックグラウンド動作 — Safari はバックグラウンドで動作し、ウィンドウを奪いません
- ブラウザー依存関係なし — Puppeteer、Playwright、WebDriver、Chrome は不要
- プロセスを維持 — 1 つの osascript プロセスを再利用します(コマンドあたり約 5ms、通常は約 80ms)
- フレームワークに対応 — ネイティブセッターによる React、Vue、Angular、Svelte のフォーム入力
ユーザー自身の言葉
依頼して集めた推薦文ではありません。公開されているイシュートラッカーから引用し、それぞれ引用元のスレッドにリンクしています。
「通常のSafariプロファイルに対して、複数のPiセッション/サブエージェントを並行して実行しています。Cookieとログイン情報を共有するのは意図的です。」 — @maxim、実際のブラウザーに対して並行してエージェントを実行することについて
「このサーバーには意図的なタブ所有権モデルがあります……この点はコードで慎重に扱われており、デフォルトのケースでは適切な安全対策です。」 — @turner-moore、タブに触れないようガードが拒否する理由について
「パッケージから直接ローカルで検証しました。Safari MCP doctor 6/6。」 — @jrepp、フォーカスヘルパーのキュー整列のバグを見つけて修正した方
クイックスタート
前提条件
- Safariが動作するバージョンのmacOS
- Node.js 20+
- Safari → 設定 → 詳細 → Webデベロッパー向けの機能を表示 ✓
- Safari → 設定 → デベロッパー → Apple EventsからのJavaScriptを許可 ✓
インストール(コマンド1つ)
npx safari-mcp
これで完了です。グローバルインストールは不要です。または、恒久的にインストールするには:
npm install -g safari-mcp
MCPクライアントを設定する
すべてのクライアントでSafari MCPの実行方法は同じです。npx safari-mcpを使います。エディターを選択してください。
Claude Code
claude mcp add safari -- npx safari-mcp
または、~/.mcp.jsonを編集します。
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.jsonを編集します。
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
保存後、Claude Desktopを再起動してください。
Cursor
ワンクリックでインストール:Cursorにインストール
または、プロジェクト内の.cursor/mcp.jsonを編集します。
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
VS Code / VS Code Insiders
ワンクリックでインストール:VS Codeにインストール
または、.vscode/mcp.jsonを編集します。
{
"servers": {
"safari": {
"type": "stdio",
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Windsurf
プロジェクト内の.windsurf/mcp.json(またはグローバル設定の~/.codeium/windsurf/mcp_config.json)を編集します。
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Cline
VS CodeでClineを開き → MCPアイコンをクリック → MCP設定を編集 → 次を追加します。
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Continue
~/.continue/config.yaml(またはワークスペース内の.continue/config.yaml)を編集します。
mcpServers:
- name: safari
command: npx
args:
- safari-mcp
Goose
~/.config/goose/config.yamlを編集します。
extensions:
safari:
name: safari
type: stdio
cmd: npx
args:
- safari-mcp
enabled: true
LM Studio
LM Studioを開き → 設定 → MCPサーバー → サーバーを追加:
- 名前:
safari - コマンド:
npx - 引数:
safari-mcp
Zed
Zedを開き → 設定 → 「Context Servers」を検索して追加します。
{
"context_servers": {
"safari": {
"command": {
"path": "npx",
"args": ["safari-mcp"]
}
}
}
}
別の方法:Homebrew
brew install achiya-automation/tap/safari-mcp
別の方法:ソースから
git clone https://github.com/achiya-automation/safari-mcp.git
cd safari-mcp && npm install
使用ワークフロー
Safari MCPを使うAIエージェントに推奨されるパターン:
1. safari_snapshot → Get page state (accessibility tree)
2. safari_click/fill/... → Interact with elements by ref
3. safari_snapshot → Verify the result
要素のターゲティング — ツールでは複数のターゲティング方法を利用できます。
| 方法 | 例 | 最適な対象 |
|---|---|---|
| CSSセレクター | #login-btn、.submit | 一意の要素 |
| 表示テキスト | "Sign In"、"Submit" | ボタン、リンク |
| 座標 | x: 100, y: 200 | Canvas、カスタムウィジェット |
| スナップショットのref | ref: "e42" | アクセシビリティツリー内の任意の要素 |
ヒント: まず
safari_snapshotを使って要素のrefを取得し、正確なターゲティングにはrefを使ってください。CSSセレクターより高速で信頼性も高くなります。
複数のエージェントを同時に実行する
複数のエージェントまたはサブエージェントが同時に1つの Safari を操作すると、アクティブなタブの制御を奪い合います。クライアントごとに1つのプロセスを実行するのではなく、共有 HTTP デーモンに接続すれば、この問題を回避できます。
SAFARI_MCP_HTTP=1 SAFARI_MCP_HTTP_PORT=9225 npx safari-mcp
次に、すべてのクライアントをそのデーモンに接続します。
{ "mcpServers": { "safari-mcp": { "type": "http", "url": "http://127.0.0.1:9225/mcp" } } }
1つのデーモンで複数のセッションを実行できます。各セッションは独自のタブ状態を持ちます。サーバーは MCP セッション ID を基に、activeTabIndex、所有権フラグ、固有のタブマーカーを管理するため、セッション A がセッション B のタブを読み取ったり操作したりすることは物理的に不可能です。
単に整然としているだけでなく、安全性を確保しているのは次の2つの性質です。
-
タブの識別にはインデックスではなくマーカーを使います。 各セッションは、開いたページに固有の ID を記録するため、ページ遷移後も、ユーザーがほかのタブの順序を入れ替えたり閉じたりした後も、所有権が維持されます。インデックスだけでは、気付かないうちに別のタブを操作してしまいます。
-
安全側に倒して処理を停止します。 セッションのマーカーが付いたタブを再検出できない場合、手前にあるタブへ切り替えるのではなく、すべてのツールが処理を拒否します。手前のタブは、たいていあなたが使っているものだからです。
Tab tracking lost — refusing to fall back to "current tab of window" (would target the user's active tab). Call safari_new_tab to reopen.
これにより、プロセス数も大幅に削減されます。17の同時セッションで約17個の node プロセスが必要だったところ、1個で済みます。
SAFARI_PROFILE は任意の設定です。設定しなければ、通常の Safari ウィンドウ、Cookie、ログイン状態を維持したままセッションが接続されます。詳しくは docs/http-transport-design.md をご覧ください。
永続デーモンよりも stdio(エージェントごとに1プロセス)を使いたい場合も、それで問題ありません。その場合、分離はプロセス境界そのものによって実現されます。ただし、クライアントが mcporter を介して複数のエージェントを多重化する場合は注意が必要です。mcporter は、どのトランスポートを選んでも、すべてのエージェントで1つの MCP クライアントをキャッシュします。そのため、サーバーは個別のセッションを認識できず、セッションごとの分離が機能しません。#76 をきっかけに @maxim が作成した pi 拡張機能の mcporter-lanes は、この問題を上流で解決します。各エージェントセッションに独自のデーモンディレクトリ、ひいては独自の safari-mcp を割り当て、アイドルタイムアウトによってプロセスが増え続けないようにします。
すでに開いているタブを操作する
デフォルトでは、サーバーは自分で開いたタブだけを操作します。自分が開いたタブを指定しても、操作を拒否します。
Tab safety: refusing "click" — current tab (https://mail.example.com/inbox) was not
opened by this MCP session. Use safari_new_tab or safari_switch_tab to target your own tab.
このデフォルト設定があるのは、初期バージョンがユーザーのタブをクリックして開いたり、閉じたりしていたためです。しかし、「今見ている記事を読んで」や「画面に表示されているフォームに入力して」といった操作は実際に必要です。また、ページを開き直すと、そのタブを使う価値を高めていたセッション状態が失われます。SAFARI_MCP_ALLOW_USER_TABS=1 を設定すると、明示的に safari_switch_tab を呼び出した場合、タブを拒否する代わりにセッションが引き継ぎます。それ以降、そのセッションは自分で開いたタブと同じようにそのタブを操作し、引き継いだことも通知します。
{ "tabIndex": 3, "safeUrl": "https://mail.example.com/inbox", "note": "(user tab, opted-in)" }
このフラグを設定しても、意図的に次の動作は変わりません。
- 引き継ぎを許可しますが、ガードは解除しません。 引き継ぎを行うのは
safari_switch_tabだけで、対象も指定したタブだけです。通常のクリックやページ遷移では、たまたま手前にあるタブへ切り替わることはありません。サーバーは、あなたが移動した先ではなく、あなたが指定したタブを操作します。 safari_close_tabは引き続き拒否されます。 閉じる操作だけは取り消せないため、引き継いだタブは操作できますが、破棄することはできません。閉じる場合は自分で操作してください。- 引き継ぎはセッション内に限られます。 共有の所有権ファイルには何も書き込まれないため、引き継ぎ状態は次のプロセスに漏れることなく、セッションの終了とともに解除されます。
safari_doctor にはフラグの状態が表示され、引き継いだタブに対するすべての操作で (user tab, opted-in) がログに記録されます。そのため、「なぜ自分のタブを操作したのか」という疑問にも、謎ではなく理由を確認できます。デフォルトではオフです。自分のブラウジングセッション内で作業させたいエージェントにのみ設定してください。#92 で設計されました。
環境変数
| 変数 | デフォルト | 機能 |
|---|---|---|
SAFARI_MCP_HTTP | off | クライアントごとにプロセスを起動する代わりに、共有 HTTP デーモンを 1 つ実行します(上記を参照)。 |
SAFARI_MCP_HTTP_PORT | 9225 | デーモンのポートです。 |
SAFARI_PROFILE | unset | セッションを名前付き Safari プロファイルに紐付けます。未設定の場合は、通常のウィンドウを使用します。 |
SAFARI_MCP_ALLOW_USER_TABS | off | safari_switch_tab が、すでに開いているタブを拒否せずに引き継げるようにします(下記を参照)。 |
MCP_MAX_TABS | 6 | 1 つのセッションで開いておけるタブの数です。さらに 1 つ開くと、そのセッションで最も古いタブが閉じられ、safari_new_tab がそのタブを evictedTab(そのレシート)に記録します。 |
SAFARI_MCP_RAISE_ON_NAVIGATE | off | ナビゲーション時に Safari を前面に表示し、フォーカスガードが以前のアプリを再び前面に戻すのを防ぎます。 |
SAFARI_MCP_SCREENSHOT_MAX_WIDTH | unset | すべての safari_screenshot をこのピクセル幅に縮小します(Retina キャプチャはビューポートの 2 倍のサイズです)。呼び出しごとの maxWidth で上書きできます。 |
SAFARI_MCP_KEEPALIVE_TAB | off | プロファイルウィンドウで、デーモンが提供するページを 1 つ開いたままにし、コマンド間で Safari が拡張機能のワーカーを停止しないようにします。 |
SAFARI_MCP_OPEN_WINDOW_CMD | unset | プロファイルウィンドウが表示されていない場合(再起動後など)に、プロファイル名を指定して実行するコマンドです。Safari にフォーカスを移さずにウィンドウを開く必要があります。 |
SAFARI_MCP_RAISE_ON_NAVIGATE=1 は、ページを表示することが主な目的のエージェント向けです。たとえば、「YouTube を開いて」と答える音声アシスタントや、デモを操作するエージェントです。それ以外ではオフにしてください。デフォルトでは Safari MCP はバックグラウンドで動作し、フォーカスを使用中のアプリに戻すため、別の場所で入力を続けながらエージェントにページを操作させることができます。
ツール(98 個)
クリックしてツール一覧を展開 — カテゴリ別
ナビゲーション(4 個)
| ツール | 説明 |
|---|---|
safari_navigate | URL に移動します(HTTPS へ自動変換し、読み込みを待機) |
safari_go_back | 履歴を戻ります |
safari_go_forward | 履歴を進みます |
safari_reload | ページを再読み込みします(ハード再読み込みは任意) |
ページの読み取り(3 個)
| ツール | 説明 |
|---|---|
safari_read_page | タイトル、URL、テキストコンテンツを取得します |
safari_get_source | HTML ソース全体を取得します |
safari_navigate_and_read | 1 回の呼び出しで移動して読み取ります |
クリックと操作(6 個)
| ツール | 説明 |
|---|---|
safari_click | CSS セレクター、表示テキスト、または座標を指定してクリックします |
safari_double_click | ダブルクリックします(単語の選択など) |
safari_right_click | 右クリックします(コンテキストメニュー) |
safari_hover | 要素にカーソルを合わせます |
safari_click_and_wait | クリックして、ナビゲーションを待機します |
safari_click_and_read | クリック後、更新されたページを返します。往復を減らせます(React Router と全ページ読み込みに対応) |
フォーム入力(11 個)
| ツール | 説明 |
|---|---|
safari_fill | 入力欄に値を入力します(React/Vue/Angular に対応) |
safari_clear_field | 入力欄をクリアします |
safari_select_option | ドロップダウンの選択肢を選びます |
safari_fill_form | 複数のフィールドにまとめて入力します |
safari_fill_and_submit | 1 回の呼び出しでフォームに入力して送信します |
safari_type_text | 実際のキー入力を行います(JS ベースで、System Events は使用しません) |
safari_press_key | 修飾キーを指定してキーを押します |
safari_react_select_set | React fiber を介して react-select v5 の値を設定します — メニュー UI を回避します |
safari_react_select_list_options | 開かずに react-select v5 のドロップダウンの選択肢を一覧表示します |
safari_replace_editor | コードエディター(Monaco、CodeMirror、Ace、ProseMirror)の全コンテンツを置き換えます |
safari_verify_state | エディターのフレームワークレベルの状態が想定と一致することを確認します — 送信前に古い DOM を検出します |
スクリーンショットと PDF(3 個)
| ツール | 説明 |
|---|---|
safari_screenshot | PNG 形式でスクリーンショットを撮影します(ビューポートまたはページ全体) |
safari_screenshot_element | 特定の要素のスクリーンショットを撮影します |
safari_save_pdf | ページを PDF としてエクスポートします |
スクロール(3)
| ツール | 説明 |
|---|---|
safari_scroll | ピクセル単位で上下にスクロールします |
safari_scroll_to | 指定した位置までスクロールします |
safari_scroll_to_element | 要素までスムーズにスクロールします |
タブ管理(5)
| ツール | 説明 |
|---|---|
safari_list_tabs | すべてのタブを一覧表示します(インデックス、タイトル、URL) |
safari_new_tab | 新しいタブを開きます(バックグラウンドで開き、フォーカスを奪いません) |
safari_close_tab | タブを閉じます |
safari_switch_tab | インデックスを指定してタブを切り替えます |
safari_wait_for_new_tab | 新しいタブ(OAuth ポップアップなど)が開くのを待ち、自動的に切り替えます |
待機(2)
| ツール | 説明 |
|---|---|
safari_wait_for | 要素、テキスト、または URL の変更を待ちます |
safari_wait | 指定したミリ秒数だけ待ちます |
JavaScript(3)
| ツール | 説明 |
|---|---|
safari_evaluate | 任意の JavaScript を実行し、結果を返します |
safari_eval_file | ファイルパスから読み込んだ JavaScript を実行します(巨大なインラインスクリプトを避けられます) |
safari_list_frames | タブ内のすべてのドキュメント(メインページと各 iframe)を、frameId、URL、テキストの長さとともに一覧表示します。クロスオリジン iframe 内で実行するには、safari_evaluate の frame に frameId を渡します |
要素の検査(4)
| ツール | 説明 |
|---|---|
safari_get_element | 要素の詳細(タグ、矩形、属性、表示状態) |
safari_query_all | 一致するすべての要素を検索します |
safari_get_computed_style | 計算済み CSS スタイル |
safari_detect_forms | フィールドセレクターを含むすべてのフォームを自動検出します |
アクセシビリティ(2)
| ツール | 説明 |
|---|---|
safari_accessibility_snapshot | アクセシビリティツリー全体:ロール、ARIA、フォーカス可能な要素 |
safari_snapshot | すべてのインタラクティブ要素に参照 ID を付けたアクセシビリティツリー。ページの状態を確認する推奨方法です |
ドラッグ&ドロップ(1)
| ツール | 説明 |
|---|---|
safari_drag | 要素間、または座標間でドラッグします |
ファイル操作(2)
| ツール | 説明 |
|---|---|
safari_upload_file | JS DataTransfer 経由でファイルをアップロードします(ファイルダイアログは不要です!) |
safari_paste_image | 画像をエディターに貼り付けます(クリップボードに触れません!) |
ダイアログとウィンドウ(2)
| ツール | 説明 |
|---|---|
safari_handle_dialog | アラート/確認/プロンプトを処理します |
safari_resize | ブラウザーウィンドウのサイズを変更します |
デバイスエミュレーション(2)
| ツール | 説明 |
|---|---|
safari_emulate | デバイス(iPhone、iPad、Pixel、Galaxy)をエミュレートします |
safari_reset_emulation | デスクトップ設定にリセットします |
Cookie とストレージ(11)
| ツール | 説明 |
|---|---|
safari_get_cookies | すべての Cookie を取得します |
safari_set_cookie | すべてのオプションを指定して Cookie を設定します |
safari_delete_cookies | 1 つまたはすべての Cookie を削除します |
safari_local_storage | localStorage を読み取ります |
safari_set_local_storage | localStorage に書き込みます |
safari_delete_local_storage | localStorage を削除/消去します |
safari_session_storage | sessionStorage を読み取ります |
safari_set_session_storage | sessionStorage に書き込みます |
safari_delete_session_storage | sessionStorage を削除/消去します |
safari_export_storage | すべてのストレージを JSON としてエクスポートします(セッションのバックアップ/復元) |
safari_import_storage | JSON からストレージの状態をインポートします |
クリップボード(2)
| ツール | 説明 |
|---|---|
safari_clipboard_read | クリップボードのテキストを読み取ります |
safari_clipboard_write | クリップボードにテキストを書き込みます |
ネットワーク(6)
| ツール | 説明 |
|---|---|
safari_network | Performance API 経由でネットワークリクエストをすばやく実行します |
safari_start_network_capture | 詳細なキャプチャを開始します(fetch + XHR) |
safari_network_details | キャプチャしたリクエストをヘッダー/タイミングとともに取得します |
safari_clear_network | キャプチャしたリクエストを消去します |
safari_mock_route | ネットワークレスポンスをモックします(fetch/XHR をインターセプト) |
safari_clear_mocks | すべてのネットワークモックを削除します |
コンソール(4)
| ツール | 説明 |
|---|---|
safari_start_console | コンソールメッセージの記録を開始します |
safari_get_console | 記録されたすべてのメッセージを取得します |
safari_clear_console | 記録されたメッセージを消去します |
safari_console_filter | レベル(log/warn/error)でフィルタリングします |
パフォーマンス(2)
| ツール | 説明 |
|---|---|
safari_performance_metrics | ナビゲーションのタイミング、Web Vitals、メモリ |
safari_throttle_network | slow-3g/fast-3g/4g/offline をシミュレートします |
データ抽出(4)
| ツール | 説明 |
|---|---|
safari_extract_tables | テーブルを構造化 JSON として取得します |
safari_extract_meta | すべてのメタデータ:OG、Twitter、JSON-LD、canonical |
safari_extract_images | 画像を寸法と読み込み情報とともに取得します |
safari_extract_links | rel、外部リンク/nofollow の検出情報とともにリンクを取得します |
高度な機能(7)
| ツール | 説明 |
|---|---|
safari_override_geolocation | ブラウザーの位置情報を上書きします |
safari_list_indexed_dbs | IndexedDB データベースを一覧表示します |
safari_get_indexed_db | IndexedDB レコードを読み取ります |
safari_css_coverage | 未使用の CSS ルールを検出します |
safari_analyze_page | 1 回の呼び出しでページ全体を分析します |
safari_doctor | macOS の権限とデーモンの連携(Apple Events、Accessibility、Screen Recording、codesign)を診断し、失敗ごとの修正方法を提示します |
safari_reload_extension | 手動で切り替えずに Safari MCP Bridge 拡張機能をホットリロードします |
自動化(1)
| ツール | 説明 |
|---|---|
safari_run_script | 1 回の呼び出しで複数のアクションを実行します(バッチ処理) |
ネイティブ入力 — CGEvent(4)
| ツール | 説明 |
|---|---|
safari_native_click | OS レベルのマウスクリック(CGEvent、isTrusted: true) — safari_click がブロックされた場合(405/403)に WAF/ボット検出を回避します |
safari_native_hover | OS レベルのカーソルホバー — ツールチップや難読化された UI で実際の :hover/mouseenter を発生させます |
safari_native_type | 実際の貼り付け処理を通じてテキストを挿入します — ProseMirror/Slate/Draft.js がネイティブに処理するため、送信時に実データが送られます |
safari_native_keyboard | フォーカスを奪わずに、修飾キーを含むキー入力を OS レベルで Safari に送信します — React の信頼性チェック付きハンドラー(Discord/Slack の送信)にも届きます |
iOS と WebKit の検証(4)
| ツール | 説明 |
|---|---|
safari_inspect_viewport | iOS Safari の <meta name=viewport> タグ(device-width、ズーム/WCAG、viewport-fit)を検証します |
safari_safe_area_insets | セーフエリアのインセット値と viewport-fit/env() の使用状況をリアルタイムで読み取ります(ノッチ/Dynamic Island) |
safari_check_pwa | iOS の「ホーム画面に追加」/PWA 対応状況(apple-touch-icon、manifest、theme-color、スプラッシュ画面)を監査します |
safari_webkit_compat | CSS.supports() を使って、この Safari でページの CSS を確認します — 未対応のプロパティ、不足している -webkit- 接頭辞、既知の不具合を調べます |
セキュリティ
Safari MCP は攻撃対象領域を最小限に抑え、Mac 上でローカルに動作します。
| 項目 | 詳細 |
|---|---|
| ネットワーク | リモート接続なし — すべての通信はローカル(stdio と localhost)です |
| 権限 | macOS のシステム権限が必要です(スクリーンショットには Screen Recording が必要です) |
| データ | テレメトリや分析データはなく、データはどこにも送信されません |
| 拡張機能 | ローカルのプロファイルブリッジ(localhost:9224/9228/9232/9236)とのみ通信し、Safari によって検証されます |
| コード | 完全なオープンソース(MIT)です — すべての行を監査できます |
Safari MCP と代替ツールの比較
| 機能 | Safari MCP | Chrome DevTools MCP | Playwright MCP |
|---|---|---|---|
| CPU/発熱 | 🟢 最小限 | 🔴 高い | 🟡 中程度 |
| ログイン情報 | ✅ 使用可能 | ✅ 使用可能 | ❌ 使用不可 |
| macOS ネイティブ | ✅ WebKit | ❌ Chromium | ❌ Chromium/WebKit |
| ブラウザーの依存関係 | なし | Chrome + デバッグポート | Playwright ランタイム |
| ツール | 98 | 約30 | 約25 |
| ファイルのアップロード | JS(ダイアログなし) | CDP | Playwright API |
| 画像の貼り付け | JS(クリップボードなし) | CDP | Playwright API |
| フォーカスの奪取 | ❌ バックグラウンド | ❌ バックグラウンド | ❌ ヘッドレス |
| ネットワークのモック | ✅ | ❌ | ✅ |
| Lighthouse | ❌ | ✅ | ❌ |
| パフォーマンストレース | ❌ | ✅ | ❌ |
ヒント: 日常的なブラウジング作業(業務の95%)には Safari MCP を使い、Lighthouse/パフォーマンス監査にのみ Chrome DevTools MCP を使ってください。
Apple 公式 Safari MCP(safaridriver)との比較
2026年7月、Apple は safaridriver をベースにした公式 Safari MCP サーバーをリリースしました。最初に Safari Technology Preview 247 で公開され、その後、安定版 Safari 27.0 以降にも搭載されています。これはこのカテゴリの有効性を示す素晴らしい例ですが、別の用途向けに作られています。Apple のサーバーはデバッグ用に隔離された WebDriver 自動化セッションを操作しますが、safari-mcp は、すでにログインしている実際の Safariを操作します。
macOS 27.0 と Safari 27.0 では、safaridriver --help に --mcp が表示され、tools/list の応答には17項目が含まれます(2026-09-15 に確認)。Safari 26.5.2 には --mcp がありませんでした(2026-07-23 に確認)。お使いのマシンで safaridriver --help | grep mcp を実行して確認してください。
両方を実行しますか? Apple のセットアップガイドでは、サーバーを
safari-mcpという名前で登録しています(claude mcp add safari-mcp -- /usr/bin/safaridriver --mcp)。これはこのパッケージと同じ名前です。クライアントがどちらか一方をもう一方で上書きしたり、どちらのサーバーが応答したのか分からなくなったりしないよう、claude mcp add safari-webdriver -- /usr/bin/safaridriver --mcpのように、どちらかに別の名前を付けてください。
| 🦁 safari-mcp (このリポジトリ) | Apple safaridriver --mcp | |
|---|---|---|
| 実際のログイン情報/Cookie | ✅ 実際に使用している Safari | ⚠️ 隔離された自動化セッション — 自動入力やブラウジングアクティビティにはアクセスできません |
| 実行環境 | ✅ あらゆる Mac の安定版 Safari | ⚠️ Safari 27 以降、または Safari Technology Preview 247 以降 |
| バックグラウンド(フォーカスを奪わない) | ✅ はい | ❌ 「自動化によって制御されています」というバナーが表示された専用ウィンドウ |
ページから見た navigator.webdriver | ✅ false — 通常のタブ | ⚠️ true — すべての WebDriver セッションで必須 |
| ツール | 98 | 17 |
| ストレージ(Cookie、localStorage、IndexedDB) | ✅ 10個のツール | ❌ |
| ネットワークのモック+スロットリング | ✅ はい | ❌ 読み取り専用のネットワーク検査 |
| デバイスのエミュレーション(iPhone、iPad) | ✅ はい | ⚠️ ビューポート+メディアタイプのみ |
| セットアップ | npx safari-mcp | Safari の「開発」設定で「リモートオートメーションと外部エージェントを許可」を有効にし、クライアントを safaridriver --mcp に接続します |
| Apple の公式サポート | ❌ コミュニティ(MIT) | ✅ Apple、WebDriver 標準 |
navigator.webdriverの項目について: WebDriver 標準では、リモート制御されるすべてのセッションがtrueを返す必要があるため、Apple のサーバーもそうなります。safari-mcp は通常のタブで JavaScript を評価するため、falseを読み取ります(Safari 27.0、2026-09-17 に確認)。Web サイトが WebDriver の通信を拒否する場合、これが違いになります。これは検出回避機能ではありません。ブラウザーのそれ以外の情報は隠されず、実際のログイン情報を使用するため、すべてのページがあなたの正確な身元を把握していると考えてください。
Apple のサーバーが適している場合: Safari 27 以降での互換性デバッグのために、WebDriver 標準に準拠したクリーンルームのセッションが必要な場合です。それ以外すべての用途、つまり、すでにログインしているブラウザーをバックグラウンドで日常的に自動化する用途には、safari-mcp がまさにそのために作られています。
なぜ他の Safari MCP プロジェクトではなく、Safari MCP なのか?
「safari-mcp」と呼ばれるプロジェクトはいくつかあります。それぞれを比較してみましょう。
| 機能 | 🦁 safari-mcp (このリポジトリ) | lxman/safari-mcp-server | Epistates/MCPSafari | HayoDev/safari-devtools-mcp |
|---|---|---|---|---|
| ツール | 98 | ~10 | 23 | ~15 |
| インストール | npx safari-mcp | 手動 | バイナリ | npx |
| エンジン | デュアル(拡張機能 + AppleScript) | WebDriver | 拡張機能のみ | DevTools Protocol |
| 実際の Safari ログイン情報を保持 | ✅ はい | ⚠️ 限定的 | ✅ はい | ❌ デバッグセッション |
| バックグラウンド動作(フォーカスを奪わない) | ✅ はい | ❌ いいえ | ⚠️ 場合による | ✅ はい |
| ストレージツール(Cookie、localStorage、IndexedDB) | 10 | 0 | 0 | 2 |
| データ抽出(テーブル、メタデータ、画像、リンク) | 4 | 0 | 0 | 0 |
| ネットワークのモック | ✅ はい | ❌ いいえ | ❌ いいえ | ❌ いいえ |
| デバイスのエミュレーション(iPhone、iPad、Pixel) | ✅ はい | ❌ いいえ | ❌ いいえ | ❌ いいえ |
| ファイルのアップロード(ダイアログなし) | ✅ JS DataTransfer | ❌ いいえ | ❌ いいえ | ❌ いいえ |
| 画像の貼り付け(クリップボードに触れない) | ✅ はい | ❌ いいえ | ❌ いいえ | ❌ いいえ |
| PDF エクスポート | ✅ はい | ❌ いいえ | ❌ いいえ | ❌ いいえ |
| コンソールのキャプチャ | 4 ツール | 0 | 1 | 1 |
| パフォーマンス指標 + Web Vitals | ✅ はい | ❌ いいえ | ❌ いいえ | ⚠️ 部分的 |
| 積極的なメンテナンス | ✅ 週に複数回リリース | 🟡 不定期 | 🟡 低頻度 | 🟡 低頻度 |
| ライセンス | MIT | MIT | 指定なし | MIT |
| MCP Registry に登録 | ✅ | ❌ | ❌ | ✅ |
| Awesome MCP に登録 | ✅ | ❌ | ❌ | ❌ |
要約 — インストールが最もスムーズで、ツールが最も充実し、積極的にメンテナンスされている完全版 Safari MCP をお探しなら、これが最適です。
アーキテクチャ
Safari MCP はデュアルエンジンアーキテクチャを採用しています。速度と高度な機能を優先して拡張機能を使用し、いつでも利用できるフォールバックとして AppleScript を備えています。
Claude/Cursor/AI Agent
↓ MCP Protocol (stdio)
Safari MCP Server (Node.js)
↓ ↓
Extension (HTTP) AppleScript + Swift daemon
(~5-20ms/cmd) (~5ms/cmd, always available)
↓ ↓
Content Script do JavaScript in tab N
↓ ↓
Page DOM ←←←←←←←←←← Page DOM
主な設計上の判断:
- 自動フォールバック付きのデュアルエンジン — 拡張機能を優先し、接続されていない場合は AppleScript がすべてをシームレスに処理します
- 永続的な Swift ヘルパー — コマンドごとにプロセスを起動する代わりに、1 つのプロセスを長時間実行します(16 倍高速)
- タブインデックスによる操作 — すべての JS はインデックスで指定した特定のタブ上で実行され、画面上のフォーカスを奪うことはありません
- JS 優先のアプローチ — 入力、クリック、ファイルアップロードはすべて JavaScript イベントを使用します(System Events のキーボード競合を回避)
activateを使用しない — Safari が前面に表示されることはありません
Safari 拡張機能(任意)
Safari MCP 拡張機能は任意ですが、推奨されます。拡張機能がなくても、機能の約 80% は AppleScript のみで動作します。拡張機能を追加すると、AppleScript では実現できない機能を利用できます。
拡張機能で追加される機能
| 機能 | 拡張機能あり | AppleScript のみ |
|---|---|---|
| 閉じた Shadow DOM(Reddit、Web Components) | ✅ 完全にアクセス可能 | ❌ 表示不可 |
| 厳格な CSP を設定したサイト | ✅ MAIN world 経由で回避 | ❌ ブロックされることが多い |
| React/Vue/Angular の状態操作 | ✅ 高度(Fiber、ProseMirror) | ⚠️ 基本的 |
| 読み込み状態の検出(スピナー、スケルトン) | ✅ スマートに検出 | ❌ なし |
| ダイアログ処理(alert/confirm) | ❌ | ✅ AppleScript のみ |
| OS ネイティブレベルのクリック(CGEvent) | ❌ | ✅ AppleScript のみ |
| PDF エクスポート | ❌ | ✅ AppleScript のみ |
拡張機能が必要なのはどんなときですか? 閉じた Shadow DOM を使用する最新の SPA(例:Reddit)、厳格な Content Security Policy を設定したサイト、またはフレームワークを多用するエディター(Draft.js、ProseMirror、Slate)を自動化する場合です。
拡張機能のインストール
この拡張機能を使用するには、Xcode(無料、macOS に付属)で一度ビルドする必要があります。
npm ユーザー向けの注意:
xcode/ディレクトリは npm パッケージに含まれていません。 GitHub リポジトリをクローンして、ソースからビルドしてください。
前提条件: Xcode(App Store からインストール — 無料)
# 1. Clone the repo (the npm package does not include the Xcode project)
git clone https://github.com/achiya-automation/safari-mcp.git
cd safari-mcp
# 2. Build a clean, Apple Development-signed app
# If needed, first choose your Team in Xcode → Signing & Capabilities.
xcodebuild -project "xcode/Safari MCP/Safari MCP.xcodeproj" \
-scheme "Safari MCP (macOS)" -configuration Release \
-allowProvisioningUpdates clean build
# 3. Locate the signed app
APP_PATH=$(find ~/Library/Developer/Xcode/DerivedData/Safari_MCP-*/Build/Products/Release -name "Safari MCP.app" -maxdepth 2 | head -1)
# 4. Re-sign safari-helper with the Apple Events entitlement
# (helps macOS surface the TCC Automation prompt reliably).
# Keep the stable identifier: macOS keys the Accessibility grant to it.
codesign --sign - --force --identifier com.achiya-automation.safari-mcp \
--entitlements safari-helper.entitlements safari-helper
# 5. Open the app (needed once so Safari registers the extension)
open "$APP_PATH"
codesign --deep --sign -を使ってSafari MCP.appをアドホック署名し直さないでください。 これにより、ラッパーと埋め込み拡張機能の Apple Development ID が置き換えられます。すると、現在の Safari は拡張機能を無効にしたり、削除済みとしてマークしたりすることがあります。以前のビルドにアドホック署名した場合は、上記のclean buildコマンドをもう一度実行してください。
または、xcode/Safari MCP/Safari MCP.xcodeproj を Xcode で直接開き、「Signing & Capabilities」で Apple ID を選択して、「Run」をクリックしてください。ローカルで使用する場合は、無料の個人用 Apple Developer アカウントで十分です。
続いて Safari で次の操作を行います。
- Safari → 設定 → 詳細 → Web デベロッパ用の機能を表示を有効にする
- Safari → 設定 → デベロッパ → 署名されていない拡張機能を許可(Safari を再起動するたびに必要)
- Safari → 設定 → 機能拡張 → Safari MCP Bridgeを有効にする
拡張機能は、自身の Safari プロファイルと一致するプロファイルを宣言している最初のローカルブリッジに自動的に接続します。ブリッジのデフォルトのポートは 9224、9228、9232、9236 です。通常、単一プロファイルの設定では 9224 を使用します。
注意: 「署名されていない拡張機能を許可」の設定は、Safari を再起動するたびにリセットされます。再起動後は毎回、Safari → 設定 → デベロッパで再度有効にしてください。拡張機能自体はインストールされたままです。
ツールバーアイコンの状態:
- ON — MCP サーバーに接続中
- OFF — ポップアップから手動で無効化
- (バッジなし) — サーバーが起動していません。自動的に再接続します
macOS の権限
Safari MCP では、次の権限を一度だけ許可する必要があります。
| 権限 | 場所 | 用途 |
|---|---|---|
| Apple Events からの JavaScript | Safari → 設定 → デベロッパ | do JavaScript に必要 |
| オートメーション → Safari | システム設定 → プライバシーとセキュリティ → オートメーション | AppleScript を利用するすべてのツールに必要 |
| 画面収録 | システム設定 → プライバシーとセキュリティ → 画面とシステムオーディオの収録 | 拡張機能を使わない safari_screenshot と safari_save_pdf に必要 |
| アクセシビリティ(safari-helper) | システム設定 → プライバシーとセキュリティ → アクセシビリティ(macOS 27 では デバイス制御とデータアクセス という名称) | safari_native_click、safari_native_keyboard、safari_native_hover、safari_save_pdf に必要 |
safari-helper にアクセシビリティ権限を付与する(safari_native_* に必要)
safari_native_click、safari_native_keyboard、safari_native_hover ツールは、フォーカスを奪うことなく OS レベルの CGEvent イベントを Safari に注入します。これらのイベントを最前面でないウィンドウに送るには、基盤となるヘルパーバイナリを macOS のアクセシビリティで承認する必要があります。
- システム設定 → プライバシーとセキュリティ → アクセシビリティを開きます(macOS 27 では、このパネルの名称はデバイス制御とデータアクセスです)。
+をクリックします(必要に応じてパスワードでロックを解除します)。- ヘルパーバイナリに移動して追加します。
- npm のグローバルインストール:
$(npm root -g)/safari-mcp/safari-helper - npx /プロジェクトへのインストール:
./node_modules/safari-mcp/safari-helper - ソースのクローンから:
/path/to/safari-mcp/safari-helper
- npm のグローバルインストール:
- その横の切り替えがONになっていることを確認します。
postinstall スクリプトは、ヘルパーに固定の識別子(com.achiya-automation.safari-mcp)で再署名するため、この権限は今後のアップグレード後も維持されます。この手順を行わない場合、ビルドごとにアドホック署名の識別子が変わるため、npm update のたびに承認が通知なく取り消されます。
safari_native_click が成功を報告するのにページが反応しない場合(isTrusted: true のクリックイベントが発生しない場合)、この承認がヘルパーに付与されていない可能性が最も高いです。safari_*(native_ なし)のツールには、この権限は必要ありません。
Automation → Safari の許可(IDE ユーザー向けの重要事項)
macOS の TCC では、Automation の許可は MCP サーバーを起動する 親プロセス に付与され、safari-mcp 自体には付与されません。そのため、Claude Code/Cursor/Windsurf を実行するアプリ(通常は Visual Studio Code または Terminal)に Automation → Safari の許可を付与する必要があります。
許可ダイアログが自動的に表示されない場合は、Automation の許可をすでに持っている Terminal から、このコマンドを一度実行してください。
osascript -e 'tell application "Safari" to get URL of current tab of window 1'
この呼び出しにより、Terminal アプリが Automation データベースに登録され、Safari の許可を求めるダイアログが表示されます。許可すると、その後は、どの子プロセスの呼び出し元チェーンからの MCP 呼び出しも機能します。
トラブルシューティング
| 問題 | 対処方法 |
|---|---|
| "AppleScript error" | Safari → Settings → Developer で "Allow JavaScript from Apple Events" を有効にします |
| "Not authorized to send Apple events to Safari" | IDE に Automation → Safari の許可を付与します(上記を参照) |
npm update 後に "Not authorized" と表示される | 更新によってバイナリの cdhash が変わり、macOS が Automation の許可を黙って取り消します。上記の osascript のワンライナーを再実行して、許可を付与し直してください |
safari_native_click は成功を報告するが、ページが反応しない | System Settings → Privacy & Security → Accessibility に safari-helper を追加します(上記の アクセシビリティの許可 を参照)。ページのコンソールで {capture:true} を指定して click リスナーを設定し、確認してください。許可がないと、isTrusted: true のイベントは発火しません |
| スクリーンショットが空 | Terminal/VS Code に Screen & System Audio Recording の許可を付与します。safari-mcp を LaunchAgent として実行する場合は、node バイナリ自体に許可を付与してください(Homebrew の node をアップグレードするとパスが変わるため、アップグレード後に許可を付与し直してください)。safari_doctor で対象のバイナリを確認できます |
| "Allow unsigned extensions" を有効にしても拡張機能が表示されない(macOS 27) | macOS 27.0 の既知の問題(183044008)です。この設定を有効にした状態で拡張機能アプリを再ビルドすると(拡張機能のインストール を参照)、表示されます |
| タブが見つからない | safari_list_tabs を呼び出してタブのインデックスを更新します |
| ヘブライ語キーボードの問題 | すべての文字入力に JS イベントを使用するため、キーボードレイアウトの影響を受けません |
| HTTPS がブロックされる | safari_navigate は HTTPS を自動的に先に試し、失敗した場合は HTTP にフォールバックします |
| Safari がフォーカスを奪う | 最新バージョンを使用していることを確認してください。newTab はアクティブなタブを復元します |
よくある質問
Safari Technology Preview でも動作しますか?
いいえ。すべての AppleScript の処理で application "Safari" を対象とし、ネイティブヘルパーはバンドル ID com.apple.Safari を検索します。そのため、STP(com.apple.SafariTechnologyPreview)は別のアプリケーションであり、safari-mcp が対象にすることはありません。通常版の Safari で実行してください。
なお、STP 247 以降(または Safari 27 以降)が必要なのは、Apple 自身の safaridriver --mcp サーバーです。Safari MCP と代替手段 を参照してください。この 2 つに関連はありません。
プライベートタブ/シークレットタブを操作できますか?
サポート対象のモードではなく、テストもされていません。プライベートウインドウを開くツールはなく、Safari では各拡張機能を明示的に有効にしない限り、プライベートブラウズで拡張機能が無効になるため、拡張機能ブリッジと、Safari 拡張機能(任意) の「With Extension」列にあるすべての機能は、デフォルトで無効です。
別の ID を使いたい場合は、代わりに Safari の別の プロファイル を使用してください。プロファイルウインドウはここで正式にサポートされる機能です(複数のエージェントを同時に実行する を参照)。
Safari の複数のウインドウで動作しますか?
はい。タブの検索ではウインドウ 1 に限定せず、every window を対象にします。また、ウインドウが 2 つ開いている場合はインデックスだけでは区別できないため、タブはそのウインドウの (index, tabCount) の組み合わせで識別します。プロファイルウインドウは、Safari の ProfileName — Tab Title というウインドウ名で判別されます。
対応している macOS のバージョンは?
Safari が動作する macOS であればどれでも対応しています。パッケージでは "os": ["darwin"] が宣言されており、最低 OS バージョンの指定はなく、コードにもバージョンによる制限はありません。必須要件は Node.js 20 以降です("engines": { "node": ">=20" })。
実際に OS の違いが関係するのは、次の 2 点です。
- macOS 27では、アクセシビリティのパネル名がデバイス制御とデータアクセスに変更されています。許可の内容は同じで、名前だけが変わっています(macOS のアクセス許可を参照)。
- Safari 26 および 27 では、いくつかのウェブプラットフォームの動作が変更されています。該当するツールはその変更に対応しており、ブロックされることはありません。
複数のインスタンスを同時に実行できますか?
はい。複数のエージェントを同時に実行するで説明しているとおりです。各セッションは独自のタブを所有し、所有権はタブのインデックスではなくセッションごとに追跡されます。そのため、あるエージェントが別のエージェントの所有するタブを操作したり閉じたりすることはできません。
1 つのプロセスが拡張機能ブリッジのポートを使用し、ほかのプロセスはそのプロセスを経由して接続します。ポートを使用しているプロセスが終了した場合は、ほかのプロセスがポートを引き継ぎます。
Safari を前面に表示しておく必要はありますか?
いいえ。safari_new_tab はバックグラウンドタブを開き、フォーカスを奪うことはありません。また、macOS によって復元時に暗黙のアクティブ化が強制される一部のコマンドは、実行後に元の最前面のアプリに戻ります。少し前に Safari で入力していた場合にフォーカスを維持するためのガードも備えています。
例外は、意図的にネイティブ操作を行うツールである safari_native_click、safari_native_keyboard、safari_native_hover です。これらは実際の OS イベントを送信するため、最前面のウィンドウに対して操作します。別の Safari タブで作業中は、これらを使用しないでください。
Safari の拡張機能とはどのように連携しますか?
既存の拡張機能は通常どおり動作します。safari-mcp は普段使用している Safari を操作するため、コンテンツブロッカーやパスワードマネージャーも、普段どおりに動作します。
safari-mcp には、オプションの独自拡張機能も付属しています。この拡張機能がなくても、ツールのおよそ 80% は AppleScript のみで動作します。拡張機能を追加すると、閉じたシャドウ DOM、厳格な CSP を使用するサイト、フレームワークの詳細な状態、読み込み状態の検出も利用できます。一方、ダイアログ処理、ネイティブクリック、PDF エクスポートは AppleScript のみで動作します。詳しくはSafari 拡張機能(オプション)を参照してください。
「Apple Events からの JavaScript を許可」が有効になっていない場合はどうなりますか?
JavaScript を評価する機能はすべて失敗します。safari_evaluate、safari_read_page、フォーム入力、データ抽出などが該当します。一方、タブを開いたり切り替えたりするなど、AppleScript のみを使う操作は引き続き動作します。「タブは開くのに何も読み取れない」という場合、通常はこれが原因です。
Safari → 設定 → 詳細 → Web デベロッパ向け機能を表示で有効にした後、Safari → 設定 → デベロッパ → Apple Events からの JavaScript を許可で有効にしてください。どちらも前提条件に記載されています。safari_doctor は残りの設定(Automation、ネイティブヘルパー、アクセシビリティ、画面収録)を確認し、修正方法のヒントでこの設定についても案内します。ただし、Apple Events の確認ではウィンドウの数しか調べず、Automation の許可だけで条件を満たすため、この設定が無効でもエラーにはなりません。
対応クライアント
Safari MCP は、MCP 対応のあらゆるクライアントで動作します。
| クライアント | 状態 |
|---|---|
| Claude Code | ✅ 毎日テスト済み |
| Claude Desktop | ✅ テスト済み |
| Cursor | ✅ テスト済み |
| Windsurf | ✅ 対応 |
| VS Code + Continue | ✅ 対応 |
貢献
プルリクエストを歓迎します!セットアップ手順については、CONTRIBUTING.mdをご覧ください。
コードベースは2つのファイルで構成されています。
safari.js— Safari 自動化レイヤー(AppleScript + JavaScript)index.js— ツール定義を含む MCP サーバー
スポンサー
Safari MCP は無料のオープンソースです。時間や CPU サイクルの節約に役立った場合は、開発へのご支援をご検討ください。
ご支援は、以下に活用されます。
- 🧪 macOS の各バージョンおよび Safari の各リリースでのテスト
- 🛠️ 新しいツールと機能
- 📖 ドキュメントとサンプル
商用サポート
Safari MCP を製品やエージェントスタックに組み込む必要がありますか? Achiya Automation では、以下を提供しています。
- 優先的なバグ修正と、ユースケースに合わせたカスタムツールの開発
- 統合コンサルティング — Safari MCP を本番環境のエージェントシステム(Claude、Cursor、n8n、カスタムシステム)に組み込む支援
- プライベートデプロイのサポート — マルチユーザーの Safari MCP、標準外の macOS 環境、CI/CD
- MCP ベースの自動化を導入するエンジニアリングチーム向けのトレーニングワークショップ
Safari MCP の作者が開発しました。お問い合わせください →
Safari MCP でエージェントが実現できること
AI エージェントが Safari MCP を操作すると、ヘッドレスブラウザーでは実現できないことが可能になります。
- 認証済みの実セッション — Gmail、GitHub、Ahrefs、Slack、銀行のダッシュボードにはすでにログインしています
- フレームワークを考慮したフォーム入力 —
safari_fill_and_submitは React/Vue/Angular のセッターをネイティブに呼び出すため、inputイベントが発火したかを推測する必要はありません - バックグラウンドでの動作 — Mac を使い続けながら、エージェントを並行して動かせます
- ワークフローごとに1回の MCP 呼び出し —
safari_run_scriptは、ナビゲーション、クリック、抽出を1回のラウンドトリップにまとめます
このパターンはモデルを問わず有効です。人間がすでに信頼しているブラウザーを操作することで、ログイン状態、Cookie、拡張機能、ユーザー固有の環境を一度に引き継げます。
コミュニティ
npm の月間ダウンロード数は6,000件以上 — 開発者は Safari MCP を使って macOS 上で AI エージェントを構築しています。
- GitHub Discussions — 質問したり、ユースケースを共有したりできます
- Issues — バグ報告や機能リクエスト
— 貢献を始めましょう
エコシステム
Safari MCP と連携する、その他の macOS MCP サーバーです。
| プロジェクト | 機能 | 用途 |
|---|---|---|
| mcp-server-macos-use | OS レベルの macOS 自動化(アクセシビリティ、画面制御) | Safari を超えたシステム全体の操作 |
| chrome-devtools-mcp | Chrome DevTools Protocol | Lighthouse の監査、Chrome 固有のパフォーマンストレース |
Safari MCP と Chrome DevTools MCP を併用していますか?Safari は日常的なブラウジングの95%を(オーバーヘッドなしで)処理し、Chrome は Lighthouse や Chrome 固有のトレースが必要な残りの5%を処理します。
掲載先
ライセンス
MIT — お好きなようにお使いください。
Achiya Automation が開発 — ビジネス向けの自動化と AI エージェント。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。