AppleScript MCP

Ejecuta AppleScript en macOS

Documentación

Servidor MCP applescript-mcp

Un servidor de Protocolo de Model Context que permite a aplicaciones de LLM interactuar con macOS a través de AppleScript. Este servidor proporciona una interfaz estandarizada para que aplicaciones de IA controlen funciones del sistema, gestionen archivos, manejen notificaciones y más.

Node.js CI

applescript-mcp MCP server

Características

  • 🗓️ Gestión de calendario (eventos, recordatorios)
  • 📋 Operaciones de portapapeles
  • 🔍 Integración con Finder
  • 🔔 Notificaciones del sistema
  • ⚙️ Controles del sistema (volumen, modo oscuro, aplicaciones)
  • 📟 Integración con terminal iTerm
  • 📬 Correo (crear nuevo correo, listar correos, obtener correo)
  • 🔄 Automatización de accesos directos
  • 💬 Mensajes (listar chats, obtener mensajes, buscar mensajes, enviar un mensaje)
  • 🗒️ Notas (crear notas con formato, listar notas, buscar notas)
  • 📄 Pages (crear documentos)

Características Planificadas

  • 🧭 Safari (abrir en Safari, guardar contenido de página, obtener página/pestaña seleccionada)
  • ✅ Recordatorios (crear, obtener)

Requisitos Previos

  • macOS 10.15 o posterior
  • Node.js 18 o posterior

Categorías Disponibles

Calendario

ComandoDescripciónParámetros
addCrear evento de calendariotitle, startDate, endDate, calendar (opcional)
listListar eventos de hoyNinguno

Ejemplos

// 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?

Portapapeles

ComandoDescripciónParámetros
set_clipboardCopiar al portapapelescontent
get_clipboardObtener contenido del portapapelesNinguno
clear_clipboardLimpiar portapapelesNinguno

Ejemplos

// 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

ComandoDescripciónParámetros
get_selected_filesObtener archivos seleccionadosNinguno
search_filesBuscar archivosquery, location (opcional)
quick_lookVista previa de archivopath

Ejemplos

// 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

Notificaciones

Nota: Enviar notificaciones requiere que habilites las notificaciones en Configuración del Sistema > Notificaciones > Editor de Scripts.

ComandoDescripciónParámetros
send_notificationMostrar notificacióntitle, message, sound (opcional)
toggle_do_not_disturbAlternar modo No MolestarNinguno

Ejemplos

// 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

Sistema

ComandoDescripciónParámetros
volumeEstablecer volumen del sistemalevel (0-100)
get_frontmost_appObtener aplicación activaNinguno
launch_appAbrir aplicaciónname
quit_appCerrar aplicaciónname, force (opcional)
toggle_dark_modeAlternar modo oscuroNinguno

Ejemplos

// 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

ComandoDescripciónParámetros
paste_clipboardPegar en iTermNinguno
runEjecutar comandocommand, newWindow (opcional)

Ejemplos

// 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

Accesos Directos

ComandoDescripciónParámetros
run_shortcutEjecutar un acceso directoname, input (opcional)
list_shortcutsListar todos los accesos directos disponibleslimit (opcional)

Ejemplos

// 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"

Correo

ComandoDescripciónParámetros
create_emailCrear un nuevo correo en Mail.apprecipient, subject, body
list_emailsListar correos de un buzónmailbox (opcional), count (opcional), unreadOnly (opcional)
get_emailObtener un correo específico por búsquedasubject (opcional), sender (opcional), dateReceived (opcional), mailbox (opcional), account (opcional), unreadOnly (opcional), includeBody (opcional)

Ejemplos

// 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"

Mensajes

ComandoDescripciónParámetros
list_chatsListar chats de iMessage y SMS disponiblesincludeParticipantDetails (opcional, predeterminado: false)
get_messagesObtener mensajes de la aplicación Mensajeslimit (opcional, predeterminado: 100)
search_messagesBuscar mensajes que contengan texto específicosearchText, sender (opcional), chatId (opcional), limit (opcional, predeterminado: 50), daysBack (opcional, predeterminado: 30)
compose_messageAbrir la aplicación Mensajes con mensaje prellenado o envío automáticorecipient (requerido), body (opcional), auto (opcional, predeterminado: false)

Ejemplos

// 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"

Notas

ComandoDescripciónParámetros
createCrear una nota con formato similar a markdowntitle, content, format (opcional con opciones de formato)
createRawHtmlCrear una nota con contenido HTML directotitle, html
listListar notas, opcionalmente de una carpeta específicafolder (opcional)
getObtener una nota específica por títulotitle, folder (opcional)
searchBuscar notas que contengan texto específicoquery, folder (opcional), limit (opcional, predeterminado: 5), includeBody (opcional, predeterminado: true)

Ejemplos

// 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

ComandoDescripciónParámetros
create_documentCrear un nuevo documento de Pages con texto planocontent

Ejemplos

// 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."

Arquitectura

El servidor applescript-mcp está construido usando TypeScript y sigue una arquitectura modular:

Componentes Principales

  1. AppleScriptFramework (framework.ts): La clase principal del servidor que:

    • Gestiona la comunicación del protocolo MCP
    • Maneja el registro y ejecución de herramientas
    • Proporciona funcionalidad de registro de eventos
    • Ejecuta comandos de AppleScript
  2. Categorías (src/categories/*.ts): Colecciones de scripts modulares organizadas por funcionalidad:

    • Cada categoría contiene scripts relacionados (por ejemplo, calendario, sistema, notas)
    • Las categorías se registran con el framework en index.ts
  3. Tipos (src/types/index.ts): Interfaces de TypeScript que definen:

    • ScriptDefinition: Estructura para scripts individuales
    • ScriptCategory: Colección de scripts relacionados
    • LogLevel: Niveles estándar de registro de eventos
    • FrameworkOptions: Opciones de configuración

Flujo de Ejecución

  1. El cliente envía una solicitud de herramienta a través del protocolo MCP
  2. El servidor identifica la categoría y el script apropiados
  3. Se genera el contenido del script (estático o dinámicamente mediante función)
  4. AppleScript se ejecuta a través del comando osascript de macOS
  5. Los resultados se devuelven al cliente

Sistema de Registro de Eventos

El framework incluye un sistema integral de registro de eventos que:

  • Registra tanto en stderr como en el protocolo de registro de MCP
  • Admite múltiples niveles de gravedad (depuración, información, advertencia, error, etc.)
  • Proporciona información detallada de ejecución para la resolución de problemas

Desarrollo

Configuración

# 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...

Agregar Nueva Funcionalidad

1. Crear Archivo de Categoría

Crear 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. Agregar 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. Registrar Categoría

Actualizar src/index.ts:

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

Desarrollo Avanzado de Scripts

Para scripts más complejos, puedes:

  1. Usar generación dinámica de scripts:

    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. Procesar datos complejos:

    // 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;
    }
    

Depuración

Usando MCP Inspector

El MCP Inspector proporciona una interfaz web para probar y depurar tu servidor:

npm run inspector

Registro de Eventos

Habilita el registro de depuración configurando la variable de entorno:

DEBUG=applescript-mcp* npm start

Configuración de ejemplo

Después de ejecutar npm run build, agrega lo siguiente a tu archivo mcp.json:

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

Problemas Comunes

  • Errores de Permisos: Verifica Preferencias del Sistema > Seguridad y Privacidad > Privacidad > Automatización
  • Fallos de Scripts: Prueba los scripts directamente en Editor de Scripts.app antes de la integración
  • Problemas de Comunicación: Verifica que los flujos stdio no estén siendo redirigidos
  • Acceso a Base de Datos: Algunas funciones (como Mensajes) requieren permiso de Acceso Completo al Disco

Recursos

Contribuciones

  1. Haz un fork del repositorio
  2. Crea una rama de funcionalidad
  3. Realiza tus cambios
  4. Envía a la rama
  5. Crea una Solicitud de Extracción

Licencia

Licencia MIT - consulta LICENCIA para más detalles