@diegosouzacdv/jev-browser-mcp 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1635,11 +1635,87 @@ proxies publicam exclusivamente a allowlist read-only e reaplicam sanitização
1635
1635
  Prompt Guard em cada resultado. Portanto, ferramentas novas ou mutantes que o
1636
1636
  21st venha a publicar não ficam automaticamente acessíveis ao executor.
1637
1637
 
1638
- Para testes de tela conduzidos por Jev e Playwright, inclusive a instalação do
1639
- MCP Node via GitHub em outros harnesses, consulte
1640
- [`docs/jev-browser-mcp.md`](docs/jev-browser-mcp.md). A escolha entre o browser
1641
- headless do harness e Chrome/Edge visível fica em `config/ui-testing.json`; a
1642
- chave do OpenRouter fica no ambiente do processo.
1638
+ ### MCP de navegador com Jev e Playwright
1639
+
1640
+ O pacote independente `@diegosouzacdv/jev-browser-mcp` conecta qualquer harness
1641
+ compatível com MCP por `stdio` ao Jev e ao Playwright. Requer Node.js 22 ou mais
1642
+ recente. Instale o navegador do Playwright uma vez para execuções no modo
1643
+ `harness`:
1644
+
1645
+ ```sh
1646
+ npx --yes @diegosouzacdv/jev-browser-mcp --install-browser
1647
+ ```
1648
+
1649
+ Registre o servidor MCP no formato aceito pelo seu harness. Exemplo de
1650
+ configuração comum:
1651
+
1652
+ ```json
1653
+ {
1654
+ "mcpServers": {
1655
+ "jev-browser": {
1656
+ "command": "npx",
1657
+ "args": ["--yes", "@diegosouzacdv/jev-browser-mcp"],
1658
+ "env": {
1659
+ "OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
1660
+ "JEV_BROWSER_MODE": "harness"
1661
+ }
1662
+ }
1663
+ }
1664
+ }
1665
+ ```
1666
+
1667
+ Configure `OPENROUTER_API_KEY` no secret manager ou no ambiente do processo
1668
+ que inicia o harness. Não coloque a chave no JSON. O endpoint e o modelo
1669
+ Decisions têm valores padrão no pacote; `JEV_PROVIDER_URL` e `JEV_MODEL` podem
1670
+ substituí-los.
1671
+
1672
+ Escolha o navegador por variáveis de ambiente:
1673
+
1674
+ - `JEV_BROWSER_MODE=harness` inicia um navegador isolado e sem interface,
1675
+ adequado para testes automatizados e CI.
1676
+ - `JEV_BROWSER_MODE=computer` abre o Chrome ou Edge instalado. O MCP usa um
1677
+ perfil persistente próprio; faça login nele uma vez. Não configure o perfil
1678
+ pessoal que já está aberto no computador.
1679
+ - `JEV_BROWSER_CHANNEL=chrome` ou `msedge` escolhe o navegador.
1680
+ - `JEV_BROWSER_PROFILE` define o caminho absoluto do perfil persistente no
1681
+ modo `computer`.
1682
+
1683
+ Para um fluxo conhecido, o agente do harness consulta o cenário e os critérios
1684
+ de aceitação no projeto e chama `run_browser_flow` uma vez. Informe o objetivo,
1685
+ a URL inicial, o resultado esperado e planos candidatos declarativos. O Jev
1686
+ escolhe um dos planos com base no snapshot acessível da página; o MCP executa
1687
+ os passos e confere se o resultado esperado apareceu. Exemplo resumido:
1688
+
1689
+ ```json
1690
+ {
1691
+ "flow": "Adicionar o produto ao carrinho",
1692
+ "initial_url": "http://127.0.0.1:4173/products/coffee",
1693
+ "expected_outcome": "Coffee added to cart",
1694
+ "candidate_plans": {
1695
+ "add_product": {
1696
+ "description": "Adicionar o produto visível ao carrinho",
1697
+ "steps": [
1698
+ {"action": "click", "role": "button", "name": "Add to cart"},
1699
+ {"action": "wait_for_text", "text": "Coffee added to cart"}
1700
+ ]
1701
+ }
1702
+ }
1703
+ }
1704
+ ```
1705
+
1706
+ O servidor também oferece `choose_next_action` para exploração passo a passo;
1707
+ esse modo exige chamadas separadas do harness e costuma ser mais lento. Os
1708
+ planos aceitam ações limitadas como clique por papel e nome acessível,
1709
+ preenchimento, espera por texto, rolagem e reação idempotente a um comentário
1710
+ único. Não aceitam JavaScript arbitrário, coordenadas nem seletores livres.
1711
+ Valores digitados ficam no Playwright e são removidos do conteúdo enviado ao
1712
+ Jev. Não coloque senhas, tokens ou outros segredos na descrição do fluxo ou
1713
+ nos critérios.
1714
+
1715
+ A resposta informa o status, o plano escolhido, as ações executadas, a captura
1716
+ final e se o resultado esperado foi confirmado. Consulte o [guia completo do
1717
+ MCP Jev Browser](docs/jev-browser-mcp.md) para schemas, limites, tempos e
1718
+ detalhes de segurança.
1643
1719
 
1644
1720
  O sidecar PostgreSQL de teste pode ser validado localmente com:
1645
1721
 
@@ -1,193 +0,0 @@
1
- # Automação de tela com Jev e Playwright
2
-
3
- ## Instalar em outros harnesses com npm/npx
4
-
5
- O repositório também contém um pacote Node independente do harness. Ele fala
6
- MCP por `stdio`, executa o Playwright no mesmo processo e pode ser iniciado por
7
- qualquer harness que aceite `command` e `args` para um servidor MCP. O pacote
8
- usa o mesmo `config/ui-testing.json` deste repositório; não precisa instalar o
9
- Python do orquestrador.
10
-
11
- Depois que a versão desejada estiver disponível no GitHub, configure o harness
12
- para iniciar o pacote pela referência Git. Use uma tag ou SHA publicado para
13
- fixar a versão:
14
-
15
- ```json
16
- {
17
- "mcpServers": {
18
- "jev-browser": {
19
- "command": "npx",
20
- "args": ["--yes", "github:diegosouzacdv/orquestrador#<tag-ou-sha>"],
21
- "env": {
22
- "OPENROUTER_API_KEY": "${OPENROUTER_API_KEY}",
23
- "JEV_BROWSER_MODE": "harness"
24
- }
25
- }
26
- }
27
- }
28
- ```
29
-
30
- O formato de interpolação de variáveis varia por harness. Injete a chave por
31
- um secret manager ou pelo ambiente do processo; não grave a chave no arquivo
32
- de configuração. Para instalar no projeto Node do próprio harness:
33
-
34
- ```sh
35
- npm install github:diegosouzacdv/orquestrador#<tag-ou-sha>
36
- npx jev-browser-mcp --install-browser
37
- ```
38
-
39
- No modo `harness`, a instalação baixa uma vez o Chrome/Edge que o Playwright
40
- controlará. No modo `computer`, o pacote abre o Chrome/Edge instalado e usa um
41
- perfil persistente exclusivo em `browser.computer_user_data_dir`; personalize
42
- as escolhas com `JEV_BROWSER_MODE`, `JEV_BROWSER_CHANNEL` e
43
- `JEV_BROWSER_PROFILE`. O browser permanece aquecido enquanto o processo MCP
44
- estiver ativo e fecha quando o harness encerra o processo. `JEV_PROVIDER_URL`
45
- e `JEV_MODEL` podem substituir os valores centrais; a credencial continua no
46
- nome de variável declarado em `jev.credential_env`.
47
-
48
- Uma aplicação Node também pode importar `createJevBrowserServer` por
49
- `@diegosouzacdv/jev-browser-mcp/server` e conectar o servidor ao transporte MCP
50
- que ela já utiliza.
51
-
52
- O pacote é montado pela raiz do repositório, mas o campo `files` do `package.json`
53
- inclui somente o código Node, a configuração compartilhada e esta documentação
54
- (além do README que o npm inclui automaticamente). Ele não publica o restante
55
- do orquestrador. A instalação por Git passa a ser possível quando a referência
56
- escolhida tiver sido enviada ao GitHub.
57
-
58
- ### Contrato do pacote
59
-
60
- O executável oferece `choose_next_action` e `run_browser_flow`, mantém uma
61
- sessão do browser por processo e reutiliza essa sessão entre chamadas. O plano
62
- passado ao Jev continua declarativo e limitado a clique por papel/nome
63
- acessível, preenchimento de texto, espera por texto, teclas de rolagem e
64
- reações idempotentes a um comentário único. Não aceita JavaScript, seletores
65
- livres nem coordenadas. Ele usa a biblioteca Playwright diretamente, sem iniciar
66
- um segundo servidor MCP do Playwright. O transporte MCP usa `stdio`; toda saída
67
- de diagnóstico vai para `stderr` para não misturar com JSON-RPC.
68
-
69
- O modo `computer` grava cookies no perfil exclusivo configurado, e conteúdo da
70
- página pode conter instruções maliciosas. O Jev recebe a captura acessível com
71
- uma instrução para tratar esse conteúdo como dado não confiável; não inclua
72
- segredos no fluxo, no resultado esperado ou nas descrições dos planos.
73
-
74
- Para um fluxo conhecido, o LLM do harness procura o cenário e os critérios de
75
- aceitação no projeto e chama `jev_browser.run_browser_flow` com planos
76
- candidatos declarativos. O MCP abre uma única sessão do Playwright, navega para
77
- a página inicial, captura o snapshot acessível e pede ao Jev que escolha um
78
- plano. Em seguida, executa o plano inteiro na mesma sessão e confere o
79
- resultado esperado na tela.
80
-
81
- Cada plano pode usar `click`, `type`, `wait_for_text`, teclas aprovadas de
82
- navegação/rolagem (`PageDown`, `PageUp`, `Home`, `End`, `ArrowDown`, `ArrowUp`)
83
- e as ações `like_comment` e `unlike_comment`. Cliques e entrada de texto usam
84
- papel e nome acessível exatos; as ações de reação localizam uma única linha pelo
85
- autor e texto, inspecionam os controles dentro dela e não clicam novamente
86
- quando já estão no estado pedido. O rótulo é comparado como palavra inteira
87
- para que `Curtir` não seja confundido com `Descurtir`. Não há JavaScript
88
- arbitrário, coordenadas ou seletores livres. Se um alvo estiver
89
- ausente ou ambíguo, o MCP interrompe o plano e devolve a última evidência para o
90
- harness decidir como continuar.
91
-
92
- Exemplo de chamada:
93
-
94
- ```json
95
- {
96
- "flow": "Adicionar o produto ao carrinho e confirmar o resumo",
97
- "initial_url": "http://127.0.0.1:4173/products/coffee",
98
- "expected_outcome": "Coffee added to cart",
99
- "candidate_plans": {
100
- "add_and_confirm": {
101
- "description": "Adicionar o produto visível ao carrinho e abrir o resumo",
102
- "steps": [
103
- {"action": "click", "role": "button", "name": "Add to cart"},
104
- {"action": "wait_for_text", "text": "Coffee added to cart"},
105
- {"action": "click", "role": "link", "name": "View cart"}
106
- ]
107
- }
108
- }
109
- }
110
- ```
111
-
112
- O plano é montado pelo LLM do harness, mas o Jev escolhe qual plano fornecido
113
- deve executar usando o fluxo e o snapshot inicial. O Jev não cria ações, nomes
114
- de controles ou valores de formulário. Valores de `type` são usados localmente
115
- pelo Playwright e são removidos do texto enviado ao provedor e da evidência de
116
- retorno. Use valores de teste; autenticação deve ficar no perfil de navegador
117
- configurado.
118
-
119
- O MCP também mantém `choose_next_action` para fluxos exploratórios em que o
120
- harness precisa inspecionar e decidir entre ações uma por vez. Esse caminho é
121
- mais lento porque exige uma nova decisão e uma nova chamada de ferramenta por
122
- ação; prefira `run_browser_flow` quando os passos esperados puderem ser
123
- descritos antes da execução.
124
-
125
- ## Configuração
126
-
127
- Edite `config/ui-testing.json`. O próprio arquivo declara URL e modelo do
128
- provedor, nome da variável de credencial e limites de entrada e resposta;
129
- preserve a estrutura completa exigida pelo validador.
130
-
131
- `browser.mode` aceita `harness` ou `computer`:
132
-
133
- - `harness` usa Chrome headless e perfil isolado, adequado a execuções do
134
- harness e CI; o estado de autenticação é descartado ao final da chamada.
135
- - `computer` abre o Chrome ou Edge instalado em modo visível e usa o diretório
136
- persistente `browser.computer_user_data_dir`, separado por navegador. Não
137
- reutiliza o perfil pessoal já aberto. Faça login uma vez nesse perfil; os
138
- cookies permanecem nele entre chamadas.
139
-
140
- `browser.max_flow_steps` limita a soma de passos declarados entre os planos e
141
- `browser.max_text_entry_chars` limita cada valor digitado. O resultado contém
142
- `status`, o plano escolhido, as ações executadas, a última captura acessível e
143
- se o critério esperado apareceu. `incomplete` significa que o fluxo não foi
144
- comprovado; confiança do Jev não substitui essa verificação.
145
-
146
- `harness_browser` e `computer_browser` aceitam `chrome` ou `msedge`.
147
- `computer_user_data_dir` deve ficar fora do repositório e conter `{browser}`;
148
- o diretório persistente armazena dados de login e é resolvido sob a pasta home
149
- do usuário quando começa com `~`. O Playwright MCP fica desabilitado até
150
- `ORQUESTRADOR_MCP_PLAYWRIGHT_ENABLED=1` ser configurado no ambiente do harness.
151
-
152
- Defina o valor secreto na variável indicada por `jev.credential_env`, usando o
153
- secret manager ou ambiente do processo que inicia o harness. Não grave a chave
154
- em `config/ui-testing.json`. `provider_url` é o endpoint HTTPS completo da API
155
- Decisions. O cliente não
156
- segue redirects e recusa URL com credencial, query string ou fragmento. O Jev
157
- fica indisponível quando a política de MCP está em modo offline.
158
-
159
- Na primeira execução, aqueça uma vez o cache local do pacote declarado em
160
- `browser.playwright_mcp_package` com `npx --yes <pacote> --help`. O MCP inicia
161
- depois com `--offline`, evitando uma consulta ao registry npm em cada fluxo.
162
- Quando a versão configurada mudar, aqueça o novo pacote uma vez.
163
-
164
- ## Desempenho e evidência
165
-
166
- O servidor Python `mcp_servers/jev_browser_server.py` usa uma decisão remota do
167
- Jev por fluxo. Inclua o fluxo
168
- completo em um plano candidato para evitar chamadas separadas ao harness; a
169
- seleção do plano, a navegação e a reação ao comentário ficam em uma chamada MCP.
170
- A sessão Playwright fecha antes de o MCP Python retornar. O perfil do modo
171
- `computer` preserva o login para chamadas seguintes; nesse servidor o processo
172
- e a janela não são reutilizados. O pacote Node mantém o browser aquecido até o
173
- harness encerrar o processo. O snapshot enviado ao Jev e
174
- devolvido ao harness remove o rodapé e, se ainda exceder o limite, mantém o
175
- início e o fim da captura com um marcador de truncamento.
176
-
177
- A chamada composta aquecida deve ficar dentro da meta de 20 segundos em páginas
178
- que respondem normalmente; a inicialização fria, páginas lentas, MFA e conteúdo
179
- sob demanda podem excedê-la. O MCP devolve `total_ms`, `browser_session_ms`,
180
- `navigation_ms`, `initial_snapshot_ms`, `jev_decision_ms` e `browser_plan_ms`
181
- para localizar o custo. O teto observado em um fluxo sintético local anterior
182
- foi 6,411 s; isso não mede o Instagram nem garante o mesmo tempo em outros sites.
183
-
184
- O snapshot inicial, o fluxo, o resultado esperado e as descrições dos planos
185
- são enviados ao endpoint Decisions. Os passos e valores de texto dos planos
186
- não são enviados. Não inclua segredos em `flow`, `expected_outcome` ou nas
187
- descrições. A resposta retorna o plano escolhido, custo/confiança do provedor
188
- quando disponíveis e o snapshot final sanitizado. O fluxo só passa quando o
189
- texto esperado aparece nesse snapshot.
190
-
191
- Consulte a [introdução do Jev](https://docs.typesafe.ai/introduction) e o
192
- [tutorial da API Decisions no OpenRouter](https://openrouter.ai/docs/guides/community/jev-tutorial)
193
- para os tipos de resposta e autenticação.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diegosouzacdv/jev-browser-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Portable MCP server for bounded Playwright screen flows selected by Jev",
5
5
  "license": "MIT",
6
6
  "repository": {