Argus Testing
MCP de QA autônomo que testa aplicativos web e macOS como um engenheiro real e verifica cada bug.
Documentação
Argus
Um servidor MCP que testa aplicativos como um engenheiro de testes de verdade—explorando jornadas de usuário, descobrindo bugs não roteirizados e provando cada achado antes de reportá-lo.
Argus é um servidor MCP. Ele adiciona QA de navegador com foco em evidências ao Claude Code, Codex, Cursor ou qualquer host MCP, sem assumir a identidade do agente host ou a tarefa de codificação mais ampla. O agente explora, inspeciona, verifica persistência e registra bugs reproduzíveis. Cada achado certificado é reconfirmado de forma independente a partir de um carregamento limpo da página antes de ser reportado.
Product page · Quick start · Why Argus · Compared · Tools · Benchmarks
A saída
Dê uma URL; receba um relatório de bugs — cada um marcado se o Argus reproduziu independentemente ou apenas observou:
O selo verde é o ponto principal. Qualquer um pode fazer um LLM afirmar um bug. O Argus recarrega a página do zero e re-verifica o sintoma antes de dizer VERIFICADO — então o relatório é uma lista de bugs em que você pode confiar, não uma lista de suposições para triagem.
Como funciona
flowchart LR
A(["observe"]) --> B{"looks wrong?"}
B -->|not sure| C["act: click · type · resize · verify"]
C --> A
B -->|bug| D["verify_persistence — reload from a clean state"]
D -->|symptom repeats| E(["VERIFIED"])
D -->|symptom gone| F(["dropped — no false positive"])
E --> G[["report: HTML · JSON · JUnit · SARIF"]]
O agente é a inteligência. O Argus fornece orientação concisa de QA, uma superfície de ferramentas baseada em descrições (click_what("Login button"), não click(7)), um registro de cobertura de metas e um mecanismo de recibo de reprodução que transforma "o modelo acha que isso é um bug" em "este bug é real, aqui está a prova".
Início rápido
Com o uv instalado, não é necessária a instalação de pacote Python global. Instale o Chromium uma vez:
uvx --from playwright playwright install chromium
Depois conecte o Argus ao seu cliente MCP.
Claude Code
claude mcp add argus -- uvx --from argus-testing argus-mcp
Codex e o aplicativo de desktop do ChatGPT
Codex CLI, a extensão Codex IDE e o aplicativo de desktop do ChatGPT compartilham a mesma configuração MCP local:
codex mcp add argus -- uvx --from argus-testing argus-mcp
Cursor
O botão adiciona o Argus ao Cursor; execute o comando de instalação do Chromium acima uma vez antes do primeiro teste.
Qualquer cliente MCP stdio
{
"mcpServers": {
"argus": {
"command": "uvx",
"args": ["--from", "argus-testing", "argus-mcp"]
}
}
}
O perfil padrão core expõe o fluxo de trabalho principal de teste web sem inundar o host com todas as ferramentas especializadas. Use uvx --from argus-testing argus-mcp --list-tools para inspecionar o perfil selecionado, --tool-profile screen para testes nativos no macOS, ou --tool-profile full para toda a superfície avançada. ARGUS_TOOL_PROFILE fornece a mesma configuração através do ambiente.
Então basta perguntar, na sua sessão de agente:
"Teste meu aplicativo em http://localhost:3000 — encontre bugs reais."
É isso. O agente dirige; o Argus o mantém honesto e escreve o relatório.
Para uma revisão escopada, o host pode dar ao start_session explícitos goals, constraints e um time_budget_minutes consultivo. O Argus retorna o protocolo de teste completo uma vez e mantém metas pendentes e páginas descobertas visíveis em observações posteriores. Marque uma meta in_progress antes de sua jornada; quando coverage_update a marca como exercised ou blocked, o Argus exige uma explicação concreta e vincula automaticamente as URLs, ações com valores redigidos, capturas de tela, verificações de persistência, bugs e observações produzidas nessa janela de teste. Os relatórios finais em HTML e JSON preservam tanto a cobertura concluída quanto a incompleta, em vez de sugerir que uma passagem incompleta foi abrangente.
instalação via pip
pip install argus-testing
playwright install chromium
claude mcp add argus -- argus-mcp
Modo CLI (sem host MCP — traga seu próprio LLM)
# Uses a LiteLLM-backed planner. Set a provider key (OPENAI_API_KEY, DEEPSEEK_API_KEY, …).
uvx --from argus-testing argus http://localhost:3000 --model deepseek/deepseek-chat
# Higher recall: union N independent passes (deduped, proven instance kept)
uvx --from argus-testing argus http://localhost:3000 --passes 3
Modo tela (macOS) — teste qualquer aplicativo nativo, não apenas a web
pip install 'argus-testing[mac]'
brew install cliclick # keystroke / coordinate fallback
argus-mcp --doctor # check Screen Recording + Accessibility grants
claude mcp add argus-screen -- argus-mcp --tool-profile screen
Mesmas ferramentas baseadas em descrição, mas o alvo é qualquer aplicativo em primeiro plano no macOS — Notes, Cursor, Safari, seu recurso em andamento. Sem Chrome headless, sem Playwright roteirizado. O Argus vê o que você vê, através da árvore de Acessibilidade.
Limites de artefatos e recursos
O Argus grava as capturas de tela de cada execução em seu próprio diretório de execução para que testes posteriores não possam sobrescrever evidências anteriores. Sessões longas de navegador também mantêm logs de eventos em memória limitados e só leem corpos de resposta para tráfego de API inspecionável; corpos binários e superdimensionados são ignorados antes de entrar na memória do Python.
A limpeza de relatórios é explícita e com dry-run por padrão. As 20 execuções completas mais recentes são protegidas neste exemplo; .argus diários e cápsulas de estado nunca são excluídos:
argus-cleanup --output ./argus-reports --keep-runs 20
argus-cleanup --output ./argus-reports --keep-runs 20 --apply
Use --older-than-days e --max-size-mb para políticas mais rígidas. Limites avançados podem ser ajustados com ARGUS_MAX_NETWORK_EVENTS, ARGUS_MAX_ERROR_EVENTS, ARGUS_MAX_DOWNLOAD_EVENTS, ARGUS_MAX_DIALOG_EVENTS, ARGUS_MAX_RESPONSE_BODY_BYTES e ARGUS_MAX_RESPONSE_READ_BYTES. Respostas sem comprimento declarado são ignoradas por padrão; ARGUS_CAPTURE_UNKNOWN_LENGTH_BODY=1 opta por lê-las. Quando um limite descarta evidências antigas, o Argus informa isso na saída da ferramenta e no resumo final da sessão.
Por que o Argus é diferente
As ferramentas de teste existentes só testam o que você roteiriza. Playwright e Cypress executam as asserções que você escreveu. O Argus descobre bugs que você não pensou em testar — e depois faz o que um LLM sozinho não pode ser confiável para fazer: prova-os.
| Autônomo e caixa-preta | Você dá uma URL, não um plano de teste. Ele explora como um usuário real — sem acesso ao repositório, sem passos roteirizados. |
| Contrato de cobertura | Metas opcionais em linguagem natural, restrições de usuário, páginas descobertas e orçamento de tempo permanecem visíveis durante toda a sessão e no relatório final. |
| Recibos de reprodução | Antes de certificar um bug, ele recarrega a página a partir de um estado limpo e re-confirma o sintoma. Projetado para zero falsas certificações. |
| Encontra bugs de olho humano | Escassez falsa "Só restam 3!", um toast "Salvo" que não salva, um selo de promoção onde o preço não caiu, uma barra de navegação desatualizada após uma renomeação. Análise estática não pega nenhum desses. |
| Descobrir → proteger | Achados são registrados; argus-regression os re-verifica em cada build com custo zero de LLM e saída não-zero — um portão de CI real contra bugs conhecidos voltarem. |
| Legível por máquina | Cada relatório também emite JSON, JUnit e SARIF — para que os achados bloqueiem um pipeline e apareçam como anotações inline de PR no GitHub. |
Como se compara
No eixo que importa para encontrar bugs — descobrir autonomamente, verificar independentemente e reportar — o Argus ocupa um espaço diferente da multidão de browser-MCP:
| Argus | Playwright MCP | Chrome DevTools MCP | browser-use | |
|---|---|---|---|---|
| Descobre autonomamente bugs desconhecidos | Sim | Não (driver) | Não (depurador) | Parcial (escopo de tarefa) |
| Verifica independentemente cada achado | Sim (recibo) | Não | Não | Não (pontuação LLM) |
| Relatório de bug rico em evidências | Sim | Não | Não | Parcial |
| Caixa-preta (sem acesso a repo / código-fonte) | Sim | Sim | Sim | Sim |
| Portão de regressão CI com zero LLM | Sim | Parcial | Não | Parcial |
Essas não são ferramentas "piores" — são um trabalho diferente. O Playwright MCP dá ao agente excelentes mãos; o Chrome DevTools MCP dá a ele inspeção profunda de rede/desempenho/memória que o Argus não tem. O Argus é a camada que decide o que é um bug e o prova. Use-os juntos.
Benchmarks
$ python -m argus.bench --target all
buggytasks 22 / 22 = 100 % · mechanical bugs (console errors, fake delete, auth bypass…)
darkshop 12 / 12 = 100 % · human-eye bugs (fake scarcity, lying toasts, stale state…)
──────────────────────────────────────────────────────────────────────
total 34 / 34 = 100 % · reproducible from git clone in two commands
34 / 34 é o teto de capacidade — o que é encontrável através da superfície da ferramenta, medido por scripts determinísticos. É deliberadamente separado de com que frequência um dado LLM se lembra de usar bem as ferramentas, que é ruidoso e honestamente reportado abaixo.
Recall de LLM real — o número honesto (e por que reportamos a dispersão)
python -m argus.bench.agent_runner coloca um modelo real no assento do motorista e pontua o recall em tentativas. O que aprendemos ao executá-lo:
- O recall real fica bem abaixo do teto
34/34. Um driver ao vivo encontra uma fração dos bugs semeados por passada — o teto é o que é encontrável, isto é o que um modelo encontra. - A variância é grande — nunca classifique modelos com poucas execuções. O recall por tentativa varia amplamente; reportamos a dispersão, não um único número herói.
- Usar o benchmark em nós mesmos encontrou bugs reais no próprio Argus — um crash
record_bugem um argumento de string que silenciosamente descartava achados, erros de resolução em frases comuns. A ferramenta que testa ferramentas foi testada. - A precisão se mantém independentemente do driver. Em todas as tentativas, o recibo de reprodução manteve falsas certificações em zero — um modelo fraco encontra menos bugs, mas os marcados como VERIFICADOS ainda são reais.
O que os fixtures semeiam
BuggyTasks (:5555) — 22 bugs mecânicos em um aplicativo de tarefas: erros de console, links mortos, exclusão falsa (a UI diz "excluído!" mas os dados persistem ao atualizar), bypass de autenticação, datas NaN, contagens com erro de off-by-one, condições de corrida. O nível "E2E roteirizado poderia encontrar esses".
DarkShop (:5556) — 12 bugs de olho humano em uma loja de aparência polida: escassez "Só restam 3!" codificada, selos -50% onde o preço de venda é igual ao original, um banner "frete grátis acima de $50" contradito por um $5 fixo no checkout, hierarquia visual invertida ("Adicionar ao carrinho" rebaixado sob um "Assinar" proeminente), deriva de estado entre páginas (renomeação persiste em /account, saudação da barra de navegação não). Análise estática não pega aproximadamente nenhum desses — eles exigem um agente que leia a página e raciocine.
python test-site/app.py # BuggyTasks :5555
python human-eye-fixture/app.py # DarkShop :5556
python -m argus.bench --target all
Superfície de ferramentas
argus-mcp começa com o perfil web focado core. Cada ferramenta pública é documentada abaixo. As contagens também estão disponíveis diretamente do servidor instalado:
uvx --from argus-testing argus-mcp --list-tools
uvx --from argus-testing argus-mcp --tool-profile screen --list-tools
uvx --from argus-testing argus-mcp --tool-profile full --list-tools
| Perfil | Ferramentas públicas | Uso pretendido |
|---|---|---|
core | 30 | Fluxo de trabalho principal de QA de navegador; o padrão. |
screen | 14 | Testes nativos focados no macOS através de Acessibilidade e capturas de tela. |
full | 77 | Tudo no core e tela, mais controles especializados de navegador, estado, rede, coordenadas e rastreamento. |
Perfil core — 30 ferramentas
| Ferramentas | Finalidade | |-------|---------| | `start_session` | Iniciar uma revisão de navegador `exploratory`, `visual` ou `regression`; opcionalmente aceitar `goals`, `constraints` e `time_budget_minutes`; retornar o protocolo de uso único e a observação inicial. | | `observe` | Retornar URL, título, elementos interativos indexados por descrição, contagens, feedback visível, árvore ARIA e estado do viewport. | | `coverage_update` | Abrir uma janela de evidência de meta com `in_progress` e marcá-la como `exercised` ou `blocked`; estados terminais exigem uma explicação e vinculam automaticamente as evidências da sessão. | | `click_what` | Clicar no elemento que melhor corresponde a uma descrição em linguagem natural; retornar candidatos em vez de adivinhar quando houver ambiguidade. | | `type_into` · `select_into` | Resolver um campo por descrição e, em seguida, digitar texto ou selecionar uma opção. | | `hover_what` · `press_key` | Exercitar estados de hover e interações de teclado em alvos indexados por descrição. | | `resize` · `emulate_device` | Testar breakpoints responsivos ou reabrir a página sob configurações reais de toque móvel, UA, DPR e viewport. | | `upload_file` | Anexar um ou mais arquivos locais a um campo de entrada de arquivo correspondente. | | `navigate` · `go_back` · `scroll_down` | Navegar diretamente, voltar pelo histórico do navegador ou revelar conteúdo abaixo da dobra. | | `inspect_element` · `check_layout` | Inspecionar estilos computados, ARIA e marcação, ou sinais de overflow limitado, recorte, alvos pequenos e sobreposição. | | `screenshot` · `screenshot_diff` | Capturar evidências de viewport, página inteira ou elemento e produzir uma sobreposição de diff de pixels com tinta vermelha. | | `get_errors` | Drenar erros de console correlacionados e eventos HTTP 4xx/5xx capturados desde a leitura anterior. | | `capsule_save` · `capsule_restore` | Salvar e restaurar um estado nomeado de navegador autenticado ou pré-configurado, com uma verificação opcional de atividade. | | `verify_persistence` | Forçar um novo carregamento e verificar se o texto alvo está presente ou ausente. O toast "Salvo!" não é prova; isto é. | | `test_action` · `test_form` | Executar uma ação indexada por descrição ou envio de formulário e retornar o diff de estado resultante em uma única ida e volta. | | `check_links` · `check_performance` | Sondar links internos da página atual e expor métricas brutas de desempenho do navegador sem certificar automaticamente achados genéricos de auditoria. | | `regression_check` | Re-testar achados registrados para a origem atual sem exigir outra passada de descoberta. | | `record_bug` · `record_observation` | Registrar um defeito reproduzível com evidência e recibo, ou manter uma nota qualitativa de revisão separada de bugs certificados. | | `end_session` | Encerrar a sessão ativa e emitir relatórios HTML, JSON, JUnit e SARIF. |Os relatórios mantêm as capturas de tela originais como evidência e, por padrão, gravam pré-visualizações WebP compactas em report-assets/ em vez de incorporar cada PNG em tamanho real em base64 no HTML. Defina ARGUS_PORTABLE_REPORT=1 quando um único arquivo HTML autocontido for mais importante que o tamanho. A saída JSON inclui recibos completos de reprodução, o contrato de cobertura e suas referências estruturadas de evidência, restrições, modo de revisão, contagens de chamadas de ferramenta e etapas registradas, metadados de captura de tela e observações qualitativas. Os totais de falhas do conjunto JUnit correspondem aos nós <failure> emitidos.
Perfil de tela — 14 ferramentas
| Ferramentas | Finalidade |
|---|---|
start_screen_session | Vincular ao app em primeiro plano ou a um app macOS nomeado após verificar as permissões de Gravação de Tela e Acessibilidade. |
screen_observe | Retornar o app em primeiro plano, título da janela, árvore AX limitada, coordenadas de tela e uma captura de tela recente. |
screen_click_what · screen_type_into · screen_press_key | Resolver na árvore AX e agir por acessibilidade nativa, recorrendo a cliclick. |
screen_wait_for_stable | Aguardar até que a janela alvo permaneça visualmente estável dentro de um limite configurável. |
screen_launch · screen_quit · screen_is_running | Controlar e inspecionar um app por nome localizado, ID do pacote ou caminho absoluto. |
screen_screenshot_region | Capturar uma região retangular precisa da tela para evidência visual detalhada. |
screen_session_status | Relatar tempo decorrido, orçamento restante da sessão, contagens de ações e o caminho do arquivo de abortamento. |
record_bug · record_observation · end_session | Usar as ferramentas compartilhadas de evidência, relatório e encerramento no modo de tela. |
Segurança: tempo limite por chamada, um teto de sessão de 30 minutos, um arquivo de pânico ~/.argus/abort que interrompe toda ação subsequente e uma trilha automática de capturas de tela antes/depois em cada ação.
Perfil completo — 77 ferramentas
O perfil completo inclui todas as ferramentas principais e de tela acima, além destas 36 ferramentas especializadas. Use-o quando o fluxo de trabalho realmente precisar de estado de baixo nível, injeção de falhas, controle de múltiplas abas, coordenadas ou rastreamento.
| Ferramentas adicionais | Finalidade |
|---|---|
paste_into · right_click | Disparar um evento real de colagem da área de transferência ou abrir o menu de contexto de um alvo. |
emulate_media | Emular esquemas de cores escuro/claro e preferências de movimento reduzido. |
click_at · type_at · hover_at · drag_at · drag_what | Exercitar interfaces canvas/WebGL, revelação por hover e arrastar e soltar por coordenadas ou descrição. |
drop_file | Enviar uma soltura real de arquivo em uma zona de soltura correspondente. |
set_dialog_handler | Enfileirar uma resposta de aceitar, dispensar ou prompt para o próximo diálogo JavaScript. |
eval_js | Executar JavaScript arbitrário no contexto da página. Permanece desabilitado a menos que o servidor também inicie com --unsafe. |
network_requests · network_request | Inspecionar o log de requisições limitado ou recuperar detalhes completos de uma requisição correspondente. |
network_mock · network_unmock · network_clear_mocks · network_clear_log | Injetar respostas HTTP pré-definidas e redefinir independentemente mocks ativos ou tráfego capturado. |
cookies_get · cookies_set · cookies_clear | Inspecionar, semear ou limpar cookies do contexto do navegador. |
storage_get · storage_set · storage_remove · storage_clear | Inspecionar e modificar localStorage ou sessionStorage locais da página. |
tabs_list · tabs_switch · tabs_close | Controlar OAuth, pagamento e outras jornadas de popup ou múltiplas abas. |
wait_for_text · wait_for_request | Aguardar texto visível específico ou tráfego de saída correspondente com um tempo limite limitado. |
get_downloads | Inspecionar arquivos baixados durante a sessão, incluindo seus caminhos e tamanhos. |
crawl_site | Rastrear páginas internas limitadas e coletar eventos do navegador, resultados de links e evidências de desempenho. |
screen_click_at · screen_hover_at · screen_drag · screen_keys · screen_type_at | Usar coordenadas absolutas de tela e sequências de múltiplas teclas quando um app nativo não expõe nenhum elemento AX útil. |
Para expor eval_js como uma ferramenta operacional em vez de um stub de segurança desabilitado:
uvx --from argus-testing argus-mcp --tool-profile full --unsafe
Segurança e privacidade local-first
O Argus é executado na sua máquina e não envia telemetria para um serviço operado pela Argus. Relatórios e capturas de tela permanecem em ./argus-reports por padrão; seu host MCP e o provedor de modelo configurado ainda podem receber resultados de ferramentas incluídos na conversa. Ações do navegador e controles nativos do macOS podem causar efeitos colaterais reais, portanto use contas de teste e dados não relacionados à produção sempre que possível.
Leia a divulgação de privacidade completa e a política de segurança antes de usar o Argus em sistemas sensíveis.
Filosofia
Confie no agente, não simule inteligência
O Argus assume um driver de classe Opus. Regras estáticas que fingem ser a camada inteligente são subtrativas — elas adicionam manutenção e falsos positivos e desviam a atenção do que o agente realmente viu. Portanto, detector.py é minúsculo: ele apenas captura os dois canais que o agente literalmente não consegue ver (o fluxo de eventos do console e a camada HTTP). "Este toast é enganoso? A hierarquia visual está errada? Essa contagem está errada?" — o agente lê observe() e decide.
Guie a revisão; não sequestre a tarefa do host
A instrução global é intencionalmente minúscula para não repetir um prompt longo de QA em cada descrição de ferramenta MCP. start_session retorna o ritual completo baseado em evidências, metas, restrições e orçamento uma vez; as observações então exibem apenas o registro de cobertura ao vivo compacto. O Argus permanece uma capacidade dentro da tarefa atual do usuário: ele não impede o trabalho de implementação, não substitui a identidade do host nem implica autoridade para ações externas irreversíveis.
Indexado por descrição, não por índice
click_what("Login button"), não click(7). Índices de elementos são uma abstração vazada mesmo dentro de um único observe. Um agente capaz descreve o que quer pelo que é, e o resolvedor mapeia isso para o elemento certo — recusando-se a clicar errado em ambiguidade em vez de adivinhar.
Estrutura do projeto
argus/
├── mcp_server.py # tool surface + role instructions + reproduction-receipt engine
├── browser.py # Playwright backend: DOM/ARIA extraction, capsule/replay
├── resolver.py # description → element (web + screen)
├── reporter.py # HTML + JSON + JUnit + SARIF
├── detector.py # console + network capture (only)
├── cli.py # argus (explore) + argus-regression
├── bench/ # deterministic ceiling + real-LLM recall harness
└── screen/ # macOS AX backend, permissions, safety
test-site/ # BuggyTasks (22 mechanical bugs)
human-eye-fixture/ # DarkShop (12 human-eye bugs)
Licenciado sob MIT · Página do produto · Guia de instalação do agente · Privacidade · Segurança · Construído por Yichen Wu