@diegosouzacdv/jev-browser-mcp 0.1.2 → 0.3.0
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 +95 -81
- package/config/ui-testing.json +37 -0
- package/docs/jev-browser-mcp.md +350 -192
- package/mcp_servers/jev-browser-npm/bin/jev-browser-mcp.cjs +4 -3
- package/mcp_servers/jev-browser-npm/src/accessibility.mjs +38 -0
- package/mcp_servers/jev-browser-npm/src/config.mjs +128 -15
- package/mcp_servers/jev-browser-npm/src/flow.mjs +888 -125
- package/mcp_servers/jev-browser-npm/src/server.mjs +5 -3
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1635,87 +1635,101 @@ 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
|
-
### 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
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
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
|
+
O contrato também oferece `select_option`, `hover`, teclas `Enter`/`Escape`/`Tab`,
|
|
1716
|
+
asserções por elemento (`assert_text`, `assert_value`, `assert_visible`,
|
|
1717
|
+
`assert_hidden`), escopo de alvo por `within` e índice zero-based com `index`,
|
|
1718
|
+
além de alvos nomeados em iframes. `upload_file` aceita inputs, botões que abrem
|
|
1719
|
+
o seletor nativo e dropzones; configure `JEV_BROWSER_UPLOAD_ROOT` para limitar
|
|
1720
|
+
os arquivos locais que o MCP pode ler. `click` com `expect_download: true`
|
|
1721
|
+
captura arquivos na pasta de artefatos dentro dos limites configurados, e
|
|
1722
|
+
`audit_accessibility` roda axe nas tags WCAG 2.0/2.1 A/AA. A análise automatizada
|
|
1723
|
+
não substitui auditoria manual. Um único plano usa o fast-path por padrão e não
|
|
1724
|
+
chama a API Decisions. `options` pode limitar o
|
|
1725
|
+
snapshot a `main` ou `dialog`, bloquear rastreadores, capturar erros de console
|
|
1726
|
+
e rede e salvar screenshot/trace local em falhas. Os caminhos e limites estão
|
|
1727
|
+
descritos no [guia completo](docs/jev-browser-mcp.md).
|
|
1728
|
+
|
|
1729
|
+
A resposta informa o status, o plano escolhido, as ações executadas, a captura
|
|
1730
|
+
final e se o resultado esperado foi confirmado. Consulte o [guia completo do
|
|
1731
|
+
MCP Jev Browser](docs/jev-browser-mcp.md) para schemas, limites, tempos e
|
|
1732
|
+
detalhes de segurança.
|
|
1719
1733
|
|
|
1720
1734
|
O sidecar PostgreSQL de teste pode ser validado localmente com:
|
|
1721
1735
|
|
package/config/ui-testing.json
CHANGED
|
@@ -19,5 +19,42 @@
|
|
|
19
19
|
"max_action_count": 32,
|
|
20
20
|
"max_action_description_chars": 300,
|
|
21
21
|
"max_response_bytes": 65536
|
|
22
|
+
},
|
|
23
|
+
"jev_browser_mcp": {
|
|
24
|
+
"browser": {
|
|
25
|
+
"max_action_timeout_seconds": 8,
|
|
26
|
+
"max_upload_files": 5,
|
|
27
|
+
"max_upload_path_chars": 4096,
|
|
28
|
+
"max_upload_file_bytes": 10485760,
|
|
29
|
+
"max_upload_total_bytes": 26214400,
|
|
30
|
+
"max_download_files": 5,
|
|
31
|
+
"max_download_file_bytes": 10485760,
|
|
32
|
+
"max_download_total_bytes": 26214400,
|
|
33
|
+
"max_download_timeout_seconds": 30,
|
|
34
|
+
"upload_root_env": "JEV_BROWSER_UPLOAD_ROOT",
|
|
35
|
+
"artifact_directory": "~/.cache/orquestrador/jev-browser-artifacts",
|
|
36
|
+
"artifact_directory_env": "JEV_BROWSER_ARTIFACT_DIR",
|
|
37
|
+
"max_frame_snapshots": 5,
|
|
38
|
+
"fast_path_single_plan_default": true,
|
|
39
|
+
"screenshot_on_failure_default": true,
|
|
40
|
+
"trace_on_failure_default": false,
|
|
41
|
+
"capture_console_errors_default": true,
|
|
42
|
+
"capture_network_errors_default": false,
|
|
43
|
+
"block_trackers_default": false,
|
|
44
|
+
"snapshot_scope_default": "body",
|
|
45
|
+
"tracker_host_suffixes": [
|
|
46
|
+
"google-analytics.com",
|
|
47
|
+
"googletagmanager.com",
|
|
48
|
+
"hotjar.com",
|
|
49
|
+
"fonts.googleapis.com",
|
|
50
|
+
"fonts.gstatic.com"
|
|
51
|
+
],
|
|
52
|
+
"blocked_resource_types": ["font", "media"]
|
|
53
|
+
},
|
|
54
|
+
"jev": {
|
|
55
|
+
"max_diagnostic_items": 50,
|
|
56
|
+
"max_diagnostic_chars": 500,
|
|
57
|
+
"max_accessibility_violations": 50
|
|
58
|
+
}
|
|
22
59
|
}
|
|
23
60
|
}
|