mcp-osascript

Deixe o Claude controlar seu Mac — 12 ferramentas digitadas para janelas, menus, teclado, área de transferência, abas do navegador

Documentação

mcp-osascript

Deixe o Claude controlar seu Mac. Mova janelas, clique em menus, digite texto, leia a área de transferência, gerencie abas do navegador, tire capturas de tela, execute Atalhos — 18 ferramentas tipadas com validação de entrada e proteções de segurança.

npm version macOS 13+ Node 18+ License: MIT Tests: 84 passed Tests m0rvayne/mcp-osascript MCP server

Listado no registro oficial de MCP como io.github.m0rvayne/mcp-osascript


Demo

Início Rápido

Claude Desktop — um clique. Baixe o mcp-osascript-1.1.3.mcpb da versão mais recente e clique duas vezes nele. O Claude Desktop instala a extensão automaticamente.

Ou adicione-o ao config manualmente:

{
  "mcpServers": {
    "osascript": {
      "command": "npx",
      "args": ["-y", "mcp-osascript"]
    }
  }
}

Adicione isto ao seu config do Claude Desktop (Settings → Developer → Edit Config), reinicie o Claude, e está pronto.

Config para outros clientes (Cursor, VS Code, Claude Code)

Cursor / VS Code (Copilot)

{
  "mcpServers": {
    "osascript": {
      "command": "npx",
      "args": ["-y", "mcp-osascript"]
    }
  }
}

Claude Code

claude mcp add osascript -- npx -y mcp-osascript

A partir do código-fonte (desenvolvimento)

git clone https://github.com/m0rvayne/mcp-osascript.git
cd mcp-osascript && npm install
# then use: "command": "node", "args": ["/path/to/mcp-osascript/server/index.js"]

Experimente Estes Prompts

Depois de instalado, peça ao Claude:

PromptO que acontece
"Abra o Safari e me mostre quais abas eu tenho"Inicia o Safari, lê todos os títulos e URLs das abas
"Mova a janela do Finder para a metade esquerda da minha tela"Redimensiona e posiciona a janela
"Clique em Arquivo → Exportar como PDF no Keynote"Navega pela barra de menus e clica no item
"Copie o URL da minha aba ativa do Chrome"Lê as abas do navegador, encontra a ativa
"Digite 'Olá Mundo' no campo de texto ativo"Simula entrada de teclado
"Mostre uma notificação quando terminar"Exibe um banner nativo do macOS
"Qual aplicativo estou usando agora?"Retorna o nome e o bundle ID do aplicativo em primeiro plano
"Pressione Cmd+Shift+4"Aciona o atalho de captura de tela
"Liste todos os itens do menu Editar do VS Code"Inspeciona a barra de menus
"Feche a segunda janela do Terminal"Mira uma janela específica pelo índice
"Capture a janela do Safari e salve na minha Área de Trabalho"Captura apenas aquela janela, não a tela inteira
"Em qual monitor está a minha janela do Slack?"Lê a geometria do display e as posições das janelas
"Oculte tudo exceto meu editor"Oculta aplicativos sem encerrá-los
"Execute meu atalho 'Daily Standup'"Invoca um Atalho da Apple pelo nome

Ferramentas

18 ferramentas tipadas, cada uma com validação de entrada, classificação de erros e mensagens de erro cientes de permissões.

FerramentaO que fazPermissão
check_permissionsInforma quais permissões estão concedidas e o que cada uma desbloqueiaNenhuma
run_osascriptExecuta qualquer script AppleScript ou JXANenhuma
get_clipboardLê a área de transferência como textoNenhuma
set_clipboardEscreve texto na área de transferênciaNenhuma
send_notificationMostra banner de notificação do macOSNenhuma
open_urlAbre URL no navegador (apenas http/https/mailto)Nenhuma
open_appInicia ou traz aplicativo para o primeiro planoNenhuma
get_frontmost_appObtém nome do aplicativo ativo + bundle IDAutomação
get_browser_tabsLista abas no Safari, Chrome ou ArcAutomação
type_textDigita texto no aplicativo ativo (máx. 500 caracteres)Acessibilidade
press_keyPressiona tecla com modificadores (cmd+c, return, f5)Acessibilidade
manage_windowsListar / mover / redimensionar / minimizar / tela cheia / fecharAcessibilidade
get_displaysLista monitores — posição, tamanho, qual é o principalNenhuma
app_menuLista ou clica em itens de menu em qualquer aplicativoAcessibilidade
screenshotCaptura tela inteira, uma região ou uma janela de aplicativoGravação de Tela
app_visibilityOculta, exibe ou encerra um aplicativoAcessibilidade
file_openAbre um arquivo ou pasta, opcionalmente em um aplicativo específicoNenhuma
run_shortcutLista ou executa Atalhos da AppleNenhuma

Menus Autocorretivos

Quando o Claude tenta clicar em um item de menu que não existe, o servidor retorna automaticamente a lista de itens disponíveis naquele nível — para que o Claude possa tentar novamente com o nome correto. Nenhum outro servidor MCP faz isso.

User:   "Click File → Export as PDF in Preview"
Claude: calls app_menu click ["File", "Export as PDF"]
Server: "Menu item 'Export as PDF' not found in 'File'.
         Available: ['New from Clipboard', 'Open...', 'Close', 'Save',
         'Duplicate', 'Rename...', 'Export...', 'Export as PDF...']"
Claude: calls app_menu click ["File", "Export as PDF..."]
Server: "Clicked: File > Export as PDF..."

Por que mcp-osascript?

mcp-osascriptsteipete (880★)peakmojo (464★)
Ferramentas tipadas com validação182 (genéricas)1 (genérica)
Lista de permissões de esquema de URLhttp/https/mailtoNãoNão
Isolamento de ambiente (processo filho)Apenas PATH+HOME+LANGprocess.env completoprocess.env completo
Encerramento de grupo de processos (sem órfãos)SIGTERM→SIGKILLNãoNão
Sanitização de erros (caminhos, tokens)SimNãoNão
Proteção contra poluição de protótipoObject.create(null)NãoNão
Clique em menu autocorretivoSimNãoNão
Testes de integração8400
Executa testes no CISimNãoNão
Auditorias red-team aprovadas400
Isolamento de saída não confiávelSimNãoNão
Piping via stdin (sem arquivos temporários)SimArquivos temporáriosArquivos temporários

As contagens de estrelas são uma medida de popularidade, não de qualidade — ambas as alternativas são anteriores a este projeto em meses. As linhas acima são o que difere na prática.

Auditorias de segurança

Quatro auditorias red-team aprovadas (agentes adversários executados contra o código-fonte, encomendadas pelo autor — não uma certificação de terceiros), a mais recente contra a v1.1.2 com três agentes paralelos cobrindo a superfície do shell, escape de AppleScript e divulgação de informações. Ela encontrou seis defeitos reais, incluindo uma ferramenta que anulava silenciosamente a lista de permissões de esquema de outra ferramenta e um slot de concorrência que podia vazar até o servidor travar. Cada descoberta foi corrigida e possui um teste de regressão. escapeAS foi verificado contra 13 candidatos de escape de string através de osascript real — nenhum escapa.

Permissões

As ferramentas funcionam em três níveis:

  • Nenhuma permissão necessária — área de transferência, notificações, URLs, aplicativos, arquivos, displays, Atalhos. Funciona imediatamente.
  • Automação — abas do navegador, aplicativo em primeiro plano. O macOS solicita uma vez por navegador.
  • Acessibilidade — teclado, janelas, menus, ocultar/exibir. Conceda uma vez em Ajustes do Sistema → Privacidade e Segurança → Acessibilidade.
  • Gravação de Tela — apenas capturas de tela. Conceda em Ajustes do Sistema → Privacidade e Segurança → Gravação de Tela.

Peça ao Claude para executar check_permissions e ele informará quais destas já estão concedidas, quais ferramentas cada uma desbloqueia e exatamente qual painel de ajustes abrir para o restante. As sondagens são somente leitura e nunca acionam um prompt de permissão.

Quando uma permissão está ausente, o servidor informa exatamente o que fazer:

"Accessibility permission required. Grant access to 'osascript'
in System Settings > Privacy & Security > Accessibility."

Testes

npm test

84 testes de integração cobrindo todas as 18 ferramentas — validação de entrada, limites de segurança (bloqueio de esquema de URL, poluição de protótipo, limites de tamanho de script), aplicação de tempo limite, tratamento de erros de permissão e regressões para cada descoberta da auditoria de segurança.

Segurança e Arquitetura

Segurança

  • run_osascript executa código arbitrário — isso é por design. O cliente MCP (Claude) é o limite de confiança.
  • Scripts enviados via stdin para /usr/bin/osascript — sem arquivos temporários, sem condições de corrida TOCTOU.
  • Tamanho do script: máx. 50 KB. Saída: máx. 50K caracteres, truncada em um limite de caractere UTF-8 (sem mojibake em saída não latina).
  • Mensagens de erro sanitizadas — caminhos de arquivos, tokens e senhas são removidos.
  • Processos filhos recebem ambiente mínimo: apenas PATH, HOME, LANG — sem vazamento de chaves de API ou segredos.
  • Lista de permissões de esquema de URL — file://, smb://, vnc://, javascript: todos bloqueados.
  • O despacho de handlers usa Object.create(null) — sem poluição de protótipo.
  • Texto de fontes externas (títulos de abas do navegador, títulos de janelas, itens de menu, área de transferência) é retornado dentro de um envelope explícito <untrusted-data>, para que uma página da web que se renomeie não possa contrabandear instruções para o contexto do modelo.
  • file_open recusa qualquer coisa que seja analisada como URL — open(1) resolve URLs além de caminhos, então sem essa verificação ele anularia silenciosamente a lista de permissões de esquema de open_url.
  • screenshot nunca sobrescreve um arquivo existente a menos que overwrite: true, e a extensão deve corresponder ao formato.
  • Toda ferramenta de construção de listas remove |, CR e LF de nomes fornecidos pelo aplicativo, para que um título de janela ou aba manipulado não possa forjar um registro.

Confiabilidade

  • Encerramento de grupo de processos em tempo limite — SIGTERM → 2s de graça → SIGKILL. Sem processos órfãos.
  • Semáforo de concorrência — máx. 5 processos osascript simultâneos.
  • Encerramento gracioso — server.close() com rede de segurança de encerramento forçado de 10s.
  • Classificação de erros — analisa códigos de erro do macOS (-1728, -1743, -25211) em mensagens acionáveis. Suporta locais em inglês e russo.

Requisitos

  • macOS 13+ (Ventura ou posterior)
  • Node.js 18+

Licença

MIT