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 Server — 97 native browser automation tools for AI agents on macOS

🦁 Safari MCP

O navegador para o seu agente de codificação.

Seu Safari real, com login feito — sem Chrome, sem aquecimento, sem headless.

npm version npm downloads License: MIT macOS

Glama AAA MCP Registry Smithery MCP Score

Install in VS Code Install in VS Code Insiders Install in Cursor

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

Safari MCP Demo

❌ 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 safaridriver para 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çõesServidores MCPAdicionar 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égiaExemploMelhor para
Seletor CSS#login-btn, .submitElementos únicos
Texto visível"Sign In", "Submit"Botões, links
Coordenadasx: 100, y: 200Canvas, widgets personalizados
Ref do snapshotref: "e42"Qualquer elemento da árvore de acessibilidade

Dica: Comece com safari_snapshot para 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ávelPadrãoO que faz
SAFARI_MCP_HTTPdesligadoExecuta um daemon HTTP compartilhado em vez de um processo por cliente (veja acima).
SAFARI_MCP_HTTP_PORT9225Porta para esse daemon.
SAFARI_PROFILEdesdefinidoVincula sessões a um perfil Safari nomeado. Desdefinido = suas janelas normais.
SAFARI_MCP_RAISE_ON_NAVIGATEdesligadoPermite 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)

FerramentaDescrição
safari_navigateNavegar para URL (HTTPS automático, aguarda carregamento)
safari_go_backVoltar no histórico
safari_go_forwardAvançar no histórico
safari_reloadRecarregar página (recarga forçada opcional)

Leitura de Página (3)

FerramentaDescrição
safari_read_pageObter título, URL e conteúdo de texto
safari_get_sourceObter código-fonte HTML completo
safari_navigate_and_readNavegar + ler em uma única chamada

Clique e Interação (6)

FerramentaDescrição
safari_clickClicar por seletor CSS, texto visível ou coordenadas
safari_double_clickClique duplo (selecionar palavra, etc.)
safari_right_clickClique direito (menu de contexto)
safari_hoverPassar o mouse sobre o elemento
safari_click_and_waitClicar + aguardar navegação
safari_click_and_readClicar e retornar a página atualizada — economiza uma ida e volta (React Router + carregamentos completos)

Entrada de Formulário (11)

FerramentaDescrição
safari_fillPreencher entrada (compatível com React/Vue/Angular)
safari_clear_fieldLimpar campo de entrada
safari_select_optionSelecionar opção de menu suspenso
safari_fill_formPreencher vários campos em lote
safari_fill_and_submitPreencher formulário + enviar em uma única chamada
safari_type_textDigitar teclas reais (baseado em JS, sem System Events)
safari_press_keyPressionar tecla com modificadores
safari_react_select_setDefinir um valor react-select v5 via React fiber — ignora a interface do menu
safari_react_select_list_optionsListar as opções de um menu suspenso react-select v5 sem abri-lo
safari_replace_editorSubstituir todo o conteúdo em um editor de código (Monaco, CodeMirror, Ace, ProseMirror)
safari_verify_stateVerificar 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)

FerramentaDescrição
safari_screenshotCaptura de tela como PNG (viewport ou página inteira)
safari_screenshot_elementCaptura de tela de um elemento específico
safari_save_pdfExportar página como PDF

Scroll (3)

FerramentaDescrição
safari_scrollRolar para cima/baixo por pixels
safari_scroll_toRolar para posição exata
safari_scroll_to_elementRolagem suave até o elemento

Gerenciamento de Abas (5)

FerramentaDescrição
safari_list_tabsListar todas as abas (índice, título, URL)
safari_new_tabAbrir nova aba (em segundo plano, sem roubo de foco)
safari_close_tabFechar aba
safari_switch_tabAlternar para aba por índice
safari_wait_for_new_tabAguardar nova aba (ex.: popup OAuth) e alternar automaticamente para ela

Espera (2)

FerramentaDescrição
safari_wait_forAguardar elemento, texto ou mudança de URL
safari_waitAguardar milissegundos especificados

JavaScript (1)

FerramentaDescrição
safari_evaluateExecutar JavaScript arbitrário, retornar resultado
safari_eval_fileExecutar JavaScript lido de um caminho de arquivo (evita scripts inline enormes)

Inspeção de Elementos (4)

FerramentaDescrição
safari_get_elementDetalhes do elemento (tag, retângulo, atributos, visibilidade)
safari_query_allEncontrar todos os elementos correspondentes
safari_get_computed_styleEstilos CSS calculados
safari_detect_formsDetectar automaticamente todos os formulários com seletores de campos

Acessibilidade (2)

FerramentaDescriçã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)

FerramentaDescrição
safari_dragArrastar entre elementos ou coordenadas

Operações de Arquivo (2)

FerramentaDescrição
safari_upload_fileEnviar arquivo via JS DataTransfer (sem diálogo de arquivo!)
safari_paste_imageColar imagem no editor (sem tocar na área de transferência!)

Diálogo e Janela (2)

FerramentaDescrição
safari_handle_dialogLidar com alert/confirm/prompt
safari_resizeRedimensionar janela do navegador

Emulação de Dispositivo (2)

FerramentaDescrição
safari_emulateEmular dispositivo (iPhone, iPad, Pixel, Galaxy)
safari_reset_emulationRedefinir para desktop

Cookies e Armazenamento (11)

FerramentaDescrição
safari_get_cookiesObter todos os cookies
safari_set_cookieDefinir cookie com todas as opções
safari_delete_cookiesExcluir um ou todos os cookies
safari_local_storageLer localStorage
safari_set_local_storageEscrever localStorage
safari_delete_local_storageExcluir/limpar localStorage
safari_session_storageLer sessionStorage
safari_set_session_storageEscrever sessionStorage
safari_delete_session_storageExcluir/limpar sessionStorage
safari_export_storageExportar todo o armazenamento como JSON (backup/restauração de sessões)
safari_import_storageImportar estado de armazenamento de JSON

Área de Transferência (2)

FerramentaDescrição
safari_clipboard_readLer texto da área de transferência
safari_clipboard_writeEscrever texto na área de transferência

Rede (6)

FerramentaDescrição
safari_networkRequisições de rede rápidas via Performance API
safari_start_network_captureIniciar captura detalhada (fetch + XHR)
safari_network_detailsObter requisições capturadas com cabeçalhos/tempos
safari_clear_networkLimpar requisições capturadas
safari_mock_routeSimular respostas de rede (interceptar fetch/XHR)
safari_clear_mocksRemover todas as simulações de rede

Console (4)

FerramentaDescrição
safari_start_consoleIniciar captura de mensagens do console
safari_get_consoleObter todas as mensagens capturadas
safari_clear_consoleLimpar mensagens capturadas
safari_console_filterFiltrar por nível (log/warn/error)

Desempenho (2)

FerramentaDescrição
safari_performance_metricsTempos de navegação, Web Vitals, memória
safari_throttle_networkSimular slow-3g/fast-3g/4g/offline

Extração de Dados (4)

FerramentaDescrição
safari_extract_tablesTabelas como JSON estruturado
safari_extract_metaTodos os metadados: OG, Twitter, JSON-LD, canônico
safari_extract_imagesImagens com dimensões e informações de carregamento
safari_extract_linksLinks com detecção de rel, externo/nofollow

Avançado (7)

FerramentaDescrição
safari_override_geolocationSubstituir geolocalização do navegador
safari_list_indexed_dbsListar bancos de dados IndexedDB
safari_get_indexed_dbLer registros IndexedDB
safari_css_coverageEncontrar regras CSS não utilizadas
safari_analyze_pageAnálise completa da página em uma única chamada
safari_doctorDiagnosticar a cadeia de permissões + daemon do macOS (Apple Events, Accessibility, Screen Recording, codesign) com correções por falha
safari_reload_extensionRecarregar a extensão Safari MCP Bridge sem alternância manual

Automação (1)

FerramentaDescrição
safari_run_scriptExecutar múltiplas ações em uma única chamada (lote)

Entrada Nativa — CGEvent (4)

FerramentaDescrição
safari_native_clickClique de mouse em nível de SO (CGEvent, isTrusted: true) — contorna detecção WAF/bot quando safari_click está bloqueado (405/403)
safari_native_hoverPassagem de cursor em nível de SO — aciona :hover/mouseenter reais para tooltips e UIs ofuscadas
safari_native_typeInserir texto via pipeline de colagem real — ProseMirror/Slate/Draft.js processam nativamente para que Submit envie dados reais
safari_native_keyboardPressionamento 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)

FerramentaDescrição
safari_inspect_viewportValidar a tag <meta name=viewport> para iOS Safari (device-width, zoom/WCAG, viewport-fit)
safari_safe_area_insetsLer valores ao vivo de safe-area-inset + uso de viewport-fit / env() (notch / Dynamic Island)
safari_check_pwaAuditar prontidão para "Adicionar à Tela Inicial" / PWA do iOS (apple-touch-icon, manifest, theme-color, splash)
safari_webkit_compatVerificar 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:

AspectoDetalhe
RedeSem conexões remotas — toda comunicação é local (stdio + localhost)
PermissõesPermissões de sistema macOS necessárias (Screen Recording para capturas de tela)
DadosSem telemetria, sem analytics, sem envio de dados para qualquer lugar
ExtensãoComunica apenas com as pontes de perfil locais (localhost:9224/9228/9232/9236), validadas pelo Safari
CódigoTotalmente open source (MIT) — audite cada linha

Safari MCP vs Alternativas

RecursoSafari MCPChrome DevTools MCPPlaywright MCP
CPU/Calor🟢 Mínimo🔴 Alto🟡 Médio
Seus logins✅ Sim✅ Sim❌ Não
Nativo macOS✅ WebKit❌ Chromium❌ Chromium/WebKit
Dependências do navegadorNenhumaChrome + porta de depuraçãoRuntime Playwright
Ferramentas97~30~25
Envio de arquivoJS (sem diálogo)CDPAPI Playwright
Colagem de imagemJS (sem área de transferência)CDPAPI 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"
Ferramentas97~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çãonpx safari-mcpAtive "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-serverEpistates/MCPSafariHayoDev/safari-devtools-mcp
Ferramentas97~1023~15
Instalaçãonpx safari-mcpManualBinárionpx
MecanismoDuplo (Extensão + AppleScript)WebDriverSomente extensãoProtocolo 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)10002
Extração de dados (tabelas, metadados, imagens, links)4000
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 console4 ferramentas011
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çaMITMITNenhuma especificadaMIT
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

CapacidadeCom ExtensãoSomente 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.app com codesign --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 comando clean build acima 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:

  1. Safari → Ajustes → Avançado → ative Mostrar recursos para desenvolvedores web
  2. Safari → Desenvolver → Permitir extensões não assinadas (necessário a cada reinício do Safari)
  3. 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ãoOndePor quê
JavaScript de Eventos AppleSafari → menu DesenvolverNecessário para do JavaScript
Automação → SafariAjustes do Sistema → Privacidade e Segurança → AutomaçãoNecessário para todas as ferramentas baseadas em AppleScript
Gravação de TelaAjustes do Sistema → Privacidade e Segurança → Gravação de TelaNecessário para safari_screenshot
Acessibilidade (safari-helper)Ajustes do Sistema → Privacidade e Segurança → AcessibilidadeNecessá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.

  1. Abra Ajustes do Sistema → Privacidade e Segurança → Acessibilidade.
  2. Clique em + (desbloqueie com sua senha se necessário).
  3. 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
  4. 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

ProblemaCorreçã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 updateAtualizaçõ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 reageAdicione 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 vaziasConceda permissão de Gravação de Tela ao Terminal/VS Code
Aba não encontradaChame safari_list_tabs para atualizar os índices das abas
Problemas com teclado hebraicoToda digitação usa eventos JS — imune ao layout do teclado
HTTPS bloqueadosafari_navigate tenta HTTPS primeiro automaticamente, com fallback para HTTP
Safari rouba o focoCertifique-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:

ClienteStatus
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:

Sponsor via PayPal

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 frameworkssafari_fill_and_submit chama setters React/Vue/Angular nativamente, sem adivinhar se eventos input dispararam
  • Operação em segundo plano — o agente trabalha em paralelo enquanto você continua usando seu Mac
  • Uma chamada MCP por fluxo de trabalhosafari_run_script agrupa 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
  • Good First Issues — comece a contribuir

Ecossistema

Outros servidores MCP para macOS que complementam o Safari MCP:

ProjetoO que fazQuando usar
mcp-server-macos-useAutomação macOS no nível do SO (acessibilidade, controle de tela)Interações em todo o sistema além do Safari
chrome-devtools-mcpProtocolo Chrome DevToolsAuditorias 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:

Star this repo

Compartilhe no Twitter/X · Compartilhe no LinkedIn · Escreva sobre isso

Star History Chart


Listado Em

Glama MCP Registry MCP Scoreboard CI


Licença

MIT — use como quiser.


Construído por Achiya Automation — automação e agentes de IA para negócios.