mcp-osascript について
mcp-osascriptは、macOSのアプリやシステム画面を自動化するMCPサーバーです。型付きツールに入力検証、権限に応じたエラー案内、スクリプト実行時の保護機能を備えています。
主な機能
- 01ウィンドウ、メニュー、キーボードの操作
- 02クリップボードのテキスト読み書き
- 03Safari、Chrome、Arcのタブ確認
- 04画面、領域、アプリウィンドウの撮影
- 05アプリ、ファイル、Shortcutsの管理
- 06権限確認とAppleScriptまたはJXAの実行
活用シーン
- 01アプリウィンドウの移動やサイズ変更
- 02ブラウザーのタブ確認や現在のURLのコピー
- 03アプリのメニューをたどって項目を選択
- 04スクリーンショット撮影やApple Shortcutの実行
MCP 対応
アプリ、ウィンドウ、メニュー、キーボード、クリップボード、ブラウザーのタブ、スクリーンショット、Shortcutsを操作する18個の型付きツールをMCPクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Claude で Mac を操作できます。 ウィンドウの移動、メニューのクリック、テキスト入力、クリップボードの読み取り、ブラウザータブの管理、スクリーンショットの撮影、ショートカットの実行などに対応しています。入力検証とセキュリティガードを備えた、型付きの 18 個のツールを利用できます。
公式 MCP レジストリに io.github.m0rvayne/mcp-osascript として登録されています。

クイックスタート
Claude Desktop — ワンクリックでインストール。 最新リリースから mcp-osascript-1.1.3.mcpb をダウンロードし、ダブルクリックしてください。Claude Desktop が拡張機能をインストールします。
または、設定ファイルに手動で追加します。
{
"mcpServers": {
"osascript": {
"command": "npx",
"args": ["-y", "mcp-osascript"]
}
}
}
これを Claude Desktop の設定(Settings → Developer → Edit Config)に追加し、Claude を再起動すれば準備完了です。
その他のクライアント用の設定(Cursor、VS Code、Claude Code)
Cursor / VS Code(Copilot)
{
"mcpServers": {
"osascript": {
"command": "npx",
"args": ["-y", "mcp-osascript"]
}
}
}
Claude Code
claude mcp add osascript -- npx -y mcp-osascript
ソースから実行(開発用)
git clone https://github.com/m0rvayne/mcp-osascript.git
cd mcp-osascript && npm install
# then use: "command": "node", "args": ["/path/to/mcp-osascript/server/index.js"]
こんなプロンプトを試してみましょう
インストールしたら、Claude に次のように頼んでみてください。
| プロンプト | 実行される内容 |
|---|---|
| 「Safari を開いて、どんなタブがあるか見せて」 | Safari を起動し、すべてのタブのタイトルと URL を読み取ります |
| 「Finder のウィンドウを画面の左半分に移動して」 | ウィンドウのサイズと位置を調整します |
| 「Keynote で『ファイル』→『PDF として書き出す』をクリックして」 | メニューバーをたどり、項目をクリックします |
| 「アクティブな Chrome タブの URL をコピーして」 | ブラウザータブを読み取り、アクティブなタブを見つけます |
| 「アクティブなテキストフィールドに『Hello World』と入力して」 | キーボード入力をシミュレートします |
| 「完了したら通知を表示して」 | macOS のネイティブバナーを表示します |
| 「今使っているアプリは何?」 | 最前面のアプリ名とバンドル ID を返します |
| 「Cmd+Shift+4 を押して」 | スクリーンショットのショートカットを実行します |
| 「VS Code の『編集』メニューにある項目をすべて一覧表示して」 | メニューバーの内容を調べます |
| 「ターミナルの 2 番目のウィンドウを閉じて」 | インデックスで特定のウィンドウを指定します |
| 「Safari のウィンドウをスクリーンショットに撮って、デスクトップに保存して」 | 画面全体ではなく、そのウィンドウだけを撮影します |
| 「Slack のウィンドウはどのモニターにある?」 | ディスプレイのジオメトリとウィンドウの位置を読み取ります |
| 「エディター以外をすべて隠して」 | アプリを終了せずに非表示にします |
| 「『Daily Standup』ショートカットを実行して」 | 名前を指定して Apple ショートカットを実行します |
ツール
入力検証、エラー分類、権限を考慮したエラーメッセージを備えた、型付きツールが18個あります。
| ツール | 機能 | 権限 |
|---|---|---|
check_permissions | 付与されている権限と、それぞれで利用できる機能を報告します | なし |
run_osascript | 任意のAppleScriptまたはJXAスクリプトを実行します | なし |
get_clipboard | クリップボードの内容をテキストとして読み取ります | なし |
set_clipboard | テキストをクリップボードに書き込みます | なし |
send_notification | macOSの通知バナーを表示します | なし |
open_url | ブラウザーでURLを開きます(http/https/mailtoのみ) | なし |
open_app | アプリを起動するか、前面に表示します | なし |
get_frontmost_app | アクティブなアプリ名とバンドルIDを取得します | オートメーション |
get_browser_tabs | Safari、Chrome、Arcのタブを一覧表示します | オートメーション |
type_text | アクティブなアプリにテキストを入力します(最大500文字) | アクセシビリティ |
press_key | 修飾キー付きでキーを押します(cmd+c、return、f5) | アクセシビリティ |
manage_windows | ウィンドウの一覧表示/移動/サイズ変更/最小化/フルスクリーン化/終了を行います | アクセシビリティ |
get_displays | モニターの位置、サイズ、メインディスプレイを一覧表示します | なし |
app_menu | 任意のアプリのメニュー項目を一覧表示またはクリックします | アクセシビリティ |
screenshot | 画面全体、指定領域、またはアプリのウィンドウをキャプチャします | 画面収録 |
app_visibility | アプリケーションを隠す、再表示する、または終了します | アクセシビリティ |
file_open | ファイルまたはフォルダーを開きます。必要に応じてアプリを指定できます | なし |
run_shortcut | Apple Shortcutsを一覧表示または実行します | なし |
自己修正するメニュー
Claudeが存在しないメニュー項目をクリックしようとすると、サーバーはその階層で利用可能な項目の一覧を自動的に返します。そのため、Claudeは正しい名前で再試行できます。この機能を備えたMCPサーバーはほかにありません。
User: "Click File → Export as PDF in Preview"
Claude: calls app_menu click ["File", "Export as PDF"]
Server: "Menu item 'Export as PDF' not found in 'File'.
Available: ['New from Clipboard', 'Open...', 'Close', 'Save',
'Duplicate', 'Rename...', 'Export...', 'Export as PDF...']"
Claude: calls app_menu click ["File", "Export as PDF..."]
Server: "Clicked: File > Export as PDF..."
mcp-osascriptを選ぶ理由
| mcp-osascript | steipete(880★) | peakmojo(464★) | |
|---|---|---|---|
| 検証機能付きの型付きツール | 18 | 2(汎用) | 1(汎用) |
| URLスキームの許可リスト | http/https/mailto | なし | なし |
| 環境変数の分離(子プロセス) | PATH+HOME+LANGのみ | process.env全体 | process.env全体 |
| プロセスグループの終了(孤立プロセスなし) | SIGTERM→SIGKILL | なし | なし |
| エラーのサニタイズ(パス、トークン) | あり | なし | なし |
| プロトタイプ汚染への保護 | Object.create(null) | なし | なし |
| 自己修正するメニュークリック | あり | なし | なし |
| 統合テスト | 84 | 0 | 0 |
| CIでのテスト実行 | あり | なし | なし |
| レッドチーム監査の合格回数 | 4 | 0 | 0 |
| 信頼できない出力の隔離 | あり | なし | なし |
| 標準入力からのパイプ入力(一時ファイルなし) | あり | 一時ファイル | 一時ファイル |
スター数は人気の指標であり、品質の指標ではありません。どちらの代替プロジェクトも、このプロジェクトより数か月前から存在しています。上記の行は、実際の利用において異なる点を示しています。
セキュリティ監査
レッドチーム監査を4回実施しました(作者が依頼したもので、エージェントがソースコードを対象に攻撃的な検証を行います。第三者認証ではありません)。直近の監査では、v1.1.2を対象に3つのエージェントを並行して稼働させ、シェルの対象範囲、AppleScriptのエスケープ、情報漏えいを調査しました。その結果、ツールが別のツールのスキーム許可リストを密かに無効化する問題や、サーバーがデッドロックするまで同時実行スロットが解放されない可能性など、実際の欠陥が6件見つかりました。すべての問題を修正し、回帰テストを追加しています。escapeASは、13種類の文字列ブレイクアウト候補を実際のosascriptで検証し、いずれもすり抜けないことを確認しました。
権限
ツールは3つの階層で動作します。
- 権限不要 — クリップボード、通知、URL、アプリ、ファイル、ディスプレイ、ショートカット。すぐに利用できます。
- オートメーション — ブラウザーのタブ、最前面のアプリ。ブラウザーごとにmacOSの確認が一度表示されます。
- アクセシビリティ — キーボード、ウィンドウ、メニュー、非表示/再表示。システム設定 → プライバシーとセキュリティ → アクセシビリティで一度許可します。
- 画面収録 — スクリーンショットのみ。システム設定 → プライバシーとセキュリティ → 画面収録で許可します。
Claudeにcheck_permissionsを実行するよう依頼すると、すでに許可されている項目、それぞれの項目で利用可能になるツール、残りの設定を行うために開くべき設定パネルを正確に教えてくれます。確認処理は読み取り専用で、権限の確認ダイアログが表示されることはありません。
必要な権限がない場合、サーバーが具体的な手順を表示します。
"Accessibility permission required. Grant access to 'osascript'
in System Settings > Privacy & Security > Accessibility."
テスト
npm test
18種類すべてのツールを対象とする84件の統合テストがあります。入力検証、セキュリティ境界(URLスキームのブロック、プロトタイプ汚染、スクリプトサイズ制限)、タイムアウトの適用、権限エラーの処理、セキュリティ監査で見つかったすべての問題に対するリグレッションテストを網羅しています。
セキュリティとアーキテクチャ
セキュリティ
run_osascriptは任意のコードを実行します。これは意図した設計です。信頼境界となるのはMCPクライアント(Claude)です。- スクリプトは標準入力経由で
/usr/bin/osascriptに渡されます。一時ファイルは使用せず、TOCTOU競合状態も発生しません。 - スクリプトのサイズ上限は50 KBです。出力は最大50K文字で、UTF-8文字の境界で切り詰められるため、ラテン文字以外の出力でも文字化けしません。
- エラーメッセージはサニタイズされ、ファイルシステムのパス、トークン、パスワードは削除されます。
- 子プロセスに渡す環境変数は
PATH、HOME、LANGのみです。APIキーやシークレットが漏れることはありません。 - URLスキームは許可リスト方式です。
file://、smb://、vnc://、javascript:はすべてブロックされます。 - ハンドラーのディスパッチには
Object.create(null)を使用し、プロトタイプ汚染を防ぎます。 - 外部から取得したテキスト(ブラウザーのタブ名、ウィンドウ名、メニュー項目、クリップボード)は、明示的な
<untrusted-data>エンベロープ内に返されます。これにより、自分の名前を変更するWebページがモデルのコンテキストに指示を紛れ込ませるのを防ぎます。 file_openは、URLとして解析されるものをすべて拒否します。open(1)はURLとパスの両方を解決するため、このチェックがないとopen_urlのスキーム許可リストがひそかに無効化されてしまいます。screenshotは、overwrite: trueが指定されていない限り既存のファイルを上書きしません。また、拡張子は形式と一致する必要があります。- リストを作成するすべてのツールは、アプリから取得した名前に含まれる
|、CR、LFを取り除きます。そのため、細工されたウィンドウ名やタブ名でレコードを偽造できません。
信頼性
- タイムアウト時にはプロセスグループを終了します。SIGTERMを送り、2秒間待機した後にSIGKILLを送信します。孤立プロセスは発生しません。
- 同時実行を制御するセマフォにより、同時に実行されるosascriptプロセスは最大5つです。
- グレースフルシャットダウンに対応しており、
server.close()に加えて、10秒後に強制終了する安全策があります。 - エラー分類ではmacOSのエラーコード(-1728、-1743、-25211)を解析し、対応可能なメッセージに変換します。英語とロシア語のロケールに対応しています。
要件
- macOS 13以降(Ventura以降)
- Node.js 18以降
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。