AI Browser
README.md
# AI Browser Agent
Extensão de Chrome + servidor MCP local que deixam o **Claude Code** e o **Codex** (ou
qualquer cliente MCP por stdio) controlarem o seu Chrome de verdade, com as suas contas
logadas, sem Playwright.
```
Claude Code / Codex ──MCP (stdio)──► servidor local (Node) ──WebSocket 127.0.0.1──► extensão ──► páginas
```
## Aviso de segurança
- A IA age na sua sessão real: e-mail, banco, redes sociais, tudo em que você está logado.
- A extensão começa **desligada**. Ligue pelo popup só quando for usar, e desligue depois.
Desligada, ela recusa todos os comandos.
- Coloque na **lista de domínios bloqueados** (Opções) os sites em que a IA nunca deve
mexer, como o do seu banco. Vale para o domínio e todos os subdomínios.
- Enquanto a IA clica ou digita, o Chrome mostra a faixa "AI Browser Agent começou a depurar
este navegador". É esperado: as ações usam `chrome.debugger` para virar entrada real de
mouse e teclado.
- Só a extensão com o ID fixo deste projeto e com o token de pareamento consegue se conectar
ao servidor. Páginas web não conseguem.
- Exceção: a escolha de opção em `<select>` é feita por script (o evento `change` não tem
`isTrusted`). Cliques, digitação, checkbox e radio são entrada real.
- O `read_page` nunca devolve o conteúdo de campos de senha: um campo preenchido aparece
como `••••`.
- Diálogos JavaScript abertos por uma ação são fechados na hora: `alert` com OK, e
`confirm`, `prompt` e "sair da página" com Cancelar. A IA nunca concorda com nada em seu
nome, e o resultado da ação informa quais diálogos apareceram.
## Requisitos
- Node.js 24 ou mais novo
- Google Chrome 116 ou mais novo
## Instalação
```sh
npm install
npm run build
```
No Chrome, abra `chrome://extensions`, ligue o **Modo do desenvolvedor**, clique em
**Carregar sem compactação** e escolha a pasta `dist/extension`.
O ID da extensão é sempre `cjnpnhbdjkkhlkncmmknhdgcgkocdfea`, em qualquer máquina.
## Configurar no Claude Code
```sh
claude mcp add ai-browser -- node "C:/caminho/absoluto/ai-browser-agent/dist/server/index.js"
```
Use `--scope user` para valer em todos os projetos.
## Configurar no Codex
Em `~/.codex/config.toml` (no Windows, `%USERPROFILE%\.codex\config.toml`):
```toml
[mcp_servers.ai-browser]
command = "node"
args = ["C:/caminho/absoluto/ai-browser-agent/dist/server/index.js"]
```
Os dois podem rodar ao mesmo tempo: o primeiro servidor fica com a porta e o segundo
repassa os comandos para ele. Se o primeiro fechar, o segundo assume.
## Parear
1. Abra o Claude Code ou o Codex uma vez com o MCP configurado. O servidor cria o token em
`~/.ai-browser-agent/token` (no Windows, `%USERPROFILE%\.ai-browser-agent\token`).
2. Clique com o botão direito no ícone da extensão → **Opções**. Cole o token e clique em
**Salvar token**.
3. Abra o popup e clique na chave para **ligar**. O ícone mostra:
- nada: desligada;
- `ON` em âmbar: ligada e conectada;
- `!` em vermelho: ligada, mas sem servidor (abra o Claude Code ou o Codex).
## Porta
A porta padrão é `8765`. Para mudar, defina `AI_BROWSER_PORT` no ambiente do servidor e
coloque o mesmo número em Opções → Porta. Exemplo no Codex:
```toml
[mcp_servers.ai-browser]
command = "node"
args = ["C:/caminho/absoluto/ai-browser-agent/dist/server/index.js"]
env = { AI_BROWSER_PORT = "9876" }
```
`AI_BROWSER_HOME` muda a pasta do token (padrão `~/.ai-browser-agent`).
## Ferramentas
| Ferramenta | O que faz |
|---|---|
| `read_page` | URL, título, texto visível e lista numerada dos elementos interativos |
| `click` | clica no elemento pelo número |
| `type` | digita num campo (`clear` padrão `true`, `submit` aperta Enter) |
| `fill_form` | preenche vários campos de uma vez (texto, select, checkbox, radio) |
| `navigate` | abre URL ou `back` / `forward` / `reload`, espera carregar (até 30 s) |
| `list_tabs` | lista as abas (id, título, URL, ativa, janela) |
| `switch_tab` | ativa uma aba |
| `new_tab` | abre aba nova, opcionalmente numa URL |
| `close_tab` | fecha uma aba |
| `screenshot` | PNG da área visível da aba |
Sem `tabId`, as ferramentas usam a aba ativa da janela em foco. Os números de `read_page`
valem até a próxima leitura ou navegação daquela aba. URLs sem esquema (`google.com`) ganham
`https://`. O `screenshot` de uma aba em segundo plano ativa essa aba antes de capturar,
porque aba oculta não é desenhada.
## Códigos de erro
| Código | Significado | O que fazer |
|---|---|---|
| `[NOT_CONNECTED]` | extensão não conectada | abra o Chrome, confira o pareamento |
| `[EXTENSION_OFF]` | extensão desligada | ligue no popup |
| `[DOMAIN_BLOCKED]` | site na lista de bloqueio | a IA não deve usar esse site |
| `[ELEMENT_NOT_FOUND]` | número de elemento velho | chame `read_page` de novo |
| `[TAB_NOT_FOUND]` | aba não existe | chame `list_tabs` |
| `[TIMEOUT]` | passou do tempo limite | tente de novo |
| `[UNSUPPORTED_PAGE]` | página onde o Chrome não deixa extensões agirem | use outra página |
## Solução de problemas
- **Popup diz "Servidor não encontrado"**: o servidor só roda enquanto o Claude Code ou o
Codex estiver aberto. Confira também se a porta em Opções é a mesma do servidor.
- **"Token recusado"**: o token mudou (por exemplo, você apagou `~/.ai-browser-agent`).
Copie o novo de lá e salve em Opções.
- **Não lê páginas `chrome://` nem a Chrome Web Store**: o Chrome bloqueia extensões nelas.
- **Iframes de outro site e shadow DOM fechado** não aparecem no `read_page` nesta versão.
## Desenvolvimento
```sh
npm test # testes de unidade
npm run build # gera dist/ e checa tipos
npm run e2e # teste ponta a ponta com Chrome for Testing
```
O e2e precisa do Chrome for Testing: `npx puppeteer browsers install chrome`. Ele usa a
porta `18765` e uma pasta temporária, sem tocar no seu token nem na porta `8765`.
## Licença
[MIT](LICENSE)
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues