MCP Hub
Back to servers

AWT (AI Watch Tester)

AI-powered E2E testing MCP server. Point at a URL — AI generates test scenarios, runs Playwright tests, and self-heals failures automatically. Works on Canvas and Flutter Web apps.

glama
Stars
3
Updated
Mar 31, 2026
Validated
Apr 2, 2026

AWT Logo
AWT — AI Watch Tester
I got tired of writing E2E tests. So I built something that writes and fixes them for me.

CI MIT License Python 3.11+ Cloud Agent Skill GitHub Stars


AWT Demo — install, run, self-heal
30-second demo: install → run test → AI self-heals failure


Why I built this

I was building a Flutter web app. Every time the UI changed, my Playwright tests broke. Fixing selectors, re-recording flows, updating assertions — it ate hours every week.

So I started hacking on a tool that could look at a page, write its own tests, and when those tests broke, figure out why and fix itself.

That became AWT.

It's not perfect. OCR-based matching can be flaky on certain fonts. The self-healing loop sometimes needs a nudge. But for my day-to-day QA work — especially on Canvas and Flutter Web apps that Cypress can't even touch — it works well enough that I stopped writing test code entirely.

I'm sharing it because I suspect I'm not the only one who got fed up. If you've ever spent an afternoon fixing broken selectors, this might save you some time.


What it does

You give AWT a URL. It opens a real Chrome window, reads the page, writes test steps, runs them, and reports what passed and what failed. If something breaks, the DevQA Loop kicks in — AI reads the error, patches the test, and retries automatically (up to 5 times).

No test code to write. No recording sessions. No manual selector updates.


Start in 5 Minutes

Option 1 — Agent Skill (works with Claude Code, Cursor, Copilot...)

# One-line install
npx skills add ksgisang/awt-skill --skill awt -g

# Then just ask your AI tool:
"Test the login flow on http://localhost:3000"
"Check if the signup form works"
"Run regression tests after my last commit"
# → AWT scans, generates steps, runs them, and reports back

Option 2 — MCP Server (Claude Desktop, Cursor, Windsurf)

# Install
pip install aat-devqa

# Add to Claude Code
claude mcp add awt -- python mcp/server.py

# Tools available: aat_devqa, aat_run, aat_doctor, aat_list_scenarios, aat_validate

Cloud & Local CLI versions are in active development and will be announced separately.


How It Works

You give AWT a URL
        │
        ▼
  🔍 SCAN — AWT opens Chrome and reads every button, input, and link
        │
        ▼
  📝 GENERATE — AI writes a step-by-step test plan (you review & approve)
        │
        ▼
  ▶️  RUN — AWT clicks, types, and navigates like a real user
        │
        ├── ✅ All passed → screenshot report saved
        │
        └── ❌ Something failed
                    │
                    ▼
            🔄 DEVQA LOOP — AI reads the failure,
               fixes the test (or your code),
               and tries again (up to 5 times)

The DevQA Loop — AWT's Core Feature

Most testing tools stop when a test fails and wait for a human. AWT keeps going.

When a step fails, AWT:

  1. Takes a screenshot of exactly what the browser shows
  2. Reads the error message and the visible page content
  3. Re-scans the page to check if anything moved or changed
  4. Patches the specific failing step and retries

If the failure is a bug in your source code (not just a wrong selector), AWT can trace it — finding the route handler, component, or API endpoint that's misbehaving — and suggest or apply a fix.

# Watch the loop run live
aat devqa "checkout flow test" --url http://localhost:3000

# Or use it with your AI coding tool (Claude Code, Cursor, Copilot...)
# "Test the registration page" → AWT scans, generates, runs, fixes

Four Ways to Use AWT

CloudLocal CLIAgent SkillMCP Server
How to startSign up at ai-watch-tester.vercel.apppip install aat-devqanpx skills add ksgisang/awt-skillpip install aat-devqa mcp
BrowserHeadless (server)Real Chrome on your machineReal Chrome on your machineReal Chrome on your machine
AI key neededNo (server-provided or BYOK)Yes (your OpenAI / Anthropic / Ollama)No — your AI tool is the brainNo
Best forQuick tests, PMs, plannersDevelopers, CI/CDAI-assisted developmentClaude Desktop, Cursor, Windsurf
PriceFree (5/mo) · Pro $28.99 · Team $98.99Free forever (MIT)Free foreverFree forever

Agent Skill — Let your AI coding tool drive AWT

# One-line install
npx skills add ksgisang/awt-skill --skill awt -g

# Then ask your AI tool:
"Test the login flow on http://localhost:3000"
"Check if the signup form works"
"Run regression tests after my last commit"
# → AWT scans, generates test steps, runs them, and reports back

MCP Server — Protocol-native

# Add to Claude Code
claude mcp add awt -- python mcp/server.py

# Tools available: aat_run, aat_doctor, aat_list_scenarios, aat_validate, aat_cost

What AWT Is Great At

FeatureDescription
🤖Zero-code test generationPoint at a URL — AI generates complete test steps with real selectors
🔄Self-healing DevQA LoopTests fail? AI fixes and retries automatically (up to 5 attempts)
👁️Visual verificationScreenshots before/after every action — not just DOM checks
🌐Real browserChrome with human-like mouse movement and typing speed
📱Flutter supportNative CanvasKit + Semantics detection — tests Flutter web apps too
📄Document-based generationFeed a PDF/DOCX spec — AI generates tests from requirements
Speed modesfast for React/Next.js · slow for Flutter/animations
📸Smart screenshotsall / before-after / on-failure — choose your audit level
🔌Plugin architectureSwap engines, matchers, AI providers via simple registries

Known Limitations (being honest)

AWT works well for me, but it has rough edges I haven't fully solved yet:

  • OCR matching can misfire on custom fonts or low-contrast UIs — fallback to DOM selectors when that happens
  • The self-healing loop occasionally fixates on the wrong element. Setting --max-attempts 3 helps avoid spinning wheels
  • Complex SPAs with heavy animation may need --verbosity=detailed and a longer wait time
  • First-run scenario generation is only as good as the page's accessibility tree — poorly structured HTML gives poor results

If you hit something broken, please open an issue. I fix reported bugs fast.


AWT vs Other Tools

vs Playwright / Cypress

Playwright and Cypress are excellent — and AWT is built on top of Playwright. The difference is who writes the tests:

AWTPlaywright / Cypress
Who writes testsAI (from your URL)You (code)
Maintenance when UI changesAI auto-healsYou update selectors manually
Learning curveZero — just paste a URLModerate (framework API + JS/TS)
FlexibilityHigh (YAML scenarios)Maximum (full code control)

Use Playwright/Cypress when you want full programmatic control. Use AWT when you want tests without writing them.

vs testRigor

AWTtestRigor
Test authoringAI generates from URL — you write nothingPlain English (you write commands)
Self-healingDevQA Loop (AI re-generates automatically)Built-in auto-maintenance
PricingFree (MIT, self-host)Enterprise (~$800+/mo)
Open source✅ MIT License

vs Applitools

Applitools specializes in visual regression (pixel-by-pixel screenshot comparison). AWT specializes in functional testing (does the login actually work?). They complement each other — run AWT for functional tests, add Applitools for pixel-perfect visual checks.


Speed & Screenshot Modes

Control the trade-off between thoroughness and speed:

# CI/CD — fastest, minimal storage
aat run --verbosity=concise --screenshots=on-failure scenarios/

# Standard QA — balanced (recommended)
aat run --verbosity=concise --screenshots=before-after scenarios/

# Full audit — every step recorded
aat run --verbosity=detailed --screenshots=all scenarios/
ModeStepsScreenshots~TimeUse For
concise + on-failure12–150–1~1 minCI/CD gates
concise + before-after12–1524~2 minDaily QA
detailed + all60–8068~5 minCompliance / audit

Supported AI Providers

ProviderModelsCostSetup
OpenAIgpt-4o, gpt-4o-miniPay-per-useexport OPENAI_API_KEY=sk-...
AnthropicClaude Sonnet 4Pay-per-useexport ANTHROPIC_API_KEY=sk-ant-...
Ollamacodellama, llama3, mistralFree (local)ollama serve
# aat.yaml
ai:
  provider: openai        # openai | anthropic | ollama
  model: gpt-4o
  api_key: ${OPENAI_API_KEY}

Architecture

aat devqa / aat run / aat dashboard
              │
              ▼
    ┌─────────────────────────────────────┐
    │           CLI (Typer)               │
    ├─────────────────────────────────────┤
    │         Core Orchestrator           │
    │  Executor · Comparator · DevQALoop  │
    ├────────────┬──────────┬─────────────┤
    │   Engine   │ Matcher  │  AI Adapter │
    │ web/desktop│ocr/cv/ai │ openai/etc. │
    ├────────────┴──────────┴─────────────┤
    │  Pydantic v2 Models · SQLite Learn  │
    └─────────────────────────────────────┘

All modules follow a plugin registry pattern — add a new engine, matcher, or AI provider by implementing one base class and registering it in __init__.py.


Development

Prerequisites

  • Python 3.11+
  • Tesseract OCR: brew install tesseract / apt install tesseract-ocr

Commands

CommandWhat it does
make devInstall all dependencies + Playwright + pre-commit
make lintCheck code style (ruff)
make formatAuto-fix formatting
make typecheckStrict type checking (mypy)
make testRun all tests (pytest)
make test-covTests + coverage report
git clone https://github.com/ksgisang/AI-Watch-Tester.git
cd AI-Watch-Tester
python -m venv .venv && source .venv/bin/activate
make dev
make test        # verify everything works
aat dashboard    # launch at http://localhost:9500

Contributing

Contributions, bug reports, and new plugins are welcome — see CONTRIBUTING.md.

If something doesn't work for your use case, please open an issue before spending time on a PR. Happy to help scope the right fix.

git checkout -b feat/my-feature
make format && make lint && make typecheck && make test
git commit -m "feat(scope): description"

FAQ

Do I need to know how to code?

No. The Cloud version at ai-watch-tester.vercel.app needs nothing — just a browser. The local CLI needs one terminal command to install.

The only thing AWT needs from you is a URL and (optionally) a description of what to test.

What does "self-healing" mean?

When a web app changes — a button moves, a label changes, a new form field appears — traditional tests break and stay broken until someone manually updates them.

AWT's DevQA Loop re-scans the page after a failure, finds the updated element, and patches the test step automatically. You don't have to touch the test files.

How do I install it?

Cloud (no install): ai-watch-tester.vercel.app

Local:

pip install aat-devqa
playwright install chromium
aat dashboard     # opens at http://localhost:9500

From source:

git clone https://github.com/ksgisang/AI-Watch-Tester.git
cd AI-Watch-Tester
make dev && aat dashboard
What's the difference between aat devqa and aat loop?
aat devqaaat loop
Starting pointJust a description + URLExisting scenario file
Test generationAutomatic (scans and writes)Uses your file
Failure fixingPatches the test YAMLAI patches your source code
Best forFirst run, quick testingIterative dev with code fixes

Use aat devqa when starting from scratch. Use aat loop when you want AWT to also fix your application code.

How do I control speed and screenshot output?

--verbosity — how many steps run:

  • detailed (default): all steps including wait/assert/screenshot
  • concise: core actions only (navigate, click, type) — faster

--screenshots — how many images are saved:

  • all (default): after every step
  • before-after: before + after each click/type/navigate (~70% fewer files)
  • on-failure: only when a step fails (great for CI/CD)
# Recommended for daily QA
aat run --verbosity=concise --screenshots=before-after scenarios/

# For CI/CD pipelines
aat run --verbosity=concise --screenshots=on-failure scenarios/
Which AI providers are supported?
ProviderModelsCost
OpenAIgpt-4o, gpt-4o-miniPay-per-use
AnthropicClaude Sonnet 4Pay-per-use
Ollamacodellama, llama3, mistralFree (local GPU)

Cloud BYOK keys are encrypted at rest (Fernet/AES-128-CBC).

How much does the Cloud version cost?
PlanPriceTests/month
Free$05
Pro$28.99/mo100
Team$98.99/mo500

The local CLI is free forever with no limits.

Can I use it in CI/CD?

Yes. For local runs, use the --screenshots=on-failure flag to keep output minimal. For cloud, the API accepts a POST request:

curl -X POST https://your-awt-server.com/api/v1/run \
  -H "X-API-Key: awt_your_key" \
  -H "Content-Type: application/json" \
  -d '{"target_url": "https://staging.example.com"}'

See the CI/CD Guide for GitHub Actions and GitLab CI examples.

Is my data secure?
  • All traffic encrypted via HTTPS/TLS
  • BYOK API keys: Fernet-encrypted (AES-128-CBC + HMAC-SHA256) at rest
  • Screenshots: auto-deleted after 7 days
  • Local mode: nothing leaves your machine

License

MIT — free for personal and commercial use.


Built with Playwright, OpenCV, and too much frustration with broken selectors.
Made by @ksgisang — feedback and issues very welcome.

Reviews

No reviews yet

Sign in to write a review