MCP AppleScript
Enables Large Language Models to automate macOS applications and execute AppleScript commands through natural language. It features built-in security protections including application allowlists and dangerous pattern detection to prevent unauthorized or risky system operations.
README
MCP AppleScript
An MCP (Model Context Protocol) server that enables Large Language Models to execute AppleScript commands on macOS. This allows LLMs to interact with and automate macOS applications through natural language requests.
Features
- Execute AppleScript commands from LLM applications
- Application allowlist for controlled access to specific apps
- Dangerous pattern detection to block risky operations
- Configurable timeout protection
- Built on FastMCP for easy integration
Installation
Using uv:
uv pip install mcp-applescript
Or install from source:
git clone https://github.com/pietz/mcp-applescript.git
cd mcp-applescript
uv sync
Usage
Running the Server
mcp-applescript
The server runs using stdio transport, making it compatible with any MCP client.
Available Tools
run_applescript
Execute an AppleScript command on macOS.
Parameters:
script(string): The AppleScript code to execute
Returns:
- String output from the script execution
- Raises error if script fails validation or execution
Example:
tell application "Mail"
get subject of first message of inbox
end tell
get_server_status
Get the current server configuration and security settings.
Returns:
- Server version and configuration
- Allowed applications list
- Security settings (dangerous pattern blocking, timeout)
- Environment variable documentation
Example Response:
{
"server": "MCP AppleScript",
"version": "0.1.0",
"security": {
"allowed_apps": ["Mail", "Calendar"],
"block_dangerous": true,
"timeout_seconds": 30
}
}
Configuration
MCP Client Setup
Add to your MCP client configuration (e.g., Claude Desktop):
{
"mcpServers": {
"applescript": {
"command": "mcp-applescript",
"env": {
"ALLOWED_APPS": "mail,calendar,contacts,notes",
"BLOCK_DANGEROUS": "true"
}
}
}
}
Environment Variables
ALLOWED_APPS (optional)
- Comma-separated list of allowed applications (case-insensitive)
- Example:
"mail,calendar,contacts"(lowercase recommended) - Not set (default): Allows all applications (
"*") "*": Explicitly allows all applications""(empty string): Blocks all applications (lockdown mode)- Security Note: Set this to restrict access to specific apps only
- App names are automatically normalized to title case for AppleScript
BLOCK_DANGEROUS (optional)
- Enable/disable dangerous pattern detection
- Values:
"true"or"false" - Default:
"true" - Blocks patterns like:
do shell script, file system access, system control commands
TIMEOUT (optional)
- Script execution timeout in seconds
- Default:
"30"
Security Profiles
Default (Out of the Box)
"env": {
// ALLOWED_APPS not set = allow all apps
"BLOCK_DANGEROUS": "true" // This is the default, can be omitted
}
- ✅ Works immediately without configuration
- ✅ Dangerous operations blocked
- ⚠️ Can access any application
Strict (Recommended for Production)
"env": {
"ALLOWED_APPS": "mail,calendar,contacts",
"BLOCK_DANGEROUS": "true"
}
- ✅ Limited to specific applications
- ✅ Dangerous operations blocked
- ✅ Best security posture
Permissive (Development/Testing Only)
"env": {
"ALLOWED_APPS": "*", // or omit this line
"BLOCK_DANGEROUS": "false"
}
- ⚠️ Can access any application
- ⚠️ Dangerous operations allowed
- ⚠️ Use only in trusted environments
Lockdown (Explicit Block)
"env": {
"ALLOWED_APPS": "" // Empty string = block all
}
- 🔒 Blocks all AppleScript execution
- Useful for temporary disabling
Security
Built-in Protections
-
Application Allowlist (optional)
- Default: All applications allowed (for usability)
- Configure
ALLOWED_APPSto restrict to specific applications - Prevents unauthorized access to system apps when configured
-
Dangerous Pattern Detection
- Blocks shell command execution (
do shell script) - Prevents system control operations (shutdown, restart, logout)
- Blocks access to sensitive paths (
/System,/Library,~/.ssh) - Detects potential phishing (password dialogs)
- Prevents file deletion operations
- Blocks shell command execution (
-
Execution Timeout
- Prevents infinite loops and hanging scripts
- Configurable timeout duration
Blocked Operations Examples
-- ❌ BLOCKED: Shell command execution
do shell script "rm -rf ~/"
-- ❌ BLOCKED: System control
tell application "System Events" to shut down
-- ❌ BLOCKED: Sensitive file access
do shell script "cat ~/.ssh/id_rsa"
-- ❌ BLOCKED: Unauthorized application (if not in ALLOWED_APPS)
tell application "Terminal" to do script "echo test"
-- ✅ ALLOWED: Reading from allowed app
tell application "Mail"
get subject of first message of inbox
end tell
Best Practices
- Configure application allowlist: Set
ALLOWED_APPSto only the applications you need for production use - Keep dangerous blocking enabled: Default is on - provides essential protection
- Review server status: Use
get_server_statustool to understand current configuration - Principle of least privilege: In production, only allow the minimum necessary applications
- Start permissive, then restrict: Begin with defaults, then lock down based on actual usage
Usage Examples
Check Server Configuration
Before running scripts, check what's allowed:
User: "What can you access on my system?"
LLM uses: get_server_status()
Response: "I can currently access: Mail, Calendar, and Contacts.
Dangerous operations are blocked, and scripts timeout after 30 seconds."
Read Mail (Allowed)
tell application "Mail"
get subject of first message of inbox
end tell
Get Calendar Events (Allowed)
tell application "Calendar"
get summary of every event of calendar "Work"
end tell
System Information (Blocked - Security)
-- This will be BLOCKED if "System Events" not in ALLOWED_APPS
tell application "System Events"
name of first process whose frontmost is true
end tell
Display Notification (Safe)
-- Safe if no dangerous patterns
display notification "Hello from MCP!" with title "AppleScript"
Requirements
- Python >= 3.12
- macOS (AppleScript is macOS-only)
- mcp >= 1.13.1
License
MIT
Author
Paul-Louis Pr�ve
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.