Argus Testing

MCP de QA autônomo que testa aplicativos web e macOS como um engenheiro real e verifica cada bug.

Documentação

Argus Testing logo — an eye with a verified check

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.

PyPI Python MCP server Official MCP Registry Capability ceiling License: MIT

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:

Argus bug report — verified findings with reproduction receipts

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

Add Argus to 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-pretaVocê 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 coberturaMetas 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çãoAntes 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 humanoEscassez 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 → protegerAchados 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áquinaCada 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:

ArgusPlaywright MCPChrome DevTools MCPbrowser-use
Descobre autonomamente bugs desconhecidosSimNão (driver)Não (depurador)Parcial (escopo de tarefa)
Verifica independentemente cada achadoSim (recibo)NãoNãoNão (pontuação LLM)
Relatório de bug rico em evidênciasSimNãoNãoParcial
Caixa-preta (sem acesso a repo / código-fonte)SimSimSimSim
Portão de regressão CI com zero LLMSimParcialNãoParcial

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:

  1. 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.
  2. 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.
  3. Usar o benchmark em nós mesmos encontrou bugs reais no próprio Argus — um crash record_bug em um argumento de string que silenciosamente descartava achados, erros de resolução em frases comuns. A ferramenta que testa ferramentas foi testada.
  4. 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
PerfilFerramentas públicasUso pretendido
core30Fluxo de trabalho principal de QA de navegador; o padrão.
screen14Testes nativos focados no macOS através de Acessibilidade e capturas de tela.
full77Tudo 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
FerramentasFinalidade
start_screen_sessionVincular 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_observeRetornar 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_keyResolver na árvore AX e agir por acessibilidade nativa, recorrendo a cliclick.
screen_wait_for_stableAguardar até que a janela alvo permaneça visualmente estável dentro de um limite configurável.
screen_launch · screen_quit · screen_is_runningControlar e inspecionar um app por nome localizado, ID do pacote ou caminho absoluto.
screen_screenshot_regionCapturar uma região retangular precisa da tela para evidência visual detalhada.
screen_session_statusRelatar tempo decorrido, orçamento restante da sessão, contagens de ações e o caminho do arquivo de abortamento.
record_bug · record_observation · end_sessionUsar 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 adicionaisFinalidade
paste_into · right_clickDisparar um evento real de colagem da área de transferência ou abrir o menu de contexto de um alvo.
emulate_mediaEmular esquemas de cores escuro/claro e preferências de movimento reduzido.
click_at · type_at · hover_at · drag_at · drag_whatExercitar interfaces canvas/WebGL, revelação por hover e arrastar e soltar por coordenadas ou descrição.
drop_fileEnviar uma soltura real de arquivo em uma zona de soltura correspondente.
set_dialog_handlerEnfileirar uma resposta de aceitar, dispensar ou prompt para o próximo diálogo JavaScript.
eval_jsExecutar JavaScript arbitrário no contexto da página. Permanece desabilitado a menos que o servidor também inicie com --unsafe.
network_requests · network_requestInspecionar o log de requisições limitado ou recuperar detalhes completos de uma requisição correspondente.
network_mock · network_unmock · network_clear_mocks · network_clear_logInjetar respostas HTTP pré-definidas e redefinir independentemente mocks ativos ou tráfego capturado.
cookies_get · cookies_set · cookies_clearInspecionar, semear ou limpar cookies do contexto do navegador.
storage_get · storage_set · storage_remove · storage_clearInspecionar e modificar localStorage ou sessionStorage locais da página.
tabs_list · tabs_switch · tabs_closeControlar OAuth, pagamento e outras jornadas de popup ou múltiplas abas.
wait_for_text · wait_for_requestAguardar texto visível específico ou tráfego de saída correspondente com um tempo limite limitado.
get_downloadsInspecionar arquivos baixados durante a sessão, incluindo seus caminhos e tamanhos.
crawl_siteRastrear 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_atUsar 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