altic-mcp
The altic-mcp server provides macOS automation with 90+ tools across system, app, file, browser, and data management.
Messages & Contacts: Send/read iMessages, list chats, send file attachments, search/get/create/update contacts.
Notes & Reminders: Create, list, search, get, update, append, move, complete, reschedule, and delete notes/reminders; manage folders and reminder lists.
Calendar: Create, list, search, update, delete events, check availability, create recurring events, and list calendars.
Files & Finder: Find (Spotlight/filesystem), list, copy, move, rename, trash files/directories; get metadata, reveal in Finder, get Finder selection.
Clipboard: Read/write text, clear clipboard, manage file paths, save/set clipboard images.
Window & App Management: List/focus/move/resize/center/tile/minimize windows, hide/quit apps, open apps, get frontmost app.
Safari: Open/close tabs and windows, switch tabs, navigate, reload, go back/forward, execute JavaScript, get page info.
Chrome (CDP): Open/close/list automation sessions, navigate, click, type, wait for elements, extract data, capture screenshots.
Screen Capture: Capture a full screenshot of the active display and share with the model.
System Controls: Adjust screen brightness and volume, add/remove a visual screen glow indicator.
Configuration & Security: Get/set runtime config (timeouts, limits, allowed directories) without restarting; path security with symlink traversal prevention.
Observability: Automatic tool-call logging with rotation and recent call history.
Open sessions, navigate, click/type, extract data, screenshots via CDP.
Send and read iMessages, search contacts.
Control tabs, navigate, execute JavaScript.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@altic-mcp send an iMessage to Mom saying I'll be late"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Altic MCP
Features
90+ tools for macOS automation:
π± Messages & Contacts - Send/read iMessages, list chats, send file attachments, search/get/create/update contacts
π Notes & Reminders - Create, list, search, update, show, move, complete, and delete notes/reminders
π Calendar - Create, list, search, update, delete, check availability, and create recurring events
ποΈ Files & Finder - Find, inspect, copy, move, rename, reveal, and trash files safely; streaming paginated search sessions
π Clipboard - Read/write text, copy file paths for Finder paste, and save/set clipboard images
πͺ Window & Workspace - List/focus apps and windows, move/resize/center/tile windows, minimize windows, hide apps, and quit apps
π Safari - Control tabs, navigate, execute JavaScript
π Chrome (CDP) - Open sessions, navigate, click/type, extract data, screenshots
πΈ Screen Capture - Capture the active display and share image output with the model
π₯οΈ System - Open apps, adjust brightness/volume, visual effects
βοΈ Configuration - Get/set runtime config (timeouts, limits, allowed directories) without restarting
π Audit & Observability - Automatic tool-call logging with rotation and recent-call history
π Path Security - Optional allowed-directories allowlist with symlink traversal prevention
π Resources & Prompts - MCP resources for frontmost app, Finder selection, clipboard; prompts for calendar summaries, iMessage replies, note search
Related MCP server: macOS Automation MCP Server
Available Skills
This repo currently includes one shareable skill:
altic-studio(skills/altic-studio/)Runs local AppleScript automations via
osascriptthrough the Bash toolCovers Messages, Contacts, Notes, Reminders, Calendar, Safari, window management, system controls, screenshots, and Chrome CDP browser control
Main skill manifest:
skills/altic-studio/SKILL.md
Skill Setup (Any Agent)
Install altic-studio directly from this repo with the Skills CLI:
# Preview available skills in this repo
npx skills add altic-dev/altic-mcp --list
# Install skill with interactive mode
npx skills add altic-dev/altic-mcp
Restart your coding agent after installation.
Requirements
macOS 10.13+
UV package manager (auto-installed by the bash installer if missing)
Python note: altic-mcp requires Python 3.13+ internally, but
uvxmanages this automatically β you do not need to install Python yourself when using the uvx or bash installer options below.
Security & Runtime Configuration
Allowed Directories (Path Allowlist)
By default, altic-mcp has full filesystem access for file operations. To restrict file tools to specific directories, set the ALLOWED_DIRECTORIES environment variable (colon-separated) or use the set_config_value tool:
# Via environment variable
export ALLOWED_DIRECTORIES="/Users/you/Documents:/Users/you/Desktop"// Or via the set_config_value MCP tool
{"key": "allowed_directories", "value": ["/Users/you/Documents", "/Users/you/Desktop"]}All file paths are resolved with symlink traversal prevention β a symlink inside an allowed directory that points outside will be rejected.
Runtime Config
altic-mcp stores runtime configuration at ~/.config/altic-mcp/config.json. Use the get_config and set_config_value MCP tools to inspect and change settings without restarting:
Key | Default | Description |
| 60 | Timeout for AppleScript manager calls |
| 25 | Max results for find_files |
| 20000 | Max chars for clipboard text reads |
| false | Include hidden files in searches by default |
|
| Allowed path roots (empty = full FS) |
| false | Log tool calls to audit file when enabled |
| 50000 | Max entries to walk per search batch |
Audit Logging
When audit logging is enabled, every tool call is logged to ~/.cache/altic-mcp/audit.jsonl (rotated at 10 MB). Use the get_recent_tool_calls tool to retrieve recent call history with timing and success status.
How to Install
Install in Claude Desktop
altic-mcp offers multiple installation methods for Claude Desktop.
π Update & Uninstall Information: Options 1 and 2 have automatic updates. See Updating & Uninstalling below for details.
Option 1: Add to claude_desktop_config manually β Auto-Updates (Requires UV)
Add this entry to your Claude Desktop config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"altic-mcp": {
"command": "uvx",
"args": ["--refresh", "--from", "git+https://github.com/altic-dev/altic-mcp.git", "altic-mcp"]
}
}
}Restart Claude if running.
β
Auto-Updates: Yes β uvx --refresh re-fetches the latest version from GitHub each time Claude starts
π Manual Update: uv cache clean altic-mcp then restart Claude
ποΈ Uninstall: Remove the "altic-mcp" entry from your claude_desktop_config.json
Performance tip:
--refreshensures you always run the latest version but adds a few seconds to startup. Remove--refreshfor faster startup (update manually withuv cache clean altic-mcp).
Option 2: Using bash script installer β Auto-Updates (Installs UV if needed)
curl -fsSL https://raw.githubusercontent.com/altic-dev/altic-mcp/refs/heads/main/install.sh | bashThis script checks for UV (installs it if missing), backs up your existing Claude config, and adds the altic-mcp server entry automatically.
β
Auto-Updates: Yes β same uvx --refresh mechanism as Option 1
π Manual Update: Re-run the bash installer command above, or uv cache clean altic-mcp
ποΈ Uninstall: Remove the "altic-mcp" entry from your claude_desktop_config.json
Install in Other Clients
altic-mcp works with any MCP-compatible client. The standard JSON configuration is:
{
"mcpServers": {
"altic-mcp": {
"command": "uvx",
"args": ["--refresh", "--from", "git+https://github.com/altic-dev/altic-mcp.git", "altic-mcp"]
}
}
}Add this to your client's MCP configuration file at the locations below:
Cursor
Or add manually to ~/.cursor/mcp.json (global) or .cursor/mcp.json in your project folder (project-specific).
See Cursor MCP docs for more info.
Windsurf
Add to ~/.codeium/windsurf/mcp_config.json. See Windsurf MCP docs for more info.
VS Code / GitHub Copilot
Add to .vscode/mcp.json in your project or VS Code User Settings (JSON). Make sure MCP is enabled under Chat > MCP. Works in Agent mode.
See VS Code MCP docs for more info.
Cline
Configure through the Cline extension settings in VS Code. Open the Cline sidebar, click the MCP Servers icon, and add the JSON configuration above. See Cline MCP docs for more info.
Roo Code
Add to your Roo Code MCP configuration file. See Roo Code MCP docs for more info.
Claude Code
claude mcp add --scope user altic-mcp -- uvx --refresh --from git+https://github.com/altic-dev/altic-mcp.git altic-mcpRemove --scope user to install for the current project only. See Claude Code MCP docs for more info.
Trae
Use the "Add manually" feature and paste the JSON configuration above. See Trae MCP docs for more info.
Kiro
Navigate to Kiro > MCP Servers, click + Add, and paste the JSON configuration above. See Kiro MCP docs for more info.
Codex (OpenAI)
Codex uses TOML configuration. Run this command to add altic-mcp:
codex mcp add altic-mcp -- uvx --refresh --from git+https://github.com/altic-dev/altic-mcp.git altic-mcpOr manually add to ~/.codex/config.toml:
[mcp_servers.altic-mcp]
command = "uvx"
args = ["--refresh", "--from", "git+https://github.com/altic-dev/altic-mcp.git", "altic-mcp"]See Codex MCP docs for more info.
JetBrains (AI Assistant)
In JetBrains IDEs, go to Settings β Tools β AI Assistant β Model Context Protocol (MCP), click + Add, select As JSON, and paste the JSON configuration above. See JetBrains MCP docs for more info.
Gemini CLI
Add to ~/.gemini/settings.json:
{
"mcpServers": {
"altic-mcp": {
"command": "uvx",
"args": ["--refresh", "--from", "git+https://github.com/altic-dev/altic-mcp.git", "altic-mcp"]
}
}
}See Gemini CLI docs for more info.
OpenCode
Add to your opencode.json (project-level) or ~/.config/opencode/opencode.json (global):
{
"mcp": {
"altic-mcp": {
"type": "local",
"command": ["uvx", "--refresh", "--from", "git+https://github.com/altic-dev/altic-mcp.git", "altic-mcp"],
"enabled": true
}
}
}See OpenCode MCP docs for more info.
Updating & Uninstalling Altic MCP
Automatic Updates (Options 1 & 2)
Both the manual config (Option 1) and bash installer (Option 2) use uvx --refresh, which automatically re-fetches the latest version from GitHub whenever you restart Claude. No manual intervention needed.
Manual Updates
If you removed --refresh for faster startup, force an update with:
uv cache clean altic-mcpThen restart Claude Desktop.
Uninstalling Altic MCP
Manual Uninstallation
Locate your Claude Desktop config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Edit the config file:
Open the file in a text editor
Find and remove the
"altic-mcp"entry from the"mcpServers"sectionSave the file
Example β remove this section:
"altic-mcp": {
"command": "uvx",
"args": ["--refresh", "--from", "git+https://github.com/altic-dev/altic-mcp.git", "altic-mcp"]
}Close and restart Claude Desktop to complete the removal.
Troubleshooting
If Claude won't start after editing the config:
Check that your JSON is valid (no trailing commas, matched braces)
Restore from the backup created by the bash installer (
.bak.*file next to your config)Re-run the bash installer to regenerate a valid config
Local Development
For contributors who want to run altic-mcp from a local checkout:
# Install UV if needed
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone and setup
git clone https://github.com/altic-dev/altic-mcp.git
cd altic-mcp
uv sync
# Run the server directly
uv run server.py
# Or build and run via the installed entry point
uv build
uvx --from dist/altic_mcp-0.1.0-py3-none-any.whl altic-mcpβ Auto-Updates: No β requires manual git pull to update
π Manual Update: cd altic-mcp && git pull && uv sync
ποΈ Uninstall: Remove the cloned directory and the MCP server entry from your client config
Permissions Required
System Preferences β Privacy & Security:
β Contacts - For search_contacts
β Calendars - For calendar events
β Reminders - For creating reminders
β Automation - Allow Claude to control apps (Messages, Notes, Safari)
β Finder Automation - For Finder selection, reveal, and Trash file tools
β Accessibility - Required for screen glow, system controls, and window management tools such as focus_window, move_window, resize_window, center_window, tile_windows, minimize, hide_app, and quit_app
β Screen Recording - Required for screenshot capture tools and improves window title/id discovery for list_windows on recent macOS versions
Clipboard text operations normally do not require extra permissions. Clipboard file and image operations use macOS pasteboard APIs and may prompt for security approval depending on the host app and OS settings.
Safari Settings:
Safari β Develop β Allow JavaScript from Apple Events β (Required for Safari tools)
Note: If "Develop" menu is not visible, enable it in Safari β Settings β Advanced β Show Develop menu
Chrome Setup (for CDP tools):
Install Google Chrome
The MCP server can auto-start Chrome with
--remote-debugging-portwhen opening a CDP sessionIf auto-start fails, launch manually:
open -a "Google Chrome" --args --remote-debugging-port=9222macOS will prompt for permissions when first used. Grant them to enable full functionality.
Available Tools
91 toolsadd_screen_glowA
Add a visual feedback indicator (orange glow around screen edges) to show that automated actions are in progress.
IMPORTANT: Call this FIRST before performing any automated actions to provide visual feedback to the user that the tool is actively working. This serves as a clear indicator that operations are being executed.
Returns: Success or error message
Inputs: no named parameters. Returns: result
append_to_noteA
Append plain text to a note by id or title.
Args: identifier: Note id or title text body: Plain text to append
Returns: Structured JSON with the updated note or an error message.
Inputs: body (required), identifier (required). Returns: result
capture_active_screenA
Capture a full screenshot of the display containing the frontmost app and share the image directly with the model.
Args: output_path: Optional file path for output PNG
Returns: A text status plus image content, or an error message
Inputs: output_path. Returns: result
center_windowA
Center a macOS window on its current display or a selected display.
Args: app_name: Optional app name, bundle id, or process name window_id: Optional CoreGraphics window id window_index: Optional 1-based index among the app's windows display_index: Optional 1-based display index width: Optional width to apply before centering height: Optional height to apply before centering
Returns: JSON string with final window metadata, or an error message.
Inputs: width, height, app_name, window_id, +2 more. Returns: result
check_calendar_availabilityA
Check whether a Calendar time slot conflicts with existing events.
Args: start_datetime: Slot start in "YYYY-MM-DD HH:MM" format duration_minutes: Slot duration in minutes calendar_name: Optional calendar name
Returns: Structured JSON with availability and conflicts or an error message.
Inputs: start_datetime (required), duration_minutes (required), calendar_name. Returns: result
chrome_clickB
Click an element in an active Chrome CDP session using a CSS selector.
Args: session_id: Session returned by chrome_open_session selector: CSS selector for target element
Returns: Success or error message
Inputs: selector (required), session_id (required). Returns: result
chrome_close_sessionA
Close a Chrome automation session.
Args: session_id: Session returned by chrome_open_session
Returns: Success or error message
Inputs: session_id (required). Returns: result
chrome_extractA
Extract data from a page by selector or by JavaScript expression.
Args: session_id: Session returned by chrome_open_session selector: CSS selector to query attribute: Attribute name to read from selected element javascript_expression: JavaScript expression to evaluate directly
Returns: Extracted value as JSON or error message
Inputs: session_id (required), selector, attribute, javascript_expression. Returns: result
chrome_list_sessionsA
List active Chrome automation sessions.
Returns: A list of active session IDs
Inputs: no named parameters. Returns: result
chrome_open_sessionA
Open a Chrome automation session for browser control.
Args: start_url: Initial page URL to open debug_port: Chrome remote debugging port for CDP sessions headless: Launch Chrome headless if debugger needs to be started
Returns: Session identifier and connection details or error message
Inputs: headless, start_url, debug_port. Returns: result
chrome_screenshotB
Capture a screenshot of the active page in a Chrome CDP session.
Args: session_id: Session returned by chrome_open_session output_path: Optional file path for output PNG
Returns: Saved path or error message
Inputs: session_id (required), output_path. Returns: result
chrome_typeA
Type text into an input element in an active Chrome CDP session.
Args: session_id: Session returned by chrome_open_session selector: CSS selector for input element text: Text to type clear_first: Clear existing value before typing
Returns: Success or error message
Inputs: text (required), selector (required), session_id (required), clear_first. Returns: result
chrome_wait_forA
Wait for a CSS selector to exist and be visible in the page.
Args: session_id: Session returned by chrome_open_session selector: CSS selector to wait for timeout_ms: Max wait time in milliseconds poll_ms: Poll interval in milliseconds
Returns: Success or timeout/error message
Inputs: selector (required), session_id (required), poll_ms, timeout_ms. Returns: result
clear_clipboardA
Clear clipboard contents.
Returns: JSON string with operation metadata, or an error message
Inputs: no named parameters. Returns: result
close_safari_tabA
Close a Safari tab. Use -1 for current tab or specify tab index (1-based)
Args: tab_index: Tab index to close (-1 for current tab, or 1-based index)
Returns: Success or error message
Inputs: tab_index. Returns: result
close_safari_windowB
Close the current Safari window
Returns: Success or error message
Inputs: no named parameters. Returns: result
complete_reminderA
Mark an exact or uniquely matching reminder as complete.
Args: identifier: Reminder id or name/title text list_name: Optional Reminders list name
Returns: Structured JSON with the updated reminder or an error message.
Inputs: identifier (required), list_name. Returns: result
copy_directoryA
Copy a directory tree. Existing destinations fail unless overwrite is true.
Args: source: Existing source directory path destination: Destination directory path overwrite: Allow merging into an existing destination dry_run: Return the planned action without copying
Returns: JSON string with operation details or an error message
Inputs: source (required), destination (required), dry_run, overwrite. Returns: result
copy_fileA
Copy a file with metadata. Directories require copy_directory.
Args: source: Existing source file path destination: Destination file path overwrite: Allow replacing an existing destination dry_run: Return the planned action without copying
Returns: JSON string with operation details or an error message
Inputs: source (required), destination (required), dry_run, overwrite. Returns: result
create_calendar_eventB
Create a calendar event in the macOS Calendar app
Args: title: The event title start_datetime: Start date and time in format 'YYYY-MM-DD HH:MM' (e.g., '2025-10-30 14:30') duration_minutes: Duration of the event in minutes calendar_name: Optional calendar name (uses default calendar if not specified)
Returns: Success or error message
Inputs: title (required), start_datetime (required), duration_minutes (required), calendar_name. Returns: result
create_contactA
Create a Contacts record with optional organization, phone, email, and note.
Args: first_name: Contact first name last_name: Contact last name organization: Optional organization/company phone: Optional phone number to add with mobile label email: Optional email to add with home label note: Optional contact note
Returns: Structured JSON with the created contact.
Inputs: last_name (required), first_name (required), note, email, +2 more. Returns: result
create_noteB
Create a note
Args: name: Title of the note body: Content of the note folder: Use this if the note has to be created in a specific folder. Uses default folder if none is specified
Returns: A success or error message
Inputs: body (required), name (required), folder. Returns: result
create_recurring_eventA
Create a recurring Calendar event.
Args: title: Event title start_datetime: Start date and time in "YYYY-MM-DD HH:MM" format duration_minutes: Duration in minutes frequency: daily, weekly, monthly, or yearly interval: Recurrence interval count: Optional occurrence count until_date: Optional recurrence end date in "YYYY-MM-DD" format calendar_name: Optional target calendar name location: Optional event location notes_text: Optional event notes
Returns: Structured JSON with the created recurring event or an error message.
Inputs: title (required), start_datetime (required), duration_minutes (required), count, +6 more. Returns: result
decrease_brightnessA
Decrease screen brightness
Args: amount: Amount to decrease brightness by (0.0 to 1.0 scale). Default is 0.0625 (6.25%)
Returns: Success or error message
Inputs: amount. Returns: result
delete_calendar_eventA
Delete an exact or uniquely matching Calendar event. Defaults to dry-run.
Args: identifier: Event id or title text start_date: Optional date-range start in "YYYY-MM-DD" format end_date: Optional date-range end in "YYYY-MM-DD" format calendar_name: Optional calendar name dry_run: Return matching event without deleting when true
Returns: Structured JSON with deletion details or an error message.
Inputs: identifier (required), dry_run, end_date, start_date, +1 more. Returns: result
delete_noteA
Delete a note by id or title. Defaults to dry-run.
Args: identifier: Note id or title text dry_run: Return matching note without deleting when true
Returns: Structured JSON with deletion details or an error message.
Inputs: identifier (required), dry_run. Returns: result
delete_reminderA
Delete an exact or uniquely matching reminder. Defaults to dry-run.
Args: identifier: Reminder id or name/title text list_name: Optional Reminders list name dry_run: Return matching reminder without deleting when true
Returns: Structured JSON with deletion details or an error message.
Inputs: identifier (required), dry_run, list_name. Returns: result
find_filesA
Find files by name using Spotlight first, with Python filesystem fallback.
Args: query: File name or Spotlight query text root: Optional directory to search within max_results: Maximum number of results to return include_hidden: Include hidden files and folders kind: Search backend: auto, name, or spotlight
Returns: JSON string with file metadata results or an error message
Inputs: query (required), kind, root, max_results, +1 more. Returns: result
focus_windowA
Focus a macOS window by window id, app name, or frontmost fallback.
Args: app_name: Optional app name, bundle id, or process name window_id: Optional CoreGraphics window id window_index: Optional 1-based index among the app's windows
Returns: JSON string with focused window metadata, or an error message.
Inputs: app_name, window_id, window_index. Returns: result
get_clipboard_filesA
Return file URLs currently available on the macOS clipboard.
Returns: JSON string with copied file paths, or an error message
Inputs: no named parameters. Returns: result
get_clipboard_textA
Read plain text from the macOS clipboard.
Args: max_chars: Maximum number of characters to return
Returns: JSON string with clipboard text and truncation metadata, or an error message
Inputs: max_chars. Returns: result
get_contactA
Get a unique Contacts record by id or name match.
Args: identifier: Contact id or name text
Returns: Structured JSON with contact fields, phone numbers, and emails.
Inputs: identifier (required). Returns: result
get_file_infoA
Get metadata for a file, directory, or missing path.
Args: path: File or directory path
Returns: JSON string with path metadata or an error message
Inputs: path (required). Returns: result
get_finder_selectionA
Get the currently selected Finder items as paths and metadata.
Returns: JSON string with selected Finder items or an error message
Inputs: no named parameters. Returns: result
get_frontmost_appA
Get the currently frontmost macOS application.
Returns: JSON string with app name, bundle id, pid, and active state.
Inputs: no named parameters. Returns: result
get_noteA
Get a note by id or title.
Args: identifier: Note id or title text
Returns: Structured JSON with note content or an error message.
Inputs: identifier (required). Returns: result
get_safari_page_infoA
Get information about the current Safari page including URL, title, text content, and HTML source
Returns: Page information including URL, title, text, and source or error message
Inputs: no named parameters. Returns: result
get_safari_tabsA
Get a list of all open Safari tabs with their URLs and titles
Returns: List of tabs with URLs and titles or error message
Inputs: no named parameters. Returns: result
hide_appA
Hide a running macOS app.
Args: app_name: App name, bundle id, or process name
Returns: JSON string with hidden app metadata, or an error message.
Inputs: app_name (required). Returns: result
increase_brightnessA
Increase screen brightness
Args: amount: Amount to increase brightness by (0.0 to 1.0 scale). Default is 0.0625 (6.25%)
Returns: Success or error message
Inputs: amount. Returns: result
list_calendar_eventsA
List Calendar events across a date range.
Args: start_date: Start date in "YYYY-MM-DD" format end_date: End date in "YYYY-MM-DD" format calendar_name: Optional calendar name
Returns: Structured JSON with events or an error message.
Inputs: end_date (required), start_date (required), calendar_name. Returns: result
list_calendar_events_for_dayA
List all calendar events for a specific day
Args: date: Date in format 'YYYY-MM-DD' (e.g., '2025-10-30')
Returns: List of events for the specified day or error message
Inputs: date (required). Returns: result
list_calendarsB
List Apple Calendar calendars.
Returns: Structured JSON with calendar names or an error message.
Inputs: no named parameters. Returns: result
list_chatsA
List Messages chats available to the macOS Messages app.
Args: limit: Maximum number of chats to return
Returns: Structured JSON with chat ids, names, and account metadata.
Inputs: limit. Returns: result
list_directoryA
List immediate children of a directory with metadata.
Args: path: Directory path to list include_hidden: Include hidden files and folders max_results: Maximum number of children to return
Returns: JSON string with directory entries or an error message
Inputs: path (required), max_results, include_hidden. Returns: result
list_note_foldersA
List Apple Notes folders.
Returns: Structured JSON with folder names or an error message.
Inputs: no named parameters. Returns: result
list_notesA
List Apple Notes, optionally filtered by folder.
Args: folder: Optional Notes folder name max_results: Maximum notes to return
Returns: Structured JSON with note metadata or an error message.
Inputs: folder, max_results. Returns: result
list_reminder_listsB
List Apple Reminders lists.
Returns: Structured JSON with list names or an error message.
Inputs: no named parameters. Returns: result
list_remindersA
List reminders, optionally filtered by list and completion state.
Args: list_name: Optional Reminders list name include_completed: Include completed reminders
Returns: Structured JSON with reminder matches or an error message.
Inputs: list_name, include_completed. Returns: result
list_windowsA
List manageable macOS windows.
Args: app_name: Optional app name, bundle id, or process name filter include_minimized: Include minimized windows when available
Returns: JSON string with window ids, app metadata, titles, frames, and display indexes.
Inputs: app_name, include_minimized. Returns: result
minimizeB
Minimize a macOS window.
Args: app_name: Optional app name, bundle id, or process name window_id: Optional CoreGraphics window id window_index: Optional 1-based index among the app's windows
Returns: JSON string with minimized window metadata, or an error message.
Inputs: app_name, window_id, window_index. Returns: result
move_fileA
Move a file or directory. Existing destinations fail unless overwrite is true.
Args: source: Existing source path destination: Destination path overwrite: Allow replacing an existing destination dry_run: Return the planned action without moving
Returns: JSON string with operation details or an error message
Inputs: source (required), destination (required), dry_run, overwrite. Returns: result
move_noteB
Move a note by id or title to an existing folder.
Args: identifier: Note id or title text folder: Destination folder name
Returns: Structured JSON with moved note metadata or an error message.
Inputs: folder (required), identifier (required). Returns: result
move_windowA
Move a macOS window to a display-aware top-left position.
Args: x: Target top-left x coordinate y: Target top-left y coordinate app_name: Optional app name, bundle id, or process name window_id: Optional CoreGraphics window id window_index: Optional 1-based index among the app's windows display_index: Optional 1-based display index for clamping placement
Returns: JSON string with final window metadata, or an error message.
Inputs: x (required), y (required), app_name, window_id, +2 more. Returns: result
open_appA
Open any mac application by specifying its name. Use this tool if you encounter any error or issue mentioning that the app is not open
Args: name: Name of the mac app. e.g. "Mail", "Contacts", "Messages" etc.
Returns: A success or failure message
Inputs: name (required). Returns: result
open_safari_tabB
Open a new tab in Safari with optional URL
Args: url: Optional URL to open in the new tab
Returns: Success or error message
Inputs: url. Returns: result
open_safari_windowA
Open a new Safari window with optional URL
Args: url: Optional URL to open in the new window
Returns: Success or error message
Inputs: url. Returns: result
quit_appA
Quit a running macOS app.
Args: app_name: App name, bundle id, or process name
Returns: JSON string with quit app metadata, or an error message.
Inputs: app_name (required). Returns: result
read_recent_messagesA
Read the recent X messages from the iMessage app between the user and the person with the phone number. X is defined based on the value of recent_message_count
Args: phone_number: The phone number of the person you want to retrieve the chat from recent_message_count: The recent messages to retrieve, can be a maximum of 200
Returns: A list of recent messages in the chat
Inputs: phone_number (required), recent_message_count. Returns: result
reload_safari_pageA
Reload the current Safari page
Returns: Success or error message
Inputs: no named parameters. Returns: result
remove_screen_glowA
Remove the visual feedback indicator (screen glow) when automated actions are complete.
IMPORTANT: Call this when all automated actions are complete to stop the visual feedback indicator and signal to the user that operations have finished.
Returns: Success or error message
Inputs: no named parameters. Returns: result
rename_fileA
Rename a file or directory within its current parent directory.
Args: path: Existing file or directory path new_name: New file name only, not a path overwrite: Allow replacing an existing destination dry_run: Return the planned action without renaming
Returns: JSON string with operation details or an error message
Inputs: path (required), new_name (required), dry_run, overwrite. Returns: result
reschedule_reminderB
Reschedule an exact or uniquely matching reminder.
Args: identifier: Reminder id or name/title text datetime: New due date/time in "YYYY-MM-DD HH:MM" format list_name: Optional Reminders list name
Returns: Structured JSON with the updated reminder or an error message.
Inputs: datetime (required), identifier (required), list_name. Returns: result
resize_windowA
Resize a macOS window and clamp it to the selected or current display.
Args: width: Target width in points height: Target height in points app_name: Optional app name, bundle id, or process name window_id: Optional CoreGraphics window id window_index: Optional 1-based index among the app's windows display_index: Optional 1-based display index for clamping placement
Returns: JSON string with final window metadata, or an error message.
Inputs: width (required), height (required), app_name, window_id, +2 more. Returns: result
reveal_in_finderA
Reveal a file or directory in Finder.
Args: path: Existing file or directory path
Returns: JSON string with operation details or an error message
Inputs: path (required). Returns: result
run_safari_javascriptC
Execute JavaScript code in the current Safari tab and return the result
Args: javascript_code: JavaScript code to execute
Returns: JavaScript execution result or error message
Inputs: javascript_code (required). Returns: result
safari_go_backA
Navigate back in Safari history
Returns: Success or error message
Inputs: no named parameters. Returns: result
safari_go_forwardA
Navigate forward in Safari history
Returns: Success or error message
Inputs: no named parameters. Returns: result
save_clipboard_imageA
Save an image from the macOS clipboard to a PNG file and share it with the model.
Args: output_path: Optional output path for the PNG
Returns: A text status plus image content, or an error message
Inputs: output_path. Returns: result
search_calendar_eventsA
Search Calendar events by title, location, or notes.
Args: query: Search text start_date: Optional start date in "YYYY-MM-DD" format end_date: Optional end date in "YYYY-MM-DD" format calendar_name: Optional calendar name
Returns: Structured JSON with matching events or an error message.
Inputs: query (required), end_date, start_date, calendar_name. Returns: result
search_contactsA
Search for a phone number from contacts by name. Returns multiple options if more than one contact is found or more than one number is found. Ask clarifying questions on which number if any following actions are required
Args: name: The name of contact to search for ctx: FastMCP context for logging
Returns: A list of matching contacts
Inputs: name (required). Returns: result
search_notesB
Search Apple notes based on a query
Args: query: The query string max_results: The maximum number of results returned from the tool, defaults to 10
Returns: A list of notes based on search
Inputs: query (required), max_results. Returns: result
search_remindersB
Search reminders by name.
Args: query: Text to match in reminder names list_name: Optional Reminders list name include_completed: Include completed reminders
Returns: Structured JSON with reminder matches or an error message.
Inputs: query (required), list_name, include_completed. Returns: result
send_file_messageA
Send a file attachment with Messages to a handle or chat id.
Args: recipient: Phone/email handle, or chat id when recipient_type is "chat" path: Existing local file path to send message: Optional text message to send before the file recipient_type: "handle" or "chat"
Returns: Structured JSON with send metadata or an error message.
Inputs: path (required), recipient (required), message, recipient_type. Returns: result
send_imessageB
Send an imessage to someone in your contacts
Args: phone_number: The phone number of the recipient message: The message text to send
Returns: Success or error message
Inputs: message (required), phone_number (required). Returns: result
set_clipboard_filesB
Put one or more filesystem paths on the macOS clipboard for Finder paste.
Args: paths: Existing file or directory paths to place on the clipboard
Returns: JSON string with operation metadata, or an error message
Inputs: paths (required). Returns: result
set_clipboard_imageA
Put an image file on the macOS clipboard.
Args: path: Existing image file path
Returns: JSON string with operation metadata, or an error message
Inputs: path (required). Returns: result
set_clipboard_textA
Write plain text to the macOS clipboard.
Args: text: Text to place on the clipboard
Returns: JSON string with operation metadata, or an error message
Inputs: text (required). Returns: result
set_reminderA
Set a reminder
Args: name: The reminder text datetime: The time to set the reminder for, must in the following format "YYYY-MM-DD HH:MM" list_name: Reminder list, e.g. Work, Personal etc. Defaults to "Reminders"
Returns: A success or error message
Inputs: name (required), datetime (required), list_name. Returns: result
show_reminderA
Reveal an exact or uniquely matching reminder in the Reminders app.
Args: identifier: Reminder id or name/title text list_name: Optional Reminders list name
Returns: Structured JSON with the shown reminder or an error message.
Inputs: identifier (required), list_name. Returns: result
switch_safari_tabB
Switch to a specific Safari tab by index (1-based)
Args: tab_index: Tab index to switch to (must be greater than 0)
Returns: Success or error message
Inputs: tab_index (required). Returns: result
tile_windowsA
Tile multiple macOS windows on a display.
Args: layout: Tile layout: columns, rows, or grid app_names: Optional app names to tile in order; defaults to visible windows display_index: Optional 1-based display index padding: Gap around and between windows
Returns: JSON string with final window metadata for tiled windows, or an error message.
Inputs: layout, padding, app_names, display_index. Returns: result
trash_fileA
Move a file or directory to the macOS Trash. Permanent delete is not supported.
Args: path: Existing file or directory path dry_run: Return the planned action without moving to Trash
Returns: JSON string with operation details or an error message
Inputs: path (required), dry_run. Returns: result
turn_down_volumeA
Turn down system volume
Args: amount: Amount to decrease volume by (0-100 scale). Default is 6.25 (6.25%)
Returns: Success or error message
Inputs: amount. Returns: result
turn_up_volumeA
Turn up system volume
Args: amount: Amount to increase volume by (0-100 scale). Default is 6.25 (6.25%)
Returns: Success or error message
Inputs: amount. Returns: result
update_calendar_eventA
Update an exact or uniquely matching Calendar event.
Args: identifier: Event id or title text title: Optional replacement title start_datetime: Optional replacement start in "YYYY-MM-DD HH:MM" format duration_minutes: Optional replacement duration calendar_name: Optional calendar name for matching location: Optional replacement location notes_text: Optional replacement notes
Returns: Structured JSON with updated event metadata or an error message.
Inputs: identifier (required), title, location, notes_text, +3 more. Returns: result
update_contactA
Update a unique Contacts record by id or name match.
Args: identifier: Contact id or name text first_name: Optional replacement first name last_name: Optional replacement last name organization: Optional replacement organization/company phone: Optional phone number to add email: Optional email address to add note: Optional replacement note
Returns: Structured JSON with the updated contact.
Inputs: identifier (required), note, email, phone, +3 more. Returns: result
update_noteA
Replace a note body by id or title.
Args: identifier: Note id or title text body: Replacement plain text/HTML body
Returns: Structured JSON with the updated note or an error message.
Inputs: body (required), identifier (required). Returns: result
update_reminderA
Update an exact or uniquely matching reminder.
Args: identifier: Reminder id or name/title text list_name: Optional Reminders list name name: Optional replacement reminder name body: Optional replacement reminder notes datetime: Optional due date/time in "YYYY-MM-DD HH:MM" format completed: Optional completion state priority: Optional priority from 0 to 9 flagged: Optional flagged state
Returns: Structured JSON with the updated reminder or an error message.
Inputs: identifier (required), body, name, flagged, +4 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogβ¦
TDQS
Scored across 91 tools
Most tools have clearly distinct purposes, with only minor overlap (e.g., list_calendar_events vs list_calendar_events_for_day, update_reminder vs reschedule_reminder). The large number of window management tools are well-differentiated by action verb.
The majority follow a consistent verb_noun pattern (create_note, delete_reminder, turn_up_volume). Minor deviations like append_to_note and reveal_in_finder break the pattern slightly, but overall naming is predictable.
91 tools is excessive for most domains. While the server covers many macOS automation areas, the number far exceeds the 3β15 recommended range, making the surface overwhelming and hard to navigate.
Covers CRUD and common operations for Calendar, Notes, Reminders, Contacts, Messages, files, windows, Safari, and Chrome. Missing features like contact list retrieval, note folder creation, and volume mute are minor gaps in an otherwise comprehensive set.
Maintenance
Related MCP Connectors
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
EXZA Remote β AI Computer Commander Your computer. Your control. Securely connect your own macOS, Windows or Linux computer to compatible AI clients, including ChatGPT and Claude. EXZA Remote provides 59 MCP tools for authorized file management, terminal operations, system monitoring, desktop automation and email workflows. GETTING STARTED 1. Create an EXZA Remote account. 2. Install the official computer connection client. 3. Pair your device using a temporary six-digit PIN. 4. Approve the connection on your computer. 5. Connect your preferred MCP client using EXZA OAuth. MCP ENDPOINT https://remote.exza.de/mcp TRANSPORT Streamable HTTP with OAuth 2.0 KEY FEATURES β’ 59 MCP tool interfaces β’ Secure computer and file access β’ Terminal commands and background jobs β’ File search, reading and editing β’ System monitoring and desktop automation β’ macOS, Windows and Linux support β’ Owner-controlled permissions and approvals COMPLETE INSTALLATION & DOCUMENTATION Detailed setup instructions, terminal installation commands, all 59 tools, troubleshooting and security information: https://github.com/exzade/EXZA-Remote/blob/main/docs/GLAMA_OVERVIEW.md Official website: https://remote.exza.de EXZA Remote is an independent, OAuth-protected service. Computer access requires individual account authorization and device-owner approval.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA production-grade macOS MCP server exposing 33 tools for full desktop automation, including mouse, keyboard, screenshot, clipboard, and window control.1MIT
- FlicenseBqualityDmaintenanceEnables macOS automation through 45 AppleScript-powered tools for system control, app management, calendar, reminders, notifications, clipboard, and task scheduling.45-
- AlicenseNot gradedqualityBmaintenanceA native Swift MCP server for full macOS automation, providing 63 tools for controlling windows, browsers, clipboard, screen capture, OCR, input simulation, and more.18MIT
- FlicenseNot gradedqualityCmaintenanceA minimal macOS GUI-automation MCP server providing tools to see app state, perform actions, manage apps, send notifications, and run AppleScripts with security boundaries.-