mcp-osascript
Deixe o Claude controlar seu Mac — 12 ferramentas digitadas para janelas, menus, teclado, área de transferência, abas do navegador
Documentação
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.
Listado no registro oficial de MCP como io.github.m0rvayne/mcp-osascript

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:
| Prompt | O 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.
| Ferramenta | O que faz | Permissão |
|---|---|---|
check_permissions | Informa quais permissões estão concedidas e o que cada uma desbloqueia | Nenhuma |
run_osascript | Executa qualquer script AppleScript ou JXA | Nenhuma |
get_clipboard | Lê a área de transferência como texto | Nenhuma |
set_clipboard | Escreve texto na área de transferência | Nenhuma |
send_notification | Mostra banner de notificação do macOS | Nenhuma |
open_url | Abre URL no navegador (apenas http/https/mailto) | Nenhuma |
open_app | Inicia ou traz aplicativo para o primeiro plano | Nenhuma |
get_frontmost_app | Obtém nome do aplicativo ativo + bundle ID | Automação |
get_browser_tabs | Lista abas no Safari, Chrome ou Arc | Automação |
type_text | Digita texto no aplicativo ativo (máx. 500 caracteres) | Acessibilidade |
press_key | Pressiona tecla com modificadores (cmd+c, return, f5) | Acessibilidade |
manage_windows | Listar / mover / redimensionar / minimizar / tela cheia / fechar | Acessibilidade |
get_displays | Lista monitores — posição, tamanho, qual é o principal | Nenhuma |
app_menu | Lista ou clica em itens de menu em qualquer aplicativo | Acessibilidade |
screenshot | Captura tela inteira, uma região ou uma janela de aplicativo | Gravação de Tela |
app_visibility | Oculta, exibe ou encerra um aplicativo | Acessibilidade |
file_open | Abre um arquivo ou pasta, opcionalmente em um aplicativo específico | Nenhuma |
run_shortcut | Lista ou executa Atalhos da Apple | Nenhuma |
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-osascript | steipete (880★) | peakmojo (464★) | |
|---|---|---|---|
| Ferramentas tipadas com validação | 18 | 2 (genéricas) | 1 (genérica) |
| Lista de permissões de esquema de URL | http/https/mailto | Não | Não |
| Isolamento de ambiente (processo filho) | Apenas PATH+HOME+LANG | process.env completo | process.env completo |
| Encerramento de grupo de processos (sem órfãos) | SIGTERM→SIGKILL | Não | Não |
| Sanitização de erros (caminhos, tokens) | Sim | Não | Não |
| Proteção contra poluição de protótipo | Object.create(null) | Não | Não |
| Clique em menu autocorretivo | Sim | Não | Não |
| Testes de integração | 84 | 0 | 0 |
| Executa testes no CI | Sim | Não | Não |
| Auditorias red-team aprovadas | 4 | 0 | 0 |
| Isolamento de saída não confiável | Sim | Não | Não |
| Piping via stdin (sem arquivos temporários) | Sim | Arquivos temporários | Arquivos 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_osascriptexecuta 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_openrecusa 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 deopen_url.screenshotnunca sobrescreve um arquivo existente a menos queoverwrite: 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