Skip to main content
Glama
macOS Automation MCP Server

macOS Automation MCP Server

by matthewdcage

macOS Automation MCP Server

A comprehensive MCP (Model Context Protocol) server for macOS automation via AppleScript. This server provides 45 universal tools for system control, application management, calendar, reminders, notifications, clipboard operations, and scheduled tasks.

Built with FastMCP and Pydantic for type-safe, production-ready operation.

✅ Verified Working

  • macOS 26.1+ compatible

  • All 45 tools registered and functional

  • AppleScript execution engine tested

  • Shell command safety validation active

Related MCP server: mac-mcp-server

Features

P0 - Essential Tools (12 System + 6 App + 3 Notification + 3 Clipboard = 24 tools)

  • System Control: Volume, dark mode, display sleep, WiFi, text-to-speech, screenshots

  • Application Control: Launch, quit, list, and manage running applications

  • Notifications: Send notifications, alerts, and dialogs

  • Clipboard: Read, write, and manage clipboard contents

P1 - Extended Tools (6 Finder + 3 Calendar + 5 Reminders = 14 tools)

  • Finder Operations: Create folders, move to trash, reveal files, search

  • Calendar Integration: List, create, and manage calendar events

  • Reminders Integration: List, create, complete, and manage reminders

P2 - Advanced Tools (4 Script + 3 Scheduler = 7 tools)

  • Script Execution: Run AppleScript and shell commands

  • Task Scheduler: Create and manage launchd scheduled tasks

Installation

Prerequisites

  • macOS 10.15 or later

  • Python 3.10 or later

  • uv (recommended) or pip

cd /path/to/mcp-applescript-automation
uv sync

Install with pip

cd /path/to/mcp-applescript-automation
pip install -e .

Configuration

Claude Desktop / Cursor

Add to your MCP configuration file:

{
  "mcpServers": {
    "macos-automation": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/mcp-applescript-automation", "python", "main.py"],
      "env": {}
    }
  }
}

Minerva Platform

Add to config/mcp-servers.json:

"macos-automation-mcp": {
  "command": "uv",
  "args": ["run", "--directory", "/Volumes/dev-4tb/AA-GitHub/MCP/mcp-applescript-automation", "python", "main.py"],
  "env": {},
  "description": "macOS Automation MCP: System control, app management, calendar, reminders, notifications, scheduled tasks via AppleScript"
}

Permissions

This server requires certain macOS permissions to function:

  1. Automation Permission (Required)

    • System Preferences > Privacy & Security > Privacy > Automation

    • Grant permission to your terminal app (Terminal, iTerm2, Cursor, etc.)

  2. Accessibility Permission (For some UI automation)

    • System Preferences > Privacy & Security > Privacy > Accessibility

    • Required for advanced UI interactions

  3. Calendar/Reminders Access (For calendar/reminder tools)

    • System Preferences > Privacy & Security > Privacy > Calendars/Reminders

    • Required for calendar and reminder management

Available Tools (45 Total)

System Control (12 tools)

Tool

Description

get_system_info

Get macOS version, hostname, user, and uptime

set_volume

Set system volume (0-100)

get_volume

Get current volume level

toggle_mute

Toggle audio mute

toggle_dark_mode

Toggle dark/light mode

set_dark_mode

Set dark mode explicitly

is_dark_mode

Check if dark mode is enabled

sleep_display

Put display to sleep

say_text

Speak text using TTS

take_screenshot

Capture screenshot

get_wifi_network

Get current WiFi network

toggle_wifi

Enable/disable WiFi

Application Control (6 tools)

Tool

Description

list_running_apps

List all running applications

get_frontmost_app

Get active application info

launch_app

Launch an application

quit_app

Quit an application

hide_app

Hide an application

is_app_running

Check if app is running

Notifications (3 tools)

Tool

Description

send_notification

Send macOS notification

send_alert

Show alert dialog

choose_from_list

Show selection dialog

Clipboard (3 tools)

Tool

Description

get_clipboard

Get clipboard text

set_clipboard

Copy text to clipboard

clear_clipboard

Clear clipboard

Finder (6 tools)

Tool

Description

reveal_in_finder

Reveal file in Finder

create_folder

Create new folder

move_to_trash

Move items to Trash

empty_trash

Empty Trash

get_selected_files

Get Finder selection

search_files

Search using Spotlight

Calendar (3 tools)

Tool

Description

list_calendars

List all calendars

list_calendar_events

List upcoming events

create_calendar_event

Create new event

Reminders (5 tools)

Tool

Description

list_reminder_lists

List reminder lists

list_reminders

List reminders

create_reminder

Create new reminder

complete_reminder

Mark reminder complete

get_overdue_reminders

Get overdue items

Scripts (4 tools)

Tool

Description

run_applescript

Execute AppleScript code

run_shell_command

Execute shell command (with safety checks)

open_url

Open URL in browser

open_file

Open file with app

Task Scheduler (3 tools)

Tool

Description

create_scheduled_task

Create launchd task

list_scheduled_tasks

List managed tasks

remove_scheduled_task

Remove a task

Complete Tool List (Alphabetical)

choose_from_list, clear_clipboard, complete_reminder, create_calendar_event,
create_folder, create_reminder, create_scheduled_task, empty_trash,
get_clipboard, get_frontmost_app, get_overdue_reminders, get_selected_files,
get_system_info, get_volume, get_wifi_network, hide_app, is_app_running,
is_dark_mode, launch_app, list_calendar_events, list_calendars,
list_reminder_lists, list_reminders, list_running_apps, list_scheduled_tasks,
move_to_trash, open_file, open_url, quit_app, remove_scheduled_task,
reveal_in_finder, run_applescript, run_shell_command, say_text, search_files,
send_alert, send_notification, set_clipboard, set_dark_mode, set_volume,
sleep_display, take_screenshot, toggle_dark_mode, toggle_mute, toggle_wifi

Example Usage

Via Claude/Cursor

"Set my system volume to 50%"
"What applications are currently running?"
"Send me a notification with title 'Reminder' and message 'Check email'"
"Create a calendar event for tomorrow at 2pm called 'Team Meeting'"
"What's on my clipboard?"

Via MCP Tool Calls

# Set volume
result = await callMCPTool('macos-automation__set_volume', {'level': 50})

# Send notification
result = await callMCPTool('macos-automation__send_notification', {
    'title': 'Hello',
    'message': 'World'
})

# List running apps
result = await callMCPTool('macos-automation__list_running_apps', {})

Security

Shell Command Safety

The run_shell_command tool includes safety checks that block dangerous commands. Only whitelisted commands are allowed:

  • System info: sw_vers, uname, hostname, whoami, etc.

  • File info: ls, pwd, stat, file, etc.

  • Network info: networksetup, ifconfig, etc.

  • macOS utilities: defaults, launchctl, open, etc.

Dangerous patterns like rm -rf /, sudo rm, fork bombs, etc. are blocked.

AppleScript Sandboxing

AppleScript execution respects macOS sandboxing and permission systems. Scripts cannot access protected resources without proper permissions.

Development

Running Tests

uv run pytest tests/ -v

Verification

# Verify server loads correctly
cd /Volumes/dev-4tb/AA-GitHub/MCP/mcp-applescript-automation
uv run python -c "from macos_automation_mcp import mcp; print(f'Server: {mcp.name}')"

# List all registered tools
uv run python -c "
from macos_automation_mcp.server import mcp
tools = list(mcp._tool_manager._tools.keys())
print(f'Registered {len(tools)} tools')
for t in sorted(tools): print(f'  - {t}')
"

# Test basic functionality
uv run python -c "
from macos_automation_mcp.domains import system
result = system.get_system_info()
print(f'macOS: {result.get(\"macos_version\")}')
print(f'Host: {result.get(\"hostname\")}')
"

Project Structure

mcp-applescript-automation/
├── macos_automation_mcp/
│   ├── __init__.py
│   ├── server.py              # FastMCP server with 45 tool definitions
│   ├── core/
│   │   ├── __init__.py
│   │   ├── applescript.py     # AppleScript execution engine (osascript)
│   │   ├── shell.py           # Safe shell command execution
│   │   └── scheduler.py       # launchd task integration
│   ├── domains/
│   │   ├── __init__.py
│   │   ├── system.py          # System controls (12 tools)
│   │   ├── applications.py    # Application control (6 tools)
│   │   ├── finder.py          # Finder operations (6 tools)
│   │   ├── calendar.py        # Calendar.app integration (3 tools)
│   │   ├── reminders.py       # Reminders.app integration (5 tools)
│   │   ├── notifications.py   # Notification Center (3 tools)
│   │   ├── clipboard.py       # Clipboard operations (3 tools)
│   │   └── scripts.py         # Script execution (4 tools)
│   └── models/
│       ├── __init__.py
│       └── schemas.py         # Pydantic models for type safety
├── tests/
│   ├── __init__.py
│   └── test_applescript.py    # Unit tests
├── main.py                    # Entry point
├── pyproject.toml             # Dependencies: mcp[cli], pydantic
├── uv.lock                    # Locked dependencies
└── README.md

Dependencies

  • mcp[cli]>=1.0.0 - FastMCP framework with CLI support

  • pydantic>=2.0.0 - Type-safe data validation

License

MIT License

Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

Acknowledgments

Available Tools

45 tools
choose_from_listB

Show a list selection dialog.

Args: items: List of items to choose from title: Dialog title prompt: Optional prompt message multiple: Allow multiple selections

Inputs: items (required), title, prompt, multiple. Returns: result

clear_clipboardA

Clear the clipboard contents.

Inputs: no named parameters. Returns: result

complete_reminderA

Mark a reminder as complete.

Args: title: Reminder title to complete list_name: Optional specific list to search in

Inputs: title (required), list_name. Returns: result

create_calendar_eventA

Create a new calendar event.

Args: title: Event title start_date: Start date/time (ISO format: YYYY-MM-DDTHH:MM:SS) end_date: End date/time (ISO format: YYYY-MM-DDTHH:MM:SS) calendar_name: Calendar to add event to (default: "Calendar") location: Optional event location notes: Optional event notes

Inputs: title (required), end_date (required), start_date (required), notes, +2 more. Returns: result

create_folderA

Create a new folder.

Args: path: Full path for the new folder

Inputs: path (required). Returns: result

create_reminderA

Create a new reminder.

Args: title: Reminder title list_name: Reminder list to add to (default: "Reminders") due_date: Optional due date (ISO format: YYYY-MM-DDTHH:MM:SS) notes: Optional notes

Inputs: title (required), notes, due_date, list_name. Returns: result

create_scheduled_taskA

Create a scheduled task using launchd.

Args: name: Unique name for the task command: Command to execute interval_seconds: Run every N seconds (min 60) hour: Hour to run (0-23) for calendar schedule minute: Minute to run (0-59) for calendar schedule run_at_load: Run immediately when loaded

Inputs: name (required), command (required), hour, minute, +2 more. Returns: result

empty_trashC

Empty the Trash.

Inputs: no named parameters. Returns: result

get_clipboardA

Get the current clipboard contents as text.

Inputs: no named parameters. Returns: result

get_frontmost_appA

Get information about the currently active (frontmost) application.

Inputs: no named parameters. Returns: result

get_overdue_remindersA

Get all overdue reminders.

Inputs: no named parameters. Returns: result

get_selected_filesA

Get the currently selected files in Finder.

Inputs: no named parameters. Returns: result

get_system_infoA

Get macOS system information including hostname, version, user, and uptime.

Inputs: no named parameters. Returns: result

get_volumeA

Get the current system volume level.

Inputs: no named parameters. Returns: result

get_wifi_networkA

Get the current WiFi network name.

Inputs: no named parameters. Returns: result

hide_appA

Hide an application's windows.

Args: app_name: Name of the application to hide

Inputs: app_name (required). Returns: result

is_app_runningC

Check if an application is currently running.

Args: app_name: Name of the application to check

Inputs: app_name (required). Returns: result

is_dark_modeA

Check if dark mode is currently enabled.

Inputs: no named parameters. Returns: result

launch_appA

Launch an application.

Args: app_name: Name of the application (e.g., 'Safari', 'Finder', 'Terminal') new_instance: If True, opens a new instance of the app

Inputs: app_name (required), new_instance. Returns: result

list_calendar_eventsC

List upcoming calendar events.

Args: days_ahead: Number of days to look ahead (default: 7) calendar_name: Optional specific calendar name

Inputs: days_ahead, calendar_name. Returns: result

list_calendarsA

List all available calendars.

Inputs: no named parameters. Returns: result

list_reminder_listsA

List all reminder lists.

Inputs: no named parameters. Returns: result

list_remindersB

List reminders.

Args: list_name: Optional specific reminder list include_completed: Include completed reminders

Inputs: list_name, include_completed. Returns: result

list_running_appsA

List all currently running applications.

Inputs: no named parameters. Returns: result

list_scheduled_tasksA

List all MCP-managed scheduled tasks.

Inputs: no named parameters. Returns: result

move_to_trashB

Move files or folders to the Trash.

Args: paths: List of paths to move to trash

Inputs: paths (required). Returns: result

open_fileC

Open a file with the default or specified application.

Args: path: Path to the file app_name: Optional application name to open with

Inputs: path (required), app_name. Returns: result

open_urlB

Open a URL in the default browser.

Args: url: URL to open

Inputs: url (required). Returns: result

quit_appA

Quit an application.

Args: app_name: Name of the application to quit force: If True, force quits without saving

Inputs: app_name (required), force. Returns: result

remove_scheduled_taskC

Remove a scheduled task.

Args: name: Name of the task to remove

Inputs: name (required). Returns: result

reveal_in_finderA

Reveal a file or folder in Finder.

Args: path: Path to the file or folder

Inputs: path (required). Returns: result

run_applescriptC

Execute arbitrary AppleScript code.

Args: script: AppleScript code to execute timeout: Maximum execution time in seconds (default: 30)

Inputs: script (required), timeout. Returns: result

run_shell_commandB

Execute a shell command (with safety checks).

Args: command: Shell command to execute timeout: Maximum execution time in seconds (default: 30) working_dir: Optional working directory

Inputs: command (required), timeout, working_dir. Returns: result

say_textA

Speak text using text-to-speech.

Args: text: Text to speak voice: Optional voice name (e.g., 'Alex', 'Samantha', 'Victoria') rate: Optional speaking rate in words per minute

Inputs: text (required), rate, voice. Returns: result

search_filesA

Search for files using Spotlight.

Args: query: Search query location: Optional folder path to search in kind: Optional file type filter ('pdf', 'image', 'document', 'audio', 'video')

Inputs: query (required), kind, location. Returns: result

send_alertA

Show an alert dialog and wait for user response.

Args: title: Alert title message: Alert message buttons: List of button names (max 3) default_button: Name of the default button

Inputs: title (required), message (required), buttons, default_button. Returns: result

send_notificationA

Send a macOS notification.

Args: title: Notification title message: Notification body text subtitle: Optional subtitle sound: Sound name ('default', 'Basso', 'Glass', 'Hero', 'Pop', etc.) or None for silent

Inputs: title (required), message (required), sound, subtitle. Returns: result

set_clipboardB

Copy text to the clipboard.

Args: text: Text to copy to clipboard

Inputs: text (required). Returns: result

set_dark_modeA

Set dark mode to a specific state.

Args: enabled: True for dark mode, False for light mode

Inputs: enabled (required). Returns: result

set_volumeA

Set the system volume level.

Args: level: Volume level from 0 (mute) to 100 (max)

Inputs: level (required). Returns: result

sleep_displayA

Put the display to sleep.

Inputs: no named parameters. Returns: result

take_screenshotA

Capture a screenshot.

Args: path: Optional save path (defaults to Desktop with timestamp) region: If True, allows selecting a region (interactive) to_clipboard: If True, saves to clipboard instead of file

Inputs: path, region, to_clipboard. Returns: result

toggle_dark_modeA

Toggle between dark mode and light mode.

Inputs: no named parameters. Returns: result

toggle_muteA

Toggle system audio mute on/off.

Inputs: no named parameters. Returns: result

toggle_wifiB

Enable or disable WiFi.

Args: enabled: True to enable WiFi, False to disable

Inputs: enabled (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 45 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes, and the descriptions help differentiate them. A few pairs like toggle_mute and set_volume, or set_dark_mode and toggle_dark_mode, have some functional overlap but remain distinguishable. Overall, an agent can reliably select the correct tool.

    Naming Consistency5/5

    Tool names consistently follow a verb_noun pattern in snake_case, such as get_volume, set_volume, toggle_mute, and create_calendar_event. Prefixes like get_, set_, toggle_, list_, create_, and is_ are used predictably across domains. This makes the API easy to navigate.

    Tool Count2/5

    With 45 tools, the server is excessively large for a single coherent MCP server. While the macOS automation scope is broad, many tools (e.g., calendar and reminder management) could be separated into focused servers. This volume overwhelms an agent's ability to efficiently select among them.

    Completeness4/5

    The server covers a wide range of macOS automation tasks including system controls, app management, file operations, calendar, reminders, and scripting. Minor gaps exist such as lack of file read/write operations or direct control of display brightness, but the core workflows are well-supported. Overall, the surface is fairly complete for its domain.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables interaction with macOS system features including file dialogs, clipboard management, Finder integration, and system notifications. It also provides tools for taking screenshots, processing images, managing PDFs, and interacting with the Apple Notes app.
      25
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables AI assistants to automate macOS through AppleScript and JXA by providing 44 tools for application management, window control, and UI interaction. It allows for comprehensive system control including screen capture, keyboard and mouse simulation, and system information retrieval.
      44
      15 npm
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      A macOS automation MCP server providing 40+ tools for controlling Messages, Contacts, Notes, Reminders, Calendar, Files, Clipboard, Windows, Safari, Chrome, screenshots, and system settings via natural language.
      91
      178
      Apache 2.0
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables Claude to automate macOS applications, manage files, control music, send messages, and more through AppleScript.
      29 npm
      1
      GPL 3.0