AppleScript MCP

Execute AppleScript no macOS

Documentação

Servidor MCP applescript-mcp

Um servidor Model Context Protocol que permite que aplicações de LLM interajam com o macOS por meio do AppleScript. Este servidor fornece uma interface padronizada para aplicações de IA controlarem funções do sistema, gerenciarem arquivos, lidarem com notificações e muito mais.

Node.js CI

applescript-mcp MCP server

Recursos

  • 🗓️ Gerenciamento de calendário (eventos, lembretes)
  • 📋 Operações de área de transferência
  • 🔍 Integração com o Finder
  • 🔔 Notificações do sistema
  • ⚙️ Controles do sistema (volume, modo escuro, apps)
  • 📟 Integração com o terminal iTerm
  • 📬 Mail (criar novo e-mail, listar e-mails, obter e-mail)
  • 🔄 Automação de Shortcuts
  • 💬 Messages (listar conversas, obter mensagens, pesquisar mensagens, enviar mensagem)
  • 🗒️ Notes (criar notas formatadas, listar notas, pesquisar notas)
  • 📄 Pages (criar documentos)

Recursos Planejados

  • 🧭 Safari (abrir no Safari, salvar conteúdo da página, obter página/aba selecionada)
  • ✅ Reminders (criar, obter)

Pré-requisitos

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

Categorias Disponíveis

Calendário

ComandoDescriçãoParâmetros
addCriar evento de calendáriotitle, startDate, endDate, calendar (opcional)
listListar eventos de hojeNenhum

Exemplos

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

Área de Transferência

ComandoDescriçãoParâmetros
set_clipboardCopiar para a área de transferênciacontent
get_clipboardObter conteúdo da área de transferênciaNenhum
clear_clipboardLimpar área de transferênciaNenhum

Exemplos

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

ComandoDescriçãoParâmetros
get_selected_filesObter arquivos selecionadosNenhum
search_filesPesquisar arquivosquery, location (opcional)
quick_lookVisualizar arquivopath

Exemplos

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

Notificações

Nota: O envio de notificações requer que você habilite as notificações em System Settings > Notifications > Script Editor.

ComandoDescriçãoParâmetros
send_notificationMostrar notificaçãotitle, message, sound (opcional)
toggle_do_not_disturbAlternar modo Não PerturbeNenhum

Exemplos

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

ComandoDescriçãoParâmetros
volumeDefinir volume do sistemalevel (0-100)
get_frontmost_appObter aplicativo ativoNenhum
launch_appAbrir aplicativoname
quit_appFechar aplicativoname, force (opcional)
toggle_dark_modeAlternar modo escuroNenhum

Exemplos

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

ComandoDescriçãoParâmetros
paste_clipboardColar no iTermNenhum
runExecutar comandocommand, newWindow (opcional)

Exemplos

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

Atalhos

ComandoDescriçãoParâmetros
run_shortcutExecutar um atalhoname, input (opcional)
list_shortcutsListar todos os atalhos disponíveislimit (opcional)

Exemplos

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

ComandoDescriçãoParâmetros
create_emailCriar um novo e-mail no Mail.apprecipient, subject, body
list_emailsListar e-mails de uma caixa de correiomailbox (opcional), count (opcional), unreadOnly (opcional)
get_emailObter um e-mail específico por pesquisasubject (opcional), sender (opcional), dateReceived (opcional), mailbox (opcional), account (opcional), unreadOnly (opcional), includeBody (opcional)

Exemplos

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

ComandoDescriçãoParâmetros
list_chatsListar conversas iMessage e SMS disponíveisincludeParticipantDetails (opcional, padrão: false)
get_messagesObter mensagens do app Messageslimit (opcional, padrão: 100)
search_messagesPesquisar mensagens contendo texto específicosearchText, sender (opcional), chatId (opcional), limit (opcional, padrão: 50), daysBack (opcional, padrão: 30)
compose_messageAbrir o app Messages com mensagem pré-preenchida ou envio automáticorecipient (obrigatório), body (opcional), auto (opcional, padrão: false)

Exemplos

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

ComandoDescriçãoParâmetros
createCriar uma nota com formatação semelhante a Markdowntitle, content, format (opcional com opções de formatação)
createRawHtmlCriar uma nota com conteúdo HTML diretotitle, html
listListar notas, opcionalmente de uma pasta específicafolder (opcional)
getObter uma nota específica pelo títulotitle, folder (opcional)
searchPesquisar notas contendo texto específicoquery, folder (opcional), limit (opcional, padrão: 5), includeBody (opcional, padrão: true)

Exemplos

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

ComandoDescriçãoParâmetros
create_documentCriar um novo documento Pages com texto simplescontent

Exemplos

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

Arquitetura

O servidor applescript-mcp é construído usando TypeScript e segue uma arquitetura modular:

Componentes Principais

  1. AppleScriptFramework (framework.ts): A classe principal do servidor que:

    • Gerencia a comunicação do protocolo MCP
    • Lida com o registro e a execução de ferramentas
    • Fornece funcionalidade de registro (logging)
    • Executa comandos AppleScript
  2. Categories (src/categories/*.ts): Coleções modulares de scripts organizadas por funcionalidade:

    • Cada categoria contém scripts relacionados (ex.: calendário, sistema, notas)
    • As categorias são registradas no framework em index.ts
  3. Types (src/types/index.ts): Interfaces TypeScript que definem:

    • ScriptDefinition: Estrutura para scripts individuais
    • ScriptCategory: Coleção de scripts relacionados
    • LogLevel: Níveis padrão de registro (logging)
    • FrameworkOptions: Opções de configuração

Fluxo de Execução

  1. O cliente envia uma solicitação de ferramenta via protocolo MCP
  2. O servidor identifica a categoria e o script apropriados
  3. O conteúdo do script é gerado (estaticamente ou dinamicamente via função)
  4. O AppleScript é executado via comando osascript do macOS
  5. Os resultados são retornados ao cliente

Sistema de Registro (Logging)

O framework inclui um sistema abrangente de registro que:

  • Registra tanto no stderr quanto no protocolo de registro do MCP
  • Suporta vários níveis de severidade (debug, info, warning, error, etc.)
  • Fornece informações detalhadas de execução para solução de problemas

Desenvolvimento

Configuração

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

Adicionando Nova Funcionalidade

1. Criar Arquivo de Categoria

Crie 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. Adicionar 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 Categoria

Atualize src/index.ts:

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

Desenvolvimento Avançado de Scripts

Para scripts mais complexos, você pode:

  1. Usar geração 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. Processar dados complexos:

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

Depuração

Usando o MCP Inspector

O MCP Inspector fornece uma interface web para testar e depurar seu servidor:

npm run inspector

Registro (Logging)

Habilite o registro de depuração definindo a variável de ambiente:

DEBUG=applescript-mcp* npm start

Exemplo de configuração

Após executar npm run build, adicione o seguinte ao seu arquivo mcp.json:

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

Problemas Comuns

  • Erros de Permissão: Verifique System Preferences > Security & Privacy > Privacy > Automation
  • Falhas de Script: Teste os scripts diretamente no Script Editor.app antes da integração
  • Problemas de Comunicação: Verifique se os fluxos stdio não estão sendo redirecionados
  • Acesso ao Banco de Dados: Alguns recursos (como Messages) exigem permissão de Acesso Total ao Disco

Recursos

Contribuindo

  1. Faça um fork do repositório
  2. Crie um branch de funcionalidade
  3. Faça commit das suas alterações
  4. Envie para o branch
  5. Crie um Pull Request

Licença

Licença MIT - consulte LICENSE para detalhes