applescript-mcp

MIT License
138
  • Apple

Integrations

  • Allows interaction with macOS through AppleScript, including calendar management, clipboard operations, Finder integration, system notifications, system controls, and iTerm terminal integration

  • Required as a prerequisite for running the MCP server

  • Planned feature to allow opening pages in Safari, saving page content, and getting selected page/tab

applescript-mcp MCP Server

A Model Context Protocol server that enables LLM applications to interact with macOS through AppleScript. This server provides a standardized interface for AI applications to control system functions, manage files, handle notifications, and more.

Features

  • 🗓️ Calendar management (events, reminders)
  • 📋 Clipboard operations
  • 🔍 Finder integration
  • 🔔 System notifications
  • ⚙️ System controls (volume, dark mode, apps)
  • 📟 iTerm terminal integration
  • 📬 Mail (create new email, list emails, get email)
  • 🔄 Shortcuts automation
  • 💬 Messages (list chats, get messages, search messages, send a message)
  • 🗒️ Notes (create formatted notes, list notes, search notes)
  • 📄 Pages (create documents)

Planned Features

  • 🧭 Safari (open in Safari, save page content, get selected page/tab)
  • ✅ Reminders (create, get)

Prerequisites

  • macOS 10.15 or later
  • Node.js 18 or later

Available Categories

Calendar

CommandDescriptionParameters
addCreate calendar eventtitle, startDate, endDate, calendar (optional)
listList today's eventsNone
Examples
// Create a new calendar event Create a calendar event titled "Team Meeting" starting tomorrow at 2pm for 1 hour // List today's events What events do I have scheduled for today?

Clipboard

CommandDescriptionParameters
set_clipboardCopy to clipboardcontent
get_clipboardGet clipboard contentsNone
clear_clipboardClear clipboardNone
Examples
// Copy text to clipboard Copy "Remember to buy groceries" to my clipboard // Get clipboard contents What's currently in my clipboard? // Clear clipboard Clear my clipboard

Finder

CommandDescriptionParameters
get_selected_filesGet selected filesNone
search_filesSearch for filesquery, location (optional)
quick_lookPreview filepath
Examples
// Get selected files in Finder What files do I currently have selected in Finder? // Search for files Find all PDF files in my Documents folder // Preview a file Show me a preview of ~/Documents/report.pdf

Notifications

Note: Sending notification requires that you enable notifications in System Settings > Notifications > Script Editor.

CommandDescriptionParameters
send_notificationShow notificationtitle, message, sound (optional)
toggle_do_not_disturbToggle DND modeNone
Examples
// Send a notification Send me a notification with the title "Reminder" and message "Time to take a break" // Toggle Do Not Disturb Turn on Do Not Disturb mode

System

CommandDescriptionParameters
volumeSet system volumelevel (0-100)
get_frontmost_appGet active appNone
launch_appOpen applicationname
quit_appClose applicationname, force (optional)
toggle_dark_modeToggle dark modeNone
Examples
// Set system volume Set my Mac's volume to 50% // Get active application What app am I currently using? // Launch an application Open Safari // Quit an application Close Spotify // Toggle dark mode Switch to dark mode

iTerm

CommandDescriptionParameters
paste_clipboardPaste to iTermNone
runExecute commandcommand, newWindow (optional)
Examples
// Paste clipboard to iTerm Paste my clipboard contents into iTerm // Run a command in iTerm Run "ls -la" in iTerm // Run a command in a new iTerm window Run "top" in a new iTerm window

Shortcuts

CommandDescriptionParameters
run_shortcutRun a shortcutname, input (optional)
list_shortcutsList all available shortcutslimit (optional)
Examples
// List available shortcuts List all my available shortcuts // List with limit Show me my top 5 shortcuts // Run a shortcut Run my "Daily Note in Bear" shortcut // Run a shortcut with input Run my "Add to-do" shortcut with input "Buy groceries"

Mail

CommandDescriptionParameters
create_emailCreate a new email in Mail.apprecipient, subject, body
list_emailsList emails from a mailboxmailbox (optional), count (optional), unreadOnly (optional)
get_emailGet a specific email by searchsubject (optional), sender (optional), dateReceived (optional), mailbox (optional), account (optional), unreadOnly (optional), includeBody (optional)
Examples
// Create a new email Compose an email to john@example.com with subject "Meeting Tomorrow" and body "Hi John, Can we meet tomorrow at 2pm?" // List emails Show me my 10 most recent unread emails // Get a specific email Find the email from sarah@example.com about "Project Update"

Messages

CommandDescriptionParameters
list_chatsList available iMessage and SMS chatsincludeParticipantDetails (optional, default: false)
get_messagesGet messages from the Messages applimit (optional, default: 100)
search_messagesSearch for messages containing specific textsearchText, sender (optional), chatId (optional), limit (optional, default: 50), daysBack (optional, default: 30)
compose_messageOpen Messages app with pre-filled message or auto-sendrecipient (required), body (optional), auto (optional, default: false)
Examples
// List available chats Show me my recent message conversations // Get recent messages Show me my last 20 messages // Search messages Find messages containing "dinner plans" from John in the last week // Compose a message Send a message to 555-123-4567 saying "I'll be there in 10 minutes"

Notes

CommandDescriptionParameters
createCreate a note with markdown-like formattingtitle, content, format (optional with formatting options)
createRawHtmlCreate a note with direct HTML contenttitle, html
listList notes, optionally from a specific folderfolder (optional)
getGet a specific note by titletitle, folder (optional)
searchSearch for notes containing specific textquery, folder (optional), limit (optional, default: 5), includeBody (optional, default: true)
Examples
// Create a new note with markdown formatting Create a note titled "Meeting Minutes" with content "# Discussion Points\n- Project timeline\n- Budget review\n- Next steps" and format headings and lists // Create a note with HTML Create a note titled "Formatted Report" with HTML content "<h1>Quarterly Report</h1><p>Sales increased by <strong>15%</strong></p>" // List notes Show me all my notes in the "Work" folder // Get a specific note Show me my note titled "Shopping List" // Search notes Find notes containing "recipe" in my "Cooking" folder

Pages

CommandDescriptionParameters
create_documentCreate a new Pages document with plain textcontent
Examples
// Create a new Pages document Create a Pages document with the content "Project Proposal\n\nThis document outlines the scope and timeline for the upcoming project."

Architecture

The applescript-mcp server is built using TypeScript and follows a modular architecture:

Core Components

  1. AppleScriptFramework (framework.ts): The main server class that:
    • Manages MCP protocol communication
    • Handles tool registration and execution
    • Provides logging functionality
    • Executes AppleScript commands
  2. Categories (src/categories/*.ts): Modular script collections organized by functionality:
    • Each category contains related scripts (e.g., calendar, system, notes)
    • Categories are registered with the framework in index.ts
  3. Types (src/types/index.ts): TypeScript interfaces defining:
    • ScriptDefinition: Structure for individual scripts
    • ScriptCategory: Collection of related scripts
    • LogLevel: Standard logging levels
    • FrameworkOptions: Configuration options

Execution Flow

  1. Client sends a tool request via MCP protocol
  2. Server identifies the appropriate category and script
  3. Script content is generated (static or dynamically via function)
  4. AppleScript is executed via macOS osascript command
  5. Results are returned to the client

Logging System

The framework includes a comprehensive logging system that:

  • Logs to both stderr and MCP logging protocol
  • Supports multiple severity levels (debug, info, warning, error, etc.)
  • Provides detailed execution information for troubleshooting

Development

Setup

# Install dependencies npm install # Build the server npm run build # Launch MCP Inspector # See: https://modelcontextprotocol.io/docs/tools/inspector npx @modelcontextprotocol/inspector node path/to/server/index.js args...

Adding New Functionality

1. Create Category File

Create src/categories/newcategory.ts:

import { ScriptCategory } from "../types/index.js"; export const newCategory: ScriptCategory = { name: "category_name", description: "Category description", scripts: [ // Scripts will go here ], };
2. Add Scripts
{ name: "script_name", description: "What the script does", schema: { type: "object", properties: { paramName: { type: "string", description: "Parameter description" } }, required: ["paramName"] }, script: (args) => ` tell application "App" // AppleScript code using ${args.paramName} end tell ` }
3. Register Category

Update src/index.ts:

import { newCategory } from "./categories/newcategory.js"; // ... server.addCategory(newCategory);

Advanced Script Development

For more complex scripts, you can:

  1. Use dynamic script generation:
    script: (args) => { // Process arguments and build script dynamically let scriptContent = `tell application "App"\n`; if (args.condition) { scriptContent += ` // Conditional logic\n`; } scriptContent += `end tell`; return scriptContent; }
  2. Process complex data:
    // Example from Notes category function generateNoteHtml(args: any): string { // Process markdown-like syntax into HTML let processedContent = content; if (format.headings) { processedContent = processedContent.replace(/^# (.+)$/gm, '<h1>$1</h1>'); // ... } return processedContent; }

Debugging

Using MCP Inspector

The MCP Inspector provides a web interface for testing and debugging your server:

npm run inspector

Logging

Enable debug logging by setting the environment variable:

DEBUG=applescript-mcp* npm start

Example configuration

After running npm run build add the following to your mcp.json file:

{ "mcpServers": { "applescript-mcp-server": { "command": "node", "args": ["/path/to/applescript-mcp/dist/index.js"] } } }

Common Issues

  • Permission Errors: Check System Preferences > Security & Privacy > Privacy > Automation
  • Script Failures: Test scripts directly in Script Editor.app before integration
  • Communication Issues: Check stdio streams aren't being redirected
  • Database Access: Some features (like Messages) require Full Disk Access permission

Resources

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Commit your changes
  4. Push to the branch
  5. Create a Pull Request

License

MIT License - see LICENSE for details

You must be authenticated.

A
security – no known vulnerabilities
A
license - permissive license
A
quality - confirmed to work

local-only server

The server can only run on the client's local machine because it depends on local resources.

Enables LLM applications to interact with macOS through AppleScript.

  1. Features
    1. Planned Features
  2. Prerequisites
    1. Available Categories
      1. Calendar
      2. Clipboard
      3. Finder
      4. Notifications
      5. System
      6. iTerm
      7. Shortcuts
      8. Mail
      9. Messages
      10. Notes
      11. Pages
    2. Architecture
      1. Core Components
      2. Execution Flow
      3. Logging System
    3. Development
      1. Setup
      2. Adding New Functionality
      3. Advanced Script Development
    4. Debugging
      1. Using MCP Inspector
      2. Logging
      3. Example configuration
      4. Common Issues
    5. Resources
      1. Contributing
        1. License

          Related MCP Servers

          • A
            security
            A
            license
            A
            quality
            Enables LLMs to interact with web pages, take screenshots, and execute JavaScript in a real browser environment
            Last updated -
            10
            327
            85
            JavaScript
            MIT License
            • Apple
          • A
            security
            F
            license
            A
            quality
            Enables LLMs to perform web browsing tasks, take screenshots, and execute JavaScript using Puppeteer for browser automation.
            Last updated -
            4
            15,502
            1
            JavaScript
          • A
            security
            F
            license
            A
            quality
            Enables browser automation for LLMs on Linux display servers, supporting web interaction, screenshots, and JavaScript execution in a real browser.
            Last updated -
            7
            0
            2
            JavaScript
            • Linux
          • -
            security
            A
            license
            -
            quality
            A comprehensive toolkit that enhances LLM capabilities through the Model Context Protocol, allowing LLMs to interact with external services including command-line operations, file management, Figma integration, and audio processing.
            Last updated -
            12
            Python
            Apache 2.0
            • Linux
            • Apple

          View all related MCP servers

          ID: 0t5gydjcqw