Safari MCP
Automação nativa do navegador Safari para agentes de IA — 80 ferramentas via AppleScript, zero sobrecarga do Chrome, mantém logins. Apenas macOS.
Documentação
🦁 Safari MCP
O navegador para o seu agente de codificação.
Seu Safari real, com login feito — sem Chrome, sem aquecimento, sem headless.
97 ferramentas · Sem necessidade de Chrome/Puppeteer/Playwright · ~5ms por comando · 60% menos CPU que o Chrome
Início Rápido · Todas as 97 Ferramentas · Exemplos · Por que Safari MCP? · Arquitetura · Changelog

❌ Sem Safari MCP
Seu agente de IA precisa navegar. Então ele:
- Inicia Chromium via Playwright — sem logins, sem cookies, sem sessões
- Usa Chrome DevTools MCP — e esquenta seu ventilador rodando um segundo navegador
- Depende de scrapers headless — bloqueados por Cloudflare, reCAPTCHA e detecção de bots
✅ Com Safari MCP
Sua IA controla o Safari no qual você já está logado — Gmail, GitHub, Ahrefs, Slack, banco.
WebKit nativo. ~60% menos CPU. Operação em segundo plano. 97 ferramentas. Um comando npx. Somente macOS.
📰 Destaque no freeCodeCamp: Como Conectar Seu Agente de Codificação de IA a um Navegador no macOS · HackerNoon: Engenharia Reversa de React, Shadow DOM e CSP
🍎 A Apple lançou um Safari MCP oficial (julho de 2026 — Safari Technology Preview 247+ e o beta do Safari 27). Ele é construído sobre
safaridriverpara sessões de depuração isoladas. O safari-mcp controla o Safari real no qual você já está logado — no Safari estável que acompanha o macOS hoje, com 97 ferramentas. Veja a comparação completa abaixo.
Destaques
- 97 ferramentas — navegação, cliques, formulários, capturas de tela, rede, armazenamento, acessibilidade e mais
- Zero aquecimento — WebKit nativo em Apple Silicon, ~60% menos CPU que o Chrome
- Seu navegador real — mantém todos os logins, cookies, sessões (Gmail, GitHub, Ahrefs, etc.)
- Operação em segundo plano — o Safari permanece em segundo plano, sem roubar a janela
- Sem dependências de navegador — sem Puppeteer, sem Playwright, sem WebDriver, sem Chrome
- Processo persistente — reutiliza um único processo osascript (~5ms por comando vs ~80ms)
- Compatível com frameworks — preenchimento de formulários React, Vue, Angular, Svelte via setters nativos
Nas palavras dos usuários
Depoimentos não solicitados — citações retiradas do rastreador público de issues, cada uma vinculada ao tópico de onde veio.
"Eu executo várias sessões/subagentes do Pi contra meu perfil normal do Safari em paralelo. Compartilhar seus cookies e logins é intencional." — @maxim, sobre executar agentes concorrentes contra um navegador real
"O servidor tem um modelo deliberado de propriedade de abas … o código é cuidadoso com isso, e para o caso padrão essa é a postura de segurança correta." — @turner-moore, sobre por que os guardiões se recusam a tocar em suas abas
"Validação local direta do pacote: Safari MCP doctor 6/6." — @jrepp, que encontrou e corrigiu um bug de alinhamento de fila no helper de foco
Início Rápido
Pré-requisitos
- macOS (qualquer versão com Safari)
- Node.js 20+
- Safari → Ajustes → Avançado → Mostrar recursos para desenvolvedores web ✓
- Safari → Desenvolver → Permitir JavaScript de Apple Events ✓
Instalar (um comando)
npx safari-mcp
É isso — sem necessidade de instalação global. Ou instale permanentemente:
npm install -g safari-mcp
Configure seu cliente MCP
Todos os clientes executam o Safari MCP da mesma forma — npx safari-mcp. Escolha seu editor:
Claude Code
claude mcp add safari -- npx safari-mcp
Ou edite ~/.mcp.json:
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Claude Desktop
Edite ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Reinicie o Claude Desktop após salvar.
Cursor
Um clique: Instalar no Cursor
Ou edite .cursor/mcp.json no seu projeto:
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
VS Code / VS Code Insiders
Um clique: Instalar no VS Code
Ou edite .vscode/mcp.json:
{
"servers": {
"safari": {
"type": "stdio",
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Windsurf
Edite .windsurf/mcp.json no seu projeto (ou ~/.codeium/windsurf/mcp_config.json globalmente):
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Cline
Abra o Cline no VS Code → clique no ícone MCP → Editar Configurações MCP → adicione:
{
"mcpServers": {
"safari": {
"command": "npx",
"args": ["safari-mcp"]
}
}
}
Continue
Edite ~/.continue/config.yaml (ou .continue/config.yaml no workspace):
mcpServers:
- name: safari
command: npx
args:
- safari-mcp
Goose
Edite ~/.config/goose/config.yaml:
extensions:
safari:
name: safari
type: stdio
cmd: npx
args:
- safari-mcp
enabled: true
LM Studio
Abra o LM Studio → Configurações → Servidores MCP → Adicionar Servidor:
- Nome:
safari - Comando:
npx - Args:
safari-mcp
Zed
Abra o Zed → Configurações → pesquise por "Context Servers" e adicione:
{
"context_servers": {
"safari": {
"command": {
"path": "npx",
"args": ["safari-mcp"]
}
}
}
}
Alternativa: Homebrew
brew install achiya-automation/tap/safari-mcp
Alternativa: a partir do código-fonte
git clone https://github.com/achiya-automation/safari-mcp.git
cd safari-mcp && npm install
Fluxo de Trabalho de Uso
O padrão recomendado para agentes de IA usando Safari MCP:
1. safari_snapshot → Get page state (accessibility tree)
2. safari_click/fill/... → Interact with elements by ref
3. safari_snapshot → Verify the result
Segmentação de elementos — as ferramentas aceitam múltiplas estratégias de segmentação:
| Estratégia | Exemplo | Melhor para |
|---|---|---|
| Seletor CSS | #login-btn, .submit | Elementos únicos |
| Texto visível | "Sign In", "Submit" | Botões, links |
| Coordenadas | x: 100, y: 200 | Canvas, widgets personalizados |
| Ref do snapshot | ref: "e42" | Qualquer elemento da árvore de acessibilidade |
Dica: Comece com
safari_snapshotpara obter refs de elementos e depois use refs para segmentação precisa. Isso é mais rápido e confiável do que seletores CSS.
Executando vários agentes ao mesmo tempo
Vários agentes ou subagentes controlando um Safari ao mesmo tempo vão disputar a aba ativa — a menos que você os execute contra um daemon HTTP compartilhado em vez de um processo por cliente:
SAFARI_MCP_HTTP=1 SAFARI_MCP_HTTP_PORT=9225 npx safari-mcp
Depois aponte cada cliente para ele:
{ "mcpServers": { "safari-mcp": { "type": "http", "url": "http://127.0.0.1:9225/mcp" } } }
Um daemon, muitas sessões — e cada sessão tem seu próprio estado de aba. O servidor chaveia activeTabIndex, o sinalizador de propriedade e um marcador de aba exclusivo pelo ID da sessão MCP, então a sessão A fisicamente não consegue ler ou direcionar a aba da sessão B.
Duas propriedades tornam isso seguro em vez de apenas organizado:
-
A identidade da aba é um marcador, não um índice. Cada sessão carimba um ID exclusivo na página que abre, então a propriedade sobrevive à navegação e sobrevive ao usuário reordenar ou fechar outras abas. Um índice sozinho deslizaria silenciosamente para a aba errada.
-
Falha de forma fechada. Se a aba marcada de uma sessão não puder ser reencontrada, todas as ferramentas recusam em vez de recorrer a qualquer aba que esteja na frente — porque essa aba geralmente é sua:
Tab tracking lost — refusing to fall back to "current tab of window" (would target the user's active tab). Call safari_new_tab to reopen.
Isso também reduz drasticamente a contagem de processos: ~17 processos node para 17 sessões concorrentes se tornam 1.
SAFARI_PROFILE permanece opcional — deixe desdefinido e as sessões se vinculam às suas janelas normais do Safari, com cookies e logins intactos. Detalhes em docs/http-transport-design.md.
Prefere stdio (um processo por agente) em vez de um daemon persistente? Isso também funciona — o isolamento então vem do próprio limite do processo. Uma ressalva: se seu cliente multiplexa agentes via mcporter, o mcporter armazena em cache um único cliente MCP para todos eles — independentemente do transporte escolhido — então o servidor nunca vê sessões distintas e o isolamento por sessão não pode ser ativado. mcporter-lanes (uma extensão pi de @maxim, nascida de #76) corrige isso upstream: cada sessão de agente recebe seu próprio diretório de daemon — e, portanto, seu próprio safari-mcp — com um tempo limite de inatividade para que os processos não se acumulem.
Variáveis de ambiente
| Variável | Padrão | O que faz |
|---|---|---|
SAFARI_MCP_HTTP | desligado | Executa um daemon HTTP compartilhado em vez de um processo por cliente (veja acima). |
SAFARI_MCP_HTTP_PORT | 9225 | Porta para esse daemon. |
SAFARI_PROFILE | desdefinido | Vincula sessões a um perfil Safari nomeado. Desdefinido = suas janelas normais. |
SAFARI_MCP_RAISE_ON_NAVIGATE | desligado | Permite que a navegação traga o Safari para a frente e impede que o guardião de foco coloque seu aplicativo anterior de volta. |
SAFARI_MCP_RAISE_ON_NAVIGATE=1 é para agentes cujo objetivo principal é mostrar uma página — um assistente de voz respondendo "abra o YouTube", um driver de demonstração. Todo o resto deve deixá-lo desligado: por padrão, o Safari MCP trabalha em segundo plano e devolve o foco para qualquer aplicativo que você estava usando, para que um agente possa controlar uma página enquanto você continua digitando em outro lugar.
Ferramentas (97)
Clique para expandir a lista completa de ferramentas — organizada por categoria
Navegação (4)
| Ferramenta | Descrição |
|---|---|
safari_navigate | Navegar para URL (HTTPS automático, aguarda carregamento) |
safari_go_back | Voltar no histórico |
safari_go_forward | Avançar no histórico |
safari_reload | Recarregar página (recarga forçada opcional) |
Leitura de Página (3)
| Ferramenta | Descrição |
|---|---|
safari_read_page | Obter título, URL e conteúdo de texto |
safari_get_source | Obter código-fonte HTML completo |
safari_navigate_and_read | Navegar + ler em uma única chamada |
Clique e Interação (6)
| Ferramenta | Descrição |
|---|---|
safari_click | Clicar por seletor CSS, texto visível ou coordenadas |
safari_double_click | Clique duplo (selecionar palavra, etc.) |
safari_right_click | Clique direito (menu de contexto) |
safari_hover | Passar o mouse sobre o elemento |
safari_click_and_wait | Clicar + aguardar navegação |
safari_click_and_read | Clicar e retornar a página atualizada — economiza uma ida e volta (React Router + carregamentos completos) |
Entrada de Formulário (11)
| Ferramenta | Descrição |
|---|---|
safari_fill | Preencher entrada (compatível com React/Vue/Angular) |
safari_clear_field | Limpar campo de entrada |
safari_select_option | Selecionar opção de menu suspenso |
safari_fill_form | Preencher vários campos em lote |
safari_fill_and_submit | Preencher formulário + enviar em uma única chamada |
safari_type_text | Digitar teclas reais (baseado em JS, sem System Events) |
safari_press_key | Pressionar tecla com modificadores |
safari_react_select_set | Definir um valor react-select v5 via React fiber — ignora a interface do menu |
safari_react_select_list_options | Listar as opções de um menu suspenso react-select v5 sem abri-lo |
safari_replace_editor | Substituir todo o conteúdo em um editor de código (Monaco, CodeMirror, Ace, ProseMirror) |
safari_verify_state | Verificar se o estado do editor no nível do framework corresponde ao esperado — detectar DOM obsoleto antes de Enviar |
Capturas de Tela e PDF (3)
| Ferramenta | Descrição |
|---|---|
safari_screenshot | Captura de tela como PNG (viewport ou página inteira) |
safari_screenshot_element | Captura de tela de um elemento específico |
safari_save_pdf | Exportar página como PDF |
Scroll (3)
| Ferramenta | Descrição |
|---|---|
safari_scroll | Rolar para cima/baixo por pixels |
safari_scroll_to | Rolar para posição exata |
safari_scroll_to_element | Rolagem suave até o elemento |
Gerenciamento de Abas (5)
| Ferramenta | Descrição |
|---|---|
safari_list_tabs | Listar todas as abas (índice, título, URL) |
safari_new_tab | Abrir nova aba (em segundo plano, sem roubo de foco) |
safari_close_tab | Fechar aba |
safari_switch_tab | Alternar para aba por índice |
safari_wait_for_new_tab | Aguardar nova aba (ex.: popup OAuth) e alternar automaticamente para ela |
Espera (2)
| Ferramenta | Descrição |
|---|---|
safari_wait_for | Aguardar elemento, texto ou mudança de URL |
safari_wait | Aguardar milissegundos especificados |
JavaScript (1)
| Ferramenta | Descrição |
|---|---|
safari_evaluate | Executar JavaScript arbitrário, retornar resultado |
safari_eval_file | Executar JavaScript lido de um caminho de arquivo (evita scripts inline enormes) |
Inspeção de Elementos (4)
| Ferramenta | Descrição |
|---|---|
safari_get_element | Detalhes do elemento (tag, retângulo, atributos, visibilidade) |
safari_query_all | Encontrar todos os elementos correspondentes |
safari_get_computed_style | Estilos CSS calculados |
safari_detect_forms | Detectar automaticamente todos os formulários com seletores de campos |
Acessibilidade (2)
| Ferramenta | Descrição |
|---|---|
safari_accessibility_snapshot | Árvore de acessibilidade completa: papéis, ARIA, elementos focáveis |
safari_snapshot | Árvore de acessibilidade com IDs de referência para cada elemento interativo — forma preferida de ver o estado da página |
Arrastar e Soltar (1)
| Ferramenta | Descrição |
|---|---|
safari_drag | Arrastar entre elementos ou coordenadas |
Operações de Arquivo (2)
| Ferramenta | Descrição |
|---|---|
safari_upload_file | Enviar arquivo via JS DataTransfer (sem diálogo de arquivo!) |
safari_paste_image | Colar imagem no editor (sem tocar na área de transferência!) |
Diálogo e Janela (2)
| Ferramenta | Descrição |
|---|---|
safari_handle_dialog | Lidar com alert/confirm/prompt |
safari_resize | Redimensionar janela do navegador |
Emulação de Dispositivo (2)
| Ferramenta | Descrição |
|---|---|
safari_emulate | Emular dispositivo (iPhone, iPad, Pixel, Galaxy) |
safari_reset_emulation | Redefinir para desktop |
Cookies e Armazenamento (11)
| Ferramenta | Descrição |
|---|---|
safari_get_cookies | Obter todos os cookies |
safari_set_cookie | Definir cookie com todas as opções |
safari_delete_cookies | Excluir um ou todos os cookies |
safari_local_storage | Ler localStorage |
safari_set_local_storage | Escrever localStorage |
safari_delete_local_storage | Excluir/limpar localStorage |
safari_session_storage | Ler sessionStorage |
safari_set_session_storage | Escrever sessionStorage |
safari_delete_session_storage | Excluir/limpar sessionStorage |
safari_export_storage | Exportar todo o armazenamento como JSON (backup/restauração de sessões) |
safari_import_storage | Importar estado de armazenamento de JSON |
Área de Transferência (2)
| Ferramenta | Descrição |
|---|---|
safari_clipboard_read | Ler texto da área de transferência |
safari_clipboard_write | Escrever texto na área de transferência |
Rede (6)
| Ferramenta | Descrição |
|---|---|
safari_network | Requisições de rede rápidas via Performance API |
safari_start_network_capture | Iniciar captura detalhada (fetch + XHR) |
safari_network_details | Obter requisições capturadas com cabeçalhos/tempos |
safari_clear_network | Limpar requisições capturadas |
safari_mock_route | Simular respostas de rede (interceptar fetch/XHR) |
safari_clear_mocks | Remover todas as simulações de rede |
Console (4)
| Ferramenta | Descrição |
|---|---|
safari_start_console | Iniciar captura de mensagens do console |
safari_get_console | Obter todas as mensagens capturadas |
safari_clear_console | Limpar mensagens capturadas |
safari_console_filter | Filtrar por nível (log/warn/error) |
Desempenho (2)
| Ferramenta | Descrição |
|---|---|
safari_performance_metrics | Tempos de navegação, Web Vitals, memória |
safari_throttle_network | Simular slow-3g/fast-3g/4g/offline |
Extração de Dados (4)
| Ferramenta | Descrição |
|---|---|
safari_extract_tables | Tabelas como JSON estruturado |
safari_extract_meta | Todos os metadados: OG, Twitter, JSON-LD, canônico |
safari_extract_images | Imagens com dimensões e informações de carregamento |
safari_extract_links | Links com detecção de rel, externo/nofollow |
Avançado (7)
| Ferramenta | Descrição |
|---|---|
safari_override_geolocation | Substituir geolocalização do navegador |
safari_list_indexed_dbs | Listar bancos de dados IndexedDB |
safari_get_indexed_db | Ler registros IndexedDB |
safari_css_coverage | Encontrar regras CSS não utilizadas |
safari_analyze_page | Análise completa da página em uma única chamada |
safari_doctor | Diagnosticar a cadeia de permissões + daemon do macOS (Apple Events, Accessibility, Screen Recording, codesign) com correções por falha |
safari_reload_extension | Recarregar a extensão Safari MCP Bridge sem alternância manual |
Automação (1)
| Ferramenta | Descrição |
|---|---|
safari_run_script | Executar múltiplas ações em uma única chamada (lote) |
Entrada Nativa — CGEvent (4)
| Ferramenta | Descrição |
|---|---|
safari_native_click | Clique de mouse em nível de SO (CGEvent, isTrusted: true) — contorna detecção WAF/bot quando safari_click está bloqueado (405/403) |
safari_native_hover | Passagem de cursor em nível de SO — aciona :hover/mouseenter reais para tooltips e UIs ofuscadas |
safari_native_type | Inserir texto via pipeline de colagem real — ProseMirror/Slate/Draft.js processam nativamente para que Submit envie dados reais |
safari_native_keyboard | Pressionamento de tecla em nível de SO + modificadores para o Safari, sem roubo de foco — alcança manipuladores protegidos por confiança do React (envio Discord/Slack) |
Validação iOS e WebKit (4)
| Ferramenta | Descrição |
|---|---|
safari_inspect_viewport | Validar a tag <meta name=viewport> para iOS Safari (device-width, zoom/WCAG, viewport-fit) |
safari_safe_area_insets | Ler valores ao vivo de safe-area-inset + uso de viewport-fit / env() (notch / Dynamic Island) |
safari_check_pwa | Auditar prontidão para "Adicionar à Tela Inicial" / PWA do iOS (apple-touch-icon, manifest, theme-color, splash) |
safari_webkit_compat | Verificar CSS da página contra este Safari via CSS.supports() — propriedades não suportadas, prefixos -webkit- ausentes, peculiaridades conhecidas |
Segurança
O Safari MCP roda localmente no seu Mac com superfície de ataque mínima:
| Aspecto | Detalhe |
|---|---|
| Rede | Sem conexões remotas — toda comunicação é local (stdio + localhost) |
| Permissões | Permissões de sistema macOS necessárias (Screen Recording para capturas de tela) |
| Dados | Sem telemetria, sem analytics, sem envio de dados para qualquer lugar |
| Extensão | Comunica apenas com as pontes de perfil locais (localhost:9224/9228/9232/9236), validadas pelo Safari |
| Código | Totalmente open source (MIT) — audite cada linha |
Safari MCP vs Alternativas
| Recurso | Safari MCP | Chrome DevTools MCP | Playwright MCP |
|---|---|---|---|
| CPU/Calor | 🟢 Mínimo | 🔴 Alto | 🟡 Médio |
| Seus logins | ✅ Sim | ✅ Sim | ❌ Não |
| Nativo macOS | ✅ WebKit | ❌ Chromium | ❌ Chromium/WebKit |
| Dependências do navegador | Nenhuma | Chrome + porta de depuração | Runtime Playwright |
| Ferramentas | 97 | ~30 | ~25 |
| Envio de arquivo | JS (sem diálogo) | CDP | API Playwright |
| Colagem de imagem | JS (sem área de transferência) | CDP | API Playwright |
| Roubo de foco | ❌ Em segundo plano | ❌ Em segundo plano | ❌ Headless |
| Simulação de rede | ✅ | ❌ | ✅ |
| Lighthouse | ❌ | ✅ | ❌ |
| Rastreamento de desempenho | ❌ | ✅ | ❌ |
Dica: Use o Safari MCP para tarefas diárias de navegação (95% do trabalho) e o Chrome DevTools MCP apenas para auditorias de Lighthouse/Desempenho.
vs Safari MCP Oficial da Apple (safaridriver)
Em julho de 2026, a Apple lançou um servidor Safari MCP oficial construído sobre safaridriver — primeiro no Safari Technology Preview 247, e agora também no beta do Safari 27. Isso é uma ótima validação para a categoria — e ele foi construído para um trabalho diferente. O servidor da Apple conduz uma sessão de automação WebDriver isolada para depuração; o safari-mcp conduz o Safari real no qual você já está logado.
Ele ainda não alcançou uma versão estável do Safari: no macOS 26.5.2 com Safari 26.5.2, safaridriver --help lista --port, --bidi, --enable e --diagnose, e nenhum --mcp (verificado em 2026-07-23). Verifique sua própria máquina com safaridriver --help | grep mcp antes de assumir qualquer coisa.
| 🦁 safari-mcp (este repositório) | Apple safaridriver --mcp | |
|---|---|---|
| Seus logins / cookies reais | ✅ Seu Safari real | ⚠️ Sessão de automação isolada — sem acesso ao AutoFill ou atividade de navegação |
| Roda em | ✅ Safari estável, todo Mac | ⚠️ Safari Technology Preview 247+ ou beta do Safari 27 — não no Safari 26.5 estável |
| Em segundo plano (sem roubo de foco) | ✅ Sim | ❌ Janela dedicada com banner "controlado por automação" |
| Ferramentas | 97 | ~17 |
| Armazenamento (cookies, localStorage, IndexedDB) | ✅ 10 ferramentas | ❌ |
| Simulação de rede + limitação | ✅ Sim | ❌ Inspeção de rede somente leitura |
| Emulação de dispositivo (iPhone, iPad) | ✅ Sim | ⚠️ Apenas viewport + tipo de mídia |
| Configuração | npx safari-mcp | Ative "automação remota e agentes externos", depois aponte seu cliente para o safaridriver --mcp dessa versão |
| Suporte oficial da Apple | ❌ Comunidade (MIT) | ✅ Apple, padrão WebDriver |
Quando o servidor da Apple é a escolha certa: você especificamente quer uma sessão limpa, padrão WebDriver, para depuração de compatibilidade e já roda uma versão preview ou beta. Para todo o resto — automação diária no navegador no qual você já está logado, no Safari que veio com seu Mac — o safari-mcp é construído exatamente para isso.
Por que Safari MCP e Não os Outros Projetos Safari MCP?
Existem vários projetos "safari-mcp" por aí. Veja como eles se comparam:
| Recurso | 🦁 safari-mcp (este repositório) | lxman/safari-mcp-server | Epistates/MCPSafari | HayoDev/safari-devtools-mcp |
|---|---|---|---|---|
| Ferramentas | 97 | ~10 | 23 | ~15 |
| Instalação | npx safari-mcp | Manual | Binário | npx |
| Mecanismo | Duplo (Extensão + AppleScript) | WebDriver | Somente extensão | Protocolo DevTools |
| Mantém seus logins reais do Safari | ✅ Sim | ⚠️ Limitado | ✅ Sim | ❌ Sessão de depuração |
| Em segundo plano (sem roubo de foco) | ✅ Sim | ❌ Não | ⚠️ Às vezes | ✅ Sim |
| Ferramentas de armazenamento (cookies, localStorage, IndexedDB) | 10 | 0 | 0 | 2 |
| Extração de dados (tabelas, metadados, imagens, links) | 4 | 0 | 0 | 0 |
| Simulação de rede | ✅ Sim | ❌ Não | ❌ Não | ❌ Não |
| Emulação de dispositivo (iPhone, iPad, Pixel) | ✅ Sim | ❌ Não | ❌ Não | ❌ Não |
| Envio de arquivo (sem diálogo) | ✅ JS DataTransfer | ❌ Não | ❌ Não | ❌ Não |
| Colagem de imagem (sem tocar na área de transferência) | ✅ Sim | ❌ Não | ❌ Não | ❌ Não |
| Exportação PDF | ✅ Sim | ❌ Não | ❌ Não | ❌ Não |
| Captura de console | 4 ferramentas | 0 | 1 | 1 |
| Métricas de desempenho + Web Vitals | ✅ Sim | ❌ Não | ❌ Não | ⚠️ Parcial |
| Manutenção ativa | ✅ Múltiplos lançamentos/semana | 🟡 Esporádica | 🟡 Lenta | 🟡 Lenta |
| Licença | MIT | MIT | Nenhuma especificada | MIT |
| No Registro MCP | ✅ | ❌ | ❌ | ✅ |
| No Awesome MCP | ✅ | ❌ | ❌ | ❌ |
Resumo — se você quer o Safari MCP mais completo com a instalação mais suave, o maior número de ferramentas e manutenção ativa, este é o escolhido.
Arquitetura
O Safari MCP usa uma arquitetura de mecanismo duplo — a Extensão é preferida por velocidade e capacidades avançadas, com AppleScript como fallback sempre disponível:
Claude/Cursor/AI Agent
↓ MCP Protocol (stdio)
Safari MCP Server (Node.js)
↓ ↓
Extension (HTTP) AppleScript + Swift daemon
(~5-20ms/cmd) (~5ms/cmd, always available)
↓ ↓
Content Script do JavaScript in tab N
↓ ↓
Page DOM ←←←←←←←←←← Page DOM
Decisões de design principais:
- Motor duplo com fallback automático — A extensão é preferida; se não estiver conectada, o AppleScript cuida de tudo de forma transparente
- Auxiliar Swift persistente — um processo de longa duração em vez de criar um por comando (16x mais rápido)
- Operações indexadas por aba — todo JS roda em uma aba específica por índice, nunca rouba o foco visual
- Abordagem JS-first — digitação, cliques, upload de arquivos usam eventos JavaScript (sem conflitos de teclado com System Events)
- Sem
activate— o Safari nunca é trazido para o primeiro plano
Extensão do Safari (Opcional)
A Extensão do Safari MCP é opcional, mas recomendada. Sem ela, ~80% da funcionalidade funciona apenas com AppleScript. A extensão adiciona capacidades que o AppleScript não consegue fornecer:
O que a Extensão Adiciona
| Capacidade | Com Extensão | Somente AppleScript |
|---|---|---|
| Shadow DOM fechado (Reddit, Web Components) | ✅ Acesso total | ❌ Invisível |
| Sites com CSP estrito | ✅ Ignora via mundo MAIN | ❌ Frequentemente bloqueado |
| Manipulação de estado React/Vue/Angular | ✅ Profunda (Fiber, ProseMirror) | ⚠️ Básica |
| Detecção de estado de carregamento (spinners, skeletons) | ✅ Detecção inteligente | ❌ Não |
| Tratamento de diálogos (alert/confirm) | ❌ | ✅ Somente AppleScript |
| Clique nativo no nível do SO (CGEvent) | ❌ | ✅ Somente AppleScript |
| Exportação de PDF | ❌ | ✅ Somente AppleScript |
Quando você precisa da extensão? Se você está automatizando SPAs modernos com shadow DOM fechado (ex.: Reddit), sites com Content Security Policy estrita, ou editores com muitos frameworks (Draft.js, ProseMirror, Slate).
Instalando a Extensão
A extensão requer uma compilação única com Xcode (gratuito, incluído no macOS).
Nota para usuários de npm: O diretório
xcode/não está incluído no pacote npm. Clone o repositório do GitHub para compilar a partir do código-fonte.
Pré-requisitos: Xcode (instale pela App Store — gratuito)
# 1. Clone the repo (the npm package does not include the Xcode project)
git clone https://github.com/achiya-automation/safari-mcp.git
cd safari-mcp
# 2. Build a clean, Apple Development-signed app
# If needed, first choose your Team in Xcode → Signing & Capabilities.
xcodebuild -project "xcode/Safari MCP/Safari MCP.xcodeproj" \
-scheme "Safari MCP (macOS)" -configuration Release \
-allowProvisioningUpdates clean build
# 3. Locate the signed app
APP_PATH=$(find ~/Library/Developer/Xcode/DerivedData/Safari_MCP-*/Build/Products/Release -name "Safari MCP.app" -maxdepth 2 | head -1)
# 4. Re-sign safari-helper with the Apple Events entitlement
# (helps macOS surface the TCC Automation prompt reliably)
codesign --sign - --force --entitlements safari-helper.entitlements safari-helper
# 5. Open the app (needed once so Safari registers the extension)
open "$APP_PATH"
Não faça re-assinatura ad-hoc do
Safari MCP.appcomcodesign --deep --sign -. Isso substitui a identidade de Desenvolvimento Apple no wrapper e na extensão incorporada; o Safari atual pode silenciosamente desativar ou marcar a extensão como removida. Se uma compilação anterior foi assinada ad-hoc, execute o comandoclean buildacima novamente.
Alternativamente, abra xcode/Safari MCP/Safari MCP.xcodeproj diretamente no Xcode, selecione seu Apple ID em Signing & Capabilities, e clique em Run. Uma conta pessoal gratuita de Desenvolvedor Apple é suficiente para uso local.
Depois, no Safari:
- Safari → Ajustes → Avançado → ative Mostrar recursos para desenvolvedores web
- Safari → Desenvolver → Permitir extensões não assinadas (necessário a cada reinício do Safari)
- Safari → Ajustes → Extensões → ative Safari MCP Bridge
A extensão conecta automaticamente ao primeiro bridge local cujo perfil do Safari declarado corresponde ao seu. As portas padrão do bridge são 9224, 9228, 9232 e 9236; uma configuração de perfil único normalmente usa 9224.
Nota: "Permitir extensões não assinadas" é redefinido toda vez que o Safari reinicia. Você precisará reativá-lo no menu Desenvolver após cada reinício. A extensão em si permanece instalada.
Status do ícone na barra de ferramentas:
- LIGADO — conectado ao servidor MCP
- DESLIGADO — desativado manualmente via popup
- (sem selo) — servidor não está rodando, reconectará automaticamente
Permissões do macOS
O Safari MCP precisa destas permissões únicas:
| Permissão | Onde | Por quê |
|---|---|---|
| JavaScript de Eventos Apple | Safari → menu Desenvolver | Necessário para do JavaScript |
| Automação → Safari | Ajustes do Sistema → Privacidade e Segurança → Automação | Necessário para todas as ferramentas baseadas em AppleScript |
| Gravação de Tela | Ajustes do Sistema → Privacidade e Segurança → Gravação de Tela | Necessário para safari_screenshot |
| Acessibilidade (safari-helper) | Ajustes do Sistema → Privacidade e Segurança → Acessibilidade | Necessário para safari_native_click, safari_native_keyboard, safari_native_hover e safari_save_pdf |
Concedendo Acessibilidade ao safari-helper (necessário para safari_native_*)
As ferramentas safari_native_click, safari_native_keyboard e safari_native_hover injetam eventos CGEvent no nível do SO no Safari sem roubar o foco. O macOS exige que o binário auxiliar subjacente seja aprovado em Acessibilidade antes que esses eventos possam alcançar uma janela não em primeiro plano.
- Abra Ajustes do Sistema → Privacidade e Segurança → Acessibilidade.
- Clique em
+(desbloqueie com sua senha se necessário). - Navegue até o binário auxiliar e adicione-o:
- Instalação global via npm:
$(npm root -g)/safari-mcp/safari-helper - Instalação via npx / projeto:
./node_modules/safari-mcp/safari-helper - A partir do clone do código-fonte:
/path/to/safari-mcp/safari-helper
- Instalação global via npm:
- Certifique-se de que o interruptor ao lado esteja LIGADO.
O script pós-instalação re-assina o auxiliar com um identificador estável (com.achiya-automation.safari-mcp) para que esta permissão sobreviva a futuras atualizações — sem essa etapa, cada npm update revogaria silenciosamente a aprovação porque o identificador assinado ad-hoc do binário muda a cada compilação.
Se safari_native_click relatar sucesso, mas a página não reagir (nenhum evento de clique isTrusted: true dispara), o auxiliar provavelmente está sem esta aprovação. As ferramentas safari_* (não-native_) não precisam dela.
Concedendo Automação → Safari (importante para usuários de IDE)
O TCC do macOS concede a permissão de Automação ao processo pai que inicia o servidor MCP, não ao safari-mcp em si. Portanto, você precisa conceder Automação → Safari ao aplicativo que executa Claude Code / Cursor / Windsurf — tipicamente Visual Studio Code ou Terminal.
Se o diálogo de permissão nunca aparecer automaticamente, execute este comando uma vez a partir de um Terminal que já tenha permissão de Automação:
osascript -e 'tell application "Safari" to get URL of current tab of window 1'
Essa chamada registra o aplicativo Terminal no banco de dados de Automação e então aciona o prompt para o Safari. Depois de aprovar, chamadas MCP subsequentes de qualquer cadeia de processos filhos funcionarão.
Solução de Problemas
| Problema | Correção |
|---|---|
| "Erro de AppleScript" | Ative "Permitir JavaScript de Eventos Apple" em Safari → Desenvolver |
| "Não autorizado a enviar eventos Apple para o Safari" | Conceda Automação → Safari ao seu IDE (veja acima) |
"Não autorizado" após npm update | Atualizações mudam o cdhash do binário — o macOS revoga silenciosamente a permissão de Automação. Execute novamente o one-liner osascript acima para re-conceder |
safari_native_click relata sucesso, mas a página não reage | Adicione safari-helper em Ajustes do Sistema → Privacidade e Segurança → Acessibilidade (veja Concedendo Acessibilidade acima). Confirme anexando um listener click com {capture:true} no console da página — sem a concessão, nenhum evento isTrusted: true dispara |
| Capturas de tela vazias | Conceda permissão de Gravação de Tela ao Terminal/VS Code |
| Aba não encontrada | Chame safari_list_tabs para atualizar os índices das abas |
| Problemas com teclado hebraico | Toda digitação usa eventos JS — imune ao layout do teclado |
| HTTPS bloqueado | safari_navigate tenta HTTPS primeiro automaticamente, com fallback para HTTP |
| Safari rouba o foco | Certifique-se de estar na versão mais recente — newTab restaura sua aba ativa |
Funciona Com
O Safari MCP funciona com qualquer cliente compatível com MCP:
| Cliente | Status |
|---|---|
| Claude Code | ✅ Testado diariamente |
| Claude Desktop | ✅ Testado |
| Cursor | ✅ Testado |
| Windsurf | ✅ Compatível |
| VS Code + Continue | ✅ Compatível |
Contribuindo
PRs são bem-vindos! Veja CONTRIBUTING.md para instruções de configuração.
O código-fonte são dois arquivos:
safari.js— camada de automação do Safari (AppleScript + JavaScript)index.js— servidor MCP com definições de ferramentas
Patrocinadores
O Safari MCP é gratuito e de código aberto. Se ele economiza seu tempo ou ciclos de CPU, considere apoiar seu desenvolvimento:
Seu apoio financia:
- 🧪 Testes em versões do macOS e lançamentos do Safari
- 🛠️ Novas ferramentas e recursos
- 📖 Documentação e exemplos
Torne-se o primeiro patrocinador!
Suporte Comercial
Precisa integrar o Safari MCP ao seu produto ou stack de agentes? Achiya Automation oferece:
- Correções de bugs prioritárias e desenvolvimento de ferramentas personalizadas para seu caso de uso
- Consultoria de integração — conectando o Safari MCP a sistemas de agentes de produção (Claude, Cursor, n8n, personalizados)
- Suporte a implantação privada — Safari MCP multiusuário, ambientes macOS não padrão, CI/CD
- Workshops de treinamento para equipes de engenharia adotando automação baseada em MCP
Construído pelo autor do Safari MCP. Inicie uma conversa →
O que os agentes desbloqueiam com o Safari MCP
Quando um agente de IA dirige o Safari MCP, ele obtém coisas que um navegador headless não consegue:
- Sessões autenticadas reais — Gmail, GitHub, Ahrefs, Slack, painéis bancários já estão todos logados
- Preenchimento de formulários ciente de frameworks —
safari_fill_and_submitchama setters React/Vue/Angular nativamente, sem adivinhar se eventosinputdispararam - Operação em segundo plano — o agente trabalha em paralelo enquanto você continua usando seu Mac
- Uma chamada MCP por fluxo de trabalho —
safari_run_scriptagrupa navegação + cliques + extração em uma única ida e volta
O padrão se mantém entre modelos: dirija o navegador que o humano já confia — você herda logins, cookies, extensões e o ambiente exato do usuário em um único passo.
Comunidade
Mais de 6.000 downloads mensais de npm — desenvolvedores estão construindo agentes de IA no macOS com o Safari MCP.
- Discussões no GitHub — faça perguntas, compartilhe casos de uso
- Issues — relatórios de bugs e pedidos de recursos
— comece a contribuir
Ecossistema
Outros servidores MCP para macOS que complementam o Safari MCP:
| Projeto | O que faz | Quando usar |
|---|---|---|
| mcp-server-macos-use | Automação macOS no nível do SO (acessibilidade, controle de tela) | Interações em todo o sistema além do Safari |
| chrome-devtools-mcp | Protocolo Chrome DevTools | Auditorias Lighthouse, rastreamentos de desempenho específicos do Chrome |
Usando Safari MCP junto com Chrome DevTools MCP? O Safari lida com 95% da navegação diária (zero overhead), o Chrome lida com os 5% que precisam de Lighthouse ou rastreamentos específicos do Chrome.
Gostou? Dê uma ⭐
Se o Safari MCP te salva do overhead do Chrome, uma estrela ajuda outros a descobrirem:
Compartilhe no Twitter/X · Compartilhe no LinkedIn · Escreva sobre isso
Listado Em
Licença
MIT — use como quiser.
Construído por Achiya Automation — automação e agentes de IA para negócios.