A local MCP server that exposes controlled AppleScript automation tools
MCP-AppleScript
A local MCP server that exposes controlled AppleScript automation tools to MCP clients on macOS.
[!CAUTION] This software can read, create, modify, and delete your personal data across Notes, Calendar, Reminders, Mail, Contacts, Messages, Photos, Music, Finder, and Safari.
By running this server you are granting an AI model the ability to interact with your macOS applications on your behalf. Although multiple safety layers exist (operation modes, per-app allowlists, destructive-action confirmation), no automated safeguard is foolproof. An unexpected prompt, a misconfigured policy, or a model hallucination could result in data loss, disclosure of private information, or unintended actions such as sending messages or emails.
You are solely responsible for:
- Reviewing and understanding the configuration and policy model before enabling any app
- Starting in
readonlymode and only escalating when you understand the consequences- Keeping the number of enabled apps to the minimum you actually need
- Never running in
fullmode unattendedThis project is provided as-is, with no warranty. See LICENSE.
Overview
MCP-AppleScript provides a secure bridge between the Model Context Protocol and macOS automation via AppleScript. It consists of two components:
- MCP Server (TypeScript/Node.js): Handles the MCP protocol, tool schemas, configuration, validation, logging, and policy enforcement
- Swift Executor: Executes AppleScript commands via
NSAppleScriptand returns structured JSON results
Tools
All 10 Apple apps are accessed through generic app.* tools with an app parameter:
| Tool | Mode | Description |
|---|---|---|
applescript.ping |
readonly | Health check — returns server version and supported apps |
applescript.get_mode |
readonly | Get current operation mode and enabled tools |
applescript.set_mode |
readonly | Change operation mode (readonly/create/full) |
app.list_containers |
readonly | List containers (folders, calendars, mailboxes, playlists, etc.) |
app.list |
readonly | List items in a container with pagination |
app.get |
readonly | Get a single item by ID |
app.search |
readonly | Search/filter items |
app.create |
create | Create a new item |
app.action |
create | App-specific actions (send, play, complete, do_javascript, etc.) |
applescript.run_template |
create | Execute a registered template by ID (policy-gated) |
app.update |
full | Update an item (confirmation required) |
app.delete |
full | Delete an item (confirmation required) |
applescript.run_script |
full | Execute raw AppleScript (confirmation required) |
Supported Apps
Notes, Calendar, Reminders, Mail, Contacts, Messages, Photos, Music, Finder, Safari
Operation Modes
The server starts in readonly mode by default. Use applescript.set_mode to change modes on-the-fly:
| Mode | Description | Available Tools |
|---|---|---|
| readonly | No creation, editing, or deleting | ping, get_mode, set_mode, app.list/get/search/list_containers |
| create | Readonly + creation allowed | + app.create, app.action, run_template |
| full | All operations, potentially destructive | + app.update, app.delete, run_script (requires confirmation) |
When the mode changes, the client is notified via notifications/tools/list_changed and will only see tools available in the current mode.
Destructive Action Confirmation
In full mode, destructive tools (app.update, app.delete, run_script) require user confirmation:
- If the MCP client supports elicitation, a confirmation dialog is shown
- Otherwise, a confirmation token is returned — pass it back in a second call to confirm
Requirements
- macOS 12.0 or later
- Node.js 20+ (only for building from source)
- Swift 5.9+ (only for building from source)
- pnpm 8+ (only for building from source)
Installation
Option 1: Download pre-built binary (.dmg)
Download the latest .dmg from GitHub Releases:
- Open the
.dmgand copymcp-applescriptto/usr/local/bin/:sudo cp /Volumes/MCP-AppleScript\ */mcp-applescript /usr/local/bin/ - Create a config file:
mkdir -p ~/.config/applescript-mcp cat > ~/.config/applescript-mcp/config.json << 'EOF' { "defaultMode": "readonly", "apps": { "com.apple.Notes": { "enabled": true }, "com.apple.iCal": { "enabled": true }, "com.apple.reminders": { "enabled": true }, "com.apple.mail": { "enabled": true }, "com.apple.Contacts": { "enabled": true } } } EOF - Add to your MCP client config (see Claude Desktop below)
The pre-built binary is a self-contained executable with Node.js and the Swift executor
Tools (13)
applescript.pingHealth check returning server version and supported appsapplescript.get_modeGet current operation mode and enabled toolsapplescript.set_modeChange operation mode (readonly/create/full)app.list_containersList containers like folders, calendars, mailboxes, or playlistsapp.listList items in a container with paginationapp.getGet a single item by IDapp.searchSearch or filter itemsapp.createCreate a new itemapp.actionPerform app-specific actions like send, play, or completeapplescript.run_templateExecute a registered template by IDapp.updateUpdate an existing itemapp.deleteDelete an itemapplescript.run_scriptExecute raw AppleScriptConfiguration
{"mcpServers": {"applescript": {"command": "/usr/local/bin/mcp-applescript", "args": ["--config", "~/.config/applescript-mcp/config.json"]}}}