Debugg AI MCP
OfficialThe Debugg AI MCP Server is an AI-driven browser automation and end-to-end testing tool that offers:
Natural Language Testing: Run UI tests by describing features or flows in plain language
Local Application Support: Test web applications running on
localhostportsMCP Protocol Integration: Seamlessly connect with AI agents and MCP-compatible clients
Real-Time Updates: Receive step-by-step notifications during test execution
Visual Verification: Capture screenshots of the final page state
Zero Configuration: Eliminate the need for local browser or Playwright setup
CI/CD Compatibility: Access historical test results for pipeline integration
Secure Remote Execution: Use managed browsers via secure tunnels
Deployment Options: Quick setup via NPX or Docker for local and remote use
Provides Docker container deployment option for running the MCP server with configurable environment variables
Integrates with GitHub repositories for testing web applications, with support for specifying repo name and branch information
Compatible with LangChain agents as MCP clients for browser automation and end-to-end testing
Available as an npm package (@debugg-ai/debugg-ai-mcp) for easy installation and integration
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Debugg AI MCPtest the login flow on my app running on port 3000"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Debugg AI — MCP Server
AI-powered browser testing via the Model Context Protocol. Point it at any URL (or localhost) and describe what to test — an AI agent browses your app and returns pass/fail with screenshots.
Setup
Requires Node.js 20.20.0 or later (transitive requirement from posthog-node@^5.26.0).
Testing http://localhost:... URLs requires the caddy binary — check_app_in_browser,
probe_page, and trigger_crawl tunnel localhost targets through a local Caddy reverse proxy.
This installs automatically: the @radically-straightforward/caddy npm dependency downloads a
pinned Caddy release for your platform during npm install/npx, same as this project already
does for the ngrok binary — nothing to install yourself in the normal case. If that download
never ran (npm install --ignore-scripts, an offline/air-gapped install), point CADDY_BIN at
your own install (brew install caddy / apt install caddy / see
caddyserver.com/docs/install) — missing it surfaces as a
clear error on the first localhost-URL call, not a silent hang. Public-URL calls, every
non-browser tool, and test_suite {action:"run"} (which uses its own dedicated tunnel and
bypasses Caddy entirely) don't need it either way.
Get an API key at debugg.ai, then add to your MCP client config:
{
"mcpServers": {
"debugg-ai": {
"command": "npx",
"args": ["-y", "@debugg-ai/debugg-ai-mcp"],
"env": {
"DEBUGGAI_API_KEY": "your_api_key_here"
}
}
}
}Or with Docker:
docker run -i --rm --init -e DEBUGGAI_API_KEY=your_api_key quinnosha/debugg-ai-mcpThe Dockerfile's npm install step would pick up caddy the same automatic way local installs
do, in principle — but as of this writing the Dockerfile doesn't COPY several directories the
build now needs (handlers, tools, types, config) and still references a tunnels/
directory that no longer exists, so a fresh build likely fails before that matters. That's a
pre-existing gap, unrelated to Caddy. The currently published quinnosha/debugg-ai-mcp image
predates the Caddy dependency regardless — localhost-URL calls to
check_app_in_browser/probe_page/trigger_crawl will fail with CaddyBinaryNotFoundError
inside that image until it's rebuilt (Dockerfile fixed) and republished, or CADDY_BIN points at
one baked in separately. Public-URL calls, the non-browser tools, and test_suite {action:"run"}
are unaffected either way.
Related MCP server: QAcito
Tools
The server exposes 8 tools: three Browser tools plus one action-based tool per managed entity. The headline tools are check_app_in_browser (full AI agent) and probe_page (lightweight no-LLM page probe). The rest — project, environment, test_suite, test_case, executions — each take an action discriminator (e.g. {"action":"list"}) that selects the operation. Destructive delete actions require confirmation (an elicitation prompt where supported, otherwise confirm: true).
Browser
check_app_in_browser
Runs an AI browser agent against your app. The agent navigates, interacts, and reports back with screenshots. Localhost URLs are auto-tunneled via ngrok.
Parameter | Type | Description |
| string required | What to test (natural language) |
| string required | Target URL — |
| string | UUID of a specific environment |
| string | UUID of a specific credential |
| string | Pick a credential by role (e.g. |
| string | Username for login (ephemeral — not persisted) |
| string | Password for login (ephemeral — not persisted) |
| array | Accounts for logins the agent hits during the task — |
| boolean | Default |
| boolean | Default |
| object | Auth precondition — |
| string | Override auto-detected git repo name (e.g. |
One focused check per call. The agent has a ~25-step internal budget; split broader suites across multiple calls.
Credentials: pass them as parameters, not prose
Naming an account only in description does not make the agent use it — it falls back to the environment's stored credential, and the app's rejection of the wrong account comes back looking like an application failure. Anything you pass as a parameter beats the environment default for every login in the run, not just the first:
username/password(orcredentialId/credentialRole) — the run's identity.auth.username/auth.password— pins the precondition login when you also useauth.precondition: "login".loginCredentials— accounts for a login form the agent reaches part-way through the task. This is the one for flows like set a password → get bounced to sign-in → log in as the account you just created, where splitting into separate calls would lose browser state.
Set useEnvironmentCredentials: false when a silent fallback to the default test user would invalidate the check.
Checking a page that needs no login at all? Pass useEnvironmentCredentials: false and name no account. That combination means exactly what it says — do not log in — and the run skips authentication entirely instead of hunting for a login form. Use it for public pages, marketing sites, docs, and anything pre-auth. It is also faster: on the default (auto) the agent will follow a "Log in" link off your page and try the environment's stored account before it evaluates anything.
Session reuse: why a check can report "no login form"
Runs don't log in every time. After a verified login the backend captures that account's session and restores it on the next run for the same identity, which skips the login entirely — that's why a check can legitimately come back with submitted: false and no login form: it was already signed in. A restored run reports itself in logins with reason: "restored_session", so you can tell it apart from a run that genuinely found no form.
Sessions are keyed per account, so naming a different account never reuses somebody else's. Two ways to bypass reuse:
freshSession: trueon a single call — log in for real this once, then re-capture. Use it when the login flow is what you're checking, when you suspect the stored session is stale, or when the app's only route between personas is a logout.environmenttool,action: "clearSessions"— invalidate the stored sessions so subsequent runs log in. Narrow withusername/credentialId; unscoped clears require confirmation because every account on the environment then re-authenticates.
Use action: "sessions" to see what an environment is currently holding and whether each would be reused.
Results report the identity actually used, so a wrong one is visible rather than masquerading as a broken app:
"logins": [
{ "username": "qa+invitefix@example.com", "source": "task", "submitted": true, "authenticated": true }
],
"credentialWarning": {
"requested": "qa+invitefix@example.com",
"used": ["qatest123@example.com"],
"message": "This run signed in with an environment default credential even though '…' was specified. …"
}source is task | explicit | credential_id (an account you named) or env | env_default (the environment's stored account). credentialWarning appears only when you named an account and an environment default was used anyway. loginError appears when a named account could not be resolved and the run declined to substitute a different one.
Every successful run returns a browserSession block alongside the screenshot — presigned S3 URLs for the captured HAR (full network trace) and console log (every JS console message). Use them to detect refetch loops, hydration errors, and other runtime issues that pass type-checks and unit tests:
"browserSession": {
"harUrl": "https://...session_18139.har?X-Amz-...",
"consoleLogUrl": "https://...session_18139_console.json?X-Amz-...",
"recordingUrl": "https://...session_18139_recording.webm?X-Amz-...",
"harStatus": "downloaded",
"consoleLogStatus": "downloaded",
"harRedactionStatus": "redacted",
"consoleLogRedactionStatus": "redacted"
}URLs are short-lived presigned S3 — refetch the parent execution via executions {action:"get", uuid} to renew. harStatus / consoleLogStatus disambiguate 'downloaded' (URL fetchable), 'not_available' (page emitted nothing), 'failed' (capture broke). On a fresh run the URLs are commonly null because capture uploads async after the agent finishes — poll executions {action:"get", uuid: executionId} until status reaches 'downloaded'. Authorization / Cookie / token/secret/api_key headers are scrubbed server-side before the artifacts are persisted.
trigger_crawl
Fires a server-side browser-agent crawl to populate the project's knowledge graph. Localhost URLs tunnel automatically. Returns {executionId, status, targetUrl, durationMs, outcome?, crawlSummary?, knowledgeGraph?, browserSession?} with knowledgeGraph.imported === true on successful ingestion. The browserSession block (HAR + console-log URLs, same shape as above) is also present on completed crawls.
probe_page
Lightweight no-LLM batch page probe. Pass 1-20 URLs; each navigates, settles on content (the DOM going quiet, bounded — never on network silence, which a live app never reaches), and returns rendered state — screenshot + page metadata + structured console errors + network summary. No agent loop, no LLM cost, no scenario assertions. Use it for "did I just break /settings?", multi-route smoke after a refactor, CI per-PR sweeps, and quick is-it-up checks where check_app_in_browser's 60-150s agent loop is overkill.
Parameter | Type | Description |
| array required | 1-20 entries: |
| string required | Public URL or localhost (auto-tunneled) |
| enum |
|
| string | Optional CSS selector to wait for after navigation |
| number | Per-URL timeout, 1000-30000 (default 10000) |
| boolean | Return raw HTML in each result (default false) |
| boolean | Return one PNG per target (default true) |
All targets in a batch share one session tunnel, but only same-port (or all-public) batches share a single backend execution — 5 URLs on one port in one call is dramatically faster than 5 parallel single-URL calls. A batch that mixes multiple local ports decomposes into one sequential backend execution per port group (still one call, still one merged results[] in your original order, but N backend round-trips instead of one — slower, not rejected). Per-URL error field preserves batch resilience: a single failed target doesn't fail the others.
networkSummary aggregation key is origin + pathname — refetch loops (?n=0..4 repeatedly hitting the same endpoint) collapse into a single entry with the count, so /api/poll showing up with count: 47 is the actionable "infinite refetch loop" signal users originally asked for.
Performance budget: <10s for 1 URL, <25s for 20. Localhost dead-port returns LocalServerUnreachable in <2s without burning a workflow execution.
project
Action | Params | Result |
|
| Curated project detail |
|
| Paginated summaries |
|
| Created project |
Team and repo resolve by either uuid or name (case-insensitive exact match; NotFound if none, AmbiguousMatch if multiple). There is no update/delete — rename or delete a project from the DebuggAI web app.
environment
Action | Params | Result |
|
| Env with credentials inlined (passwords never returned) |
|
| Paginated envs, each with a credentials array |
|
| Created env (optionally seeds credentials) |
|
| Patched env; credential ops run remove → update → add |
|
| Deletes env (cascades credentials) — requires confirmation |
|
| Captured login sessions the env holds, per account, with |
|
| Invalidates them so the next run logs in for real — unscoped clears require confirmation |
projectUuid auto-resolves from the git repo when omitted. Per-cred failures surface in credentialWarnings[] without blocking the env op.
sessions / clearSessions manage the warm authenticated sessions the backend reuses to skip login (see Session reuse). Session contents are never returned — a session cookie is a bearer credential. clearSessions marks sessions invalid rather than deleting the rows, so reuse stops immediately while the capture history stays readable.
test_suite
Action | Params | Result |
|
| Paginated suites with status + pass rate |
|
| Created suite |
|
| Triggers all tests async |
|
| Suite + per-test outcomes |
|
| Soft-delete — requires confirmation |
test_case
Action | Params | Result |
|
| Created test case (not auto-run) |
|
| Patched test case |
|
| Soft-delete — requires confirmation |
executions
Action | Params | Result |
|
| Full detail ( |
|
| Paginated summaries |
404 from the backend surfaces as isError: true with {error: 'NotFound', message, uuid}. Credentials are always returned without passwords.
Pagination
Every filter-mode response is paginated. Response shape:
{
"filter": { "...echoed query params..." },
"pageInfo": { "page": 1, "pageSize": 20, "totalCount": 47, "totalPages": 3, "hasMore": true },
"<items>": [ ... ]
}Pass optional page (1-indexed, default 1) and pageSize (default 20, max 200; oversized values are clamped). No response is ever silently truncated.
Resources
Alongside tools, the server exposes the read-only entities as MCP resources so clients can browse and @-mention them as context:
URI | What |
| All projects (first page) |
| Environments for the auto-detected project |
| Recent executions (first page) |
| One project, full detail |
| One environment (credentials inline, passwords redacted) |
| One execution, full node detail + artifact links |
Reads dispatch to the same handlers as the project / environment /
executions tools, so the data and auth are identical. Resources are additive —
clients without resource support keep using the tools.
Security invariants
Passwords are write-only. They never appear in any response body from any tool.
Tunnel URLs (
*.ngrok.debugg.ai) are stripped from all browser-agent responses, including agent-authored text.404s from the backend surface as
isError: truewith{error: 'NotFound', ...}, never as thrown exceptions.Missing
DEBUGGAI_API_KEYsurfaces as a structured tool error on first invocation — the server still registers and lists tools normally.
Migration to v3.0.0 (action-based tools)
v3 consolidated the 20 per-verb tools into 8 action-based tools. Old tool → new tool {action}:
Removed | Replacement |
|
|
|
|
| Dropped — use the DebuggAI web app |
|
|
|
|
|
|
|
|
|
|
| Dropped — always headless |
delete actions now require confirmation (elicitation prompt, or confirm: true). Clients pick up the new surface on MCP restart.
Migration from v1.x (breaking change in v2.0.0)
v2 collapsed a 22-tool surface to 11. Old-tool → new-tool mapping:
Removed | Replacement |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Dropped — backend spin-down is automatic |
Response-shape changes: the bare count field on list responses is gone — use pageInfo.totalCount.
Configuration
Env var | Required | Purpose |
| yes | Backend API key. Aliases: |
| no | Backend base URL. Defaults to |
| no |
|
| no | Override the App Evaluation workflow slug that |
| no |
|
| no | Override the embedded telemetry project key (e.g. private fork). |
| no | Set to |
DEBUGGAI_API_KEY=your_api_keyRemote / HTTP transport (optional)
By default the server speaks stdio (local npx). It can instead run as a
hosted, multi-user remote MCP over stateless Streamable HTTP + OAuth:
DEBUGGAI_MCP_TRANSPORT=http PORT=3000 DEBUGGAI_TOKEN_TYPE=bearer npx -y @debugg-ai/debugg-ai-mcp@latestIt is an OAuth Resource Server: every POST /mcp needs
Authorization: Bearer <token>; missing/invalid tokens get a 401 with a
WWW-Authenticate pointing at the RFC 9728 metadata, and clients run the OAuth
flow against the advertised authorization server. The bearer is request-scoped —
api.debugg.ai validates it.
Endpoint | Purpose |
| MCP Streamable HTTP (bearer-protected) |
| RFC 9728 metadata (authorization server discovery) |
| Load-balancer / ECS health check |
Env var | Default | Purpose |
|
| Set to |
|
| HTTP listen port |
|
| This server's public resource URL (RFC 9728 |
|
| Authorization server advertised to clients |
|
| Set to |
stdio installs need none of these.
Multi-replica deployments (go/no-go before rollout): tunnel state (the ngrok session tunnel,
its Caddy instance, and its port-route lock) is in-process, keyed per caller by a hash of the
bearer token — there is no cross-process coordination. Running several replicas behind a plain
round-robin load balancer means one caller's calls can land on different replicas and mint one
tunnel per replica they hit instead of one for the whole session (extra ngrok cost, bounded by
replica count, self-healing via the existing 55-minute idle auto-shutoff — never a cross-session
correctness bug, since any single tool call stays on one replica for its whole duration). To get
the intended "one tunnel per session" behavior on a multi-replica HTTP deployment, configure
session-affine routing at the load balancer (sticky/consistent-hash keyed on the same identity
getSessionKey() derives — in practice, the caller's Authorization bearer token). See
docs/local-tunnel-multiplexer-architecture-2026-07-31.md §2.1 for the full reasoning and the
honest degrade path if this isn't configured.
Telemetry
The MCP server ships with telemetry enabled by default — an embedded write-only PostHog project key (phc_*) so the team can observe cache hit rates, poll cadence, tunnel reliability, and other operational metrics across the install base. Captured events:
Event | When |
| Per tool call |
| Per browser-agent execution (carries |
| Per tunnel lifecycle event |
| Cache hit/miss with |
Privacy posture:
The distinct ID is
SHA-256(api_key).slice(0, 16)— never the raw key, no PII.phc_*keys are write-only by PostHog convention; safe to embed in source.Set
DEBUGGAI_TELEMETRY_DISABLED=1to opt out entirely (resolves to a no-op provider; no events leave the process).
The active mode is logged at boot:
Telemetry enabled (PostHog, DebuggAI default project). Set DEBUGGAI_TELEMETRY_DISABLED=1 to opt out.
Telemetry enabled (PostHog, custom POSTHOG_API_KEY)
Telemetry disabled (DEBUGGAI_TELEMETRY_DISABLED is set)Local Development
npm install
npm run build
npm run test:e2e # real end-to-end evals against the backendThe eval suite spawns the built MCP server as a subprocess, exercises every tool against a real backend, and writes per-flow artifacts to scripts/evals/artifacts/<timestamp>/. See scripts/evals/flows/ for the individual scenarios.
MCP registration: debugg-ai-local vs debugg-ai
This repo ships a .mcp.json that registers a project-scoped server named debugg-ai-local pointing at node dist/index.js — the freshly-built local code. It only activates when Claude Code's working directory is this repo.
Your other projects should use the user-scoped debugg-ai registration that pulls from the published npm package:
npm run mcp:global # registers debugg-ai in ~/.claude.json to npx -y @debugg-ai/debugg-ai-mcpAfter editing code here, run npm run mcp:local (which just rebuilds) so the next invocation of debugg-ai-local picks up your changes.
Links
Dashboard · Docs · Issues · Discord
Apache-2.0 License © 2025 DebuggAI
Available Tools
8 toolscheck_app_in_browserRun E2E Browser TestA
Give an AI agent eyes on a live website or app. The agent browses it, interacts with it, and tells you whether a given task or check passed. Works on localhost or any URL. Use for visual QA, flow validation, regression checks, or anything that needs a real browser to verify.
LOCALHOST SUPPORT: Pass any localhost URL (e.g. http://localhost:3000) and it Just Works. A secure tunnel is automatically created so the remote browser can reach your local dev server — no manual ngrok setup, no port forwarding, no config.
SCOPE PER CALL: Keep each call to ONE focused check — a single page or a short interaction on a single screen (login, submit a form, verify a heading). For anything spanning multiple pages or long multi-step flows, split into SEPARATE calls — the remote browser agent has a ~25-step internal budget per call, and long single calls risk client-side timeouts. Example: instead of "log in, then go to settings, then update profile, then verify," make three calls: (1) log in & verify dashboard, (2) update settings, (3) verify profile change.
CREDENTIALS: pass them as PARAMETERS, not only in the description. Naming an account in description alone does not make the agent use it — it falls back to the environment's stored credential. Use username/password (or credentialId) for the run's identity, auth.username/auth.password to pin the precondition login, and loginCredentials for accounts the agent must use at a login form it hits PART-WAY through the task (e.g. set a password → bounced to sign-in → log in as the account you just created). Anything you specify beats the environment's default for every login in the run; the result reports the identity actually used under logins.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to navigate to. Can be any public URL (https://example.com) OR a localhost/local dev server URL. For localhost URLs, a secure tunnel is automatically created — just make sure your dev server is running on that port. | |
| auth | No | Optional auth-precondition for a 'log in THEN deep-navigate' check. Set precondition:'login' to authenticate first, then land on deepUrl. Use this instead of hoping the agent signs itself in at a login wall. Pass username/password here to pin WHICH account it authenticates as; omit them to use the environment's default credential. | |
| password | No | The real password for the username above. Do NOT guess or use placeholder passwords — use credentials from the list above or ask the user. | |
| repoName | No | GitHub repository name (e.g. 'my-org/my-repo'). Auto-detected from the current git repo — only provide this if you want to run against a different project than the one you're in. | |
| username | No | A real, existing account email for the target app. Do NOT invent or guess credentials — use one from the available credentials listed above, or ask the user. The browser agent will type this into the login form. Takes precedence over the environment's default credential for EVERY login in the run. | |
| description | Yes | Natural language description of what to test or evaluate (e.g., 'Does the login form validate empty fields?' or 'Navigate to the homepage and verify the hero section loads') | |
| credentialId | No | UUID of a specific credential to use for login. See available credentials in the tool description above. | |
| freshSession | No | Default false. Set true to force a REAL login instead of reusing the warm session the backend keeps per account. Use when the login flow itself is what you're checking, when you suspect the stored session is stale, or when the app's only route between personas is a logout. Costs one login; the run re-captures afterwards, so later runs stay fast. | |
| environmentId | No | UUID of a specific environment to use for this test. See available environments in the tool description above. | |
| credentialRole | No | Pick a credential by role (e.g. 'admin', 'guest') from the resolved environment | |
| loginCredentials | No | Accounts the agent may sign in as when it hits a login form DURING the task — not just the first login. Use this for flows that authenticate part-way through, e.g. set a password, get bounced to sign-in, then log in as the account you just provisioned. Stating credentials only in `description` is not enough: pass them here and the agent uses exactly these values. Overrides the environment's default credential. | |
| useEnvironmentCredentials | No | Default true. Set false to forbid the agent from ever auto-filling the environment's stored credentials — it signs in only as an account this call named (username/password, credentialId, credentialRole, loginCredentials, or auth.username), or not at all. Use when a run must prove a SPECIFIC account's experience and a silent fallback to the default test user would invalidate it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations (readOnlyHint:false, openWorldHint:true, destructiveHint:false): automatic localhost tunneling, the ~25-step agent budget and timeout risk, warm-session reuse vs freshSession forced real login, and the credential fallback behavior ('it falls back to the environment's stored credential'). It even discloses what the result reports (`logins` identity). This is rich, accurate transparency with no contradiction against annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but purpose-built for a genuinely complex tool (12 params, nested auth objects, credential governance). It is sensibly front-loaded: purpose, then localhost support, then scoping, then credentials. There is some redundancy between the credentials prose and the schema-level descriptions of auth/loginCredentials/useEnvironmentCredentials, but the prose earns its place by adding precedence semantics the schema lacks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, credential-heavy tool with no output schema, the description covers the hard parts thoroughly: what the tool does, localhost tunneling, per-call scoping with a step budget, and the full matrix of credential mechanisms and their precedence. It even notes the output identity field (`logins`), compensating for the absent output schema. Nothing an agent needs to invoke it correctly is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real semantic value above the schema by explaining relationships and precedence among the credential parameters (username/password vs auth.username vs loginCredentials vs credentialId vs useEnvironmentCredentials), including when each applies (part-way login, precondition login, forbidding auto-fill). This inter-parameter guidance is not derivable from the schema text alone, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose with concrete verbs and resource: 'Give an AI agent eyes on a live website or app... browses it, interacts with it, and tells you whether a given task or check passed.' It names clear use cases (visual QA, flow validation, regression checks) and qualifies itself as 'anything that needs a real browser to verify,' which helps separate it from sibling browser tools like probe_page and trigger_crawl. This goes well beyond a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context ('Use for visual QA, flow validation, regression checks, or anything that needs a real browser to verify') and unusually strong how-to guidance: one focused check per call, a ~25-step internal budget, advice to split multi-step flows into separate calls with a concrete three-call example. It lacks explicit exclusions and does not name sibling tools as alternatives, but the usage context is clear enough to be a solid 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
environmentEnvironmentADestructive
Manage environments (and their login credentials) under a project. Pass an "action":
"get" {uuid, projectUuid?} → one environment with credentials inline (passwords never returned).
"list" {projectUuid?, q?, page?, pageSize?} → paginated environments. projectUuid auto-resolves from the git repo if omitted.
"create" {name, url, description?, projectUuid?, credentials?} → create an env, optionally seeding credentials.
"update" {uuid, name?, url?, description?, addCredentials?, updateCredentials?, removeCredentialIds?} → patch env + manage credentials.
"delete" {uuid, projectUuid?, confirm?} → delete env (DESTRUCTIVE; requires confirmation).
"sessions" {uuid, username?, credentialId?} → captured login sessions this env is holding, and whether each would be reused.
"clearSessions" {uuid, username?, credentialId?, confirm?} → invalidate them so the next run logs in for real.
SESSIONS: runs reuse a warm authenticated session per account instead of logging in every time. That is why a check can report "no login form" — it was already signed in. Use "sessions" to see whose session is held, "clearSessions" to drop it, or pass freshSession:true on a single check_app_in_browser call to bypass reuse without clearing anything.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | [list] Free-text search over env name. | |
| url | No | [create/update] Base URL. | |
| name | No | [create/update] Environment name. | |
| page | No | [list] Page (1-indexed). | |
| uuid | No | [get/update/delete] Environment UUID. | |
| action | Yes | Operation to perform. | |
| confirm | No | [delete/clearSessions] Set true to confirm (when the client cannot prompt). clearSessions only needs it when no username/credentialId narrows it. | |
| pageSize | No | [list] Page size (1..200). | |
| username | No | [sessions/clearSessions] Narrow to one account. Matched case-insensitively. | |
| credentials | No | [create] Seed login credentials. | |
| description | No | [create/update] Free-text description. | |
| projectUuid | No | Target project (defaults to git auto-detect). | |
| credentialId | No | [sessions/clearSessions] Narrow to one stored credential by UUID. | |
| addCredentials | No | [update] Add credentials. | |
| updateCredentials | No | [update] Patch credentials by UUID. | |
| removeCredentialIds | No | [update] Delete credentials by UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint, readOnlyHint), the description discloses critical non-obvious behaviors: passwords are never returned ('passwords never returned'), credentials are write-only, delete is explicitly labeled DESTRUCTIVE and requires confirmation, projectUuid auto-resolves from the git repo when omitted, and warm session reuse explains surprising check results. It even explains why a check can report 'no login form' when already authenticated. This is rich behavioral disclosure that annotations alone could not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficiently structured: a one-line action index followed by compact signature-like bullets, then a SESSIONS paragraph that explains a non-obvious cross-tool behavior. Every piece has a purpose, and the most important caveats (destructive delete, password concealment) are front-loaded. It is long because the tool has seven actions, but nothing feels redundant or fluffy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (7 actions, 16 parameters, no output schema), the description is remarkably complete. It covers every action's inputs, key constraints (confirmation, pagination, auto-resolution, credential management), and the session-reuse context needed to interpret results correctly. It also connects to a sibling tool for an alternative approach. No critical operational detail appears missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the baseline is 3. The description adds meaningful action-level semantics that the flat schema lacks: it groups parameters by action (e.g., 'get {uuid, projectUuid?} → one environment with credentials inline'), clarifies the confirm flag's conditional need, and explains that passwords are write-only and never returned. This goes beyond the schema's per-parameter descriptions, justifying a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Manage environments (and their login credentials) under a project.' It then enumerates seven distinct actions, making the scope unmistakable and distinguishing it from siblings like project, test_suite, and check_app_in_browser. The action list functions as a precise mini-spec that could not be confused with any other tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use each action and explicitly references a sibling for an alternative behavior: 'pass freshSession:true on a single check_app_in_browser call to bypass reuse without clearing anything.' It also implies when sessions/clearSessions should be used. It does not explicitly state 'use this instead of X' for all siblings, but the action breakdown makes the intended use unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
executionsWorkflow ExecutionsARead-only
Look up workflow executions (history of check_app_in_browser, trigger_crawl, and test-suite runs). Pass an "action":
"get" {uuid} → one execution with FULL detail (nodeExecutions, state, errorInfo) + any screenshot/gif artifacts.
"list" {projectUuid?, status?, page?, pageSize?} → paginated execution summaries. status ∈ completed|running|failed|cancelled|pending.
Tip: after a fresh check_app_in_browser run, poll action:"get" with the returned executionId until artifact URLs are available.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | [list] Page (1-indexed). | |
| uuid | No | [get] Execution UUID. | |
| action | Yes | Operation to perform. | |
| status | No | [list] Filter by status. | |
| pageSize | No | [list] Page size (1..200). | |
| projectUuid | No | [list] Filter by project UUID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true, and the description does not contradict them. It adds behavioral details: 'get' returns full detail including nodeExecutions, state, errorInfo, and artifact URLs; it advises polling until artifact URLs are available. This enhances transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two clear sentences plus a short tip. It is front-loaded with the main purpose, then dives into details. Every sentence provides useful information, with no redundancy or excessive length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the comprehensive schema, annotations, and lack of output schema, the description covers essential aspects: two actions with their parameters, and a usage tip. It does not explain pagination further, but the schema already describes page and pageSize. Overall, it is adequate for an agent to correctly invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by grouping parameters by action (e.g., '[list]' and '[get]' prefixes) in the schema descriptions, and in the free text it clarifies which parameters apply to each action. This improves understanding beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Look up workflow executions' and lists the types of executions (check_app_in_browser, trigger_crawl, test-suite runs). It differentiates between 'get' and 'list' actions, providing specific verb+resource semantics. No confusion with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when to use 'get' vs 'list' by specifying the parameters for each action. It also includes a practical tip about polling after a fresh check_app_in_browser run. However, it does not explicitly state when not to use this tool or compare it to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
probe_pageProbe PageARead-only
Probe one or more URLs and return their rendered state — screenshot, page metadata (title/finalUrl/statusCode/loadTimeMs), structured console errors, and per-URL network summary (refetch loops collapse into one row by origin+pathname).
WHEN TO USE: "did I just break /settings?" / "smoke-test these 5 routes after my refactor" / "what's actually rendering at /dashboard?" — fast (<10s for 1 URL, <25s for 20), no LLM cost, no agent loop.
NOT FOR: scenario verification (sign in → click X → assert Y), interaction (clicks, form fills, scrolls), or anything requiring agent decisions. Use check_app_in_browser for those.
LOCALHOST SUPPORT: any localhost URL is auto-tunneled. Pre-flight TCP probe fails fast (<2s) if the dev server isn't listening.
BATCH MODE: pass up to 20 targets in one call to share browser session + tunnel — dramatically faster than firing parallel single-URL probes (one execution unit, not N). Per-URL waitForSelector / waitForLoadState / timeoutMs override defaults.
READINESS: navigation settles on CONTENT (the page's DOM going quiet), bounded — not on network silence, which never arrives on a live app, and not on 'load', which blocks on third-party embeds. The default is right for SPAs; reach for waitForSelector, not waitForLoadState, when you need to wait for something specific.
A single failed target's error appears in result.error without failing the whole batch — the other results stay valid.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | Yes | 1-20 URLs to probe. Each entry can carry its own per-URL wait config. | |
| repoName | No | GitHub repository name (e.g. 'my-org/my-repo'). Auto-detected from the current git repo — only provide this to scope the probe to a different project context. | |
| includeHtml | No | If true, each result includes the page's outerHTML. Default false to keep response size sane. | |
| captureScreenshots | No | If true (default), one PNG screenshot is returned per target. Set false for very large batches or when only the structured data matters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context far beyond the annotations: localhost auto-tunneling with fast-fail pre-flight probe, batch-mode session/timeout sharing, the content-settle readiness semantics ('DOM going quiet' rather than network idle or load), and partial-failure behavior where a single failed target's error appears in result.error without failing the whole batch. The readOnlyHint and openWorldHint annotations are consistent with this read-only probing tool, and there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is lengthy but deliberately sectioned with labeled headers (WHEN/WONT NOT use, LOCALHOST SUPPORT, BATCH MODE, READINESS), so an agent can scan or read with minimal overhead. Every sentence carries a distinct functional fact; a few points (e.g., the full waitForLoadState/networkidle discussion) could be tightened but are not filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the return contract - and it does: it lists screenshot, title/finalUrl/statusCode/loadTimeMs, structured console errors, per-URL network summary, and the includeHtml option. Batch limits, localhost handling, timeouts, wait options, and error semantics are all covered; nothing an agent needs to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Since schema description coverage is already 100%, the baseline is 3 and the schema does the heavy lifting. The description adds genuine decision-making beyond that baseline: waitForSelector nuance for SPA mounts, the explanation that networkidle is accepted but never issued against live sites, and batch-mode guidance that up to 20 targets share one execution unit for speed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource - 'Probe one or more URLs and return their rendered state' - and enumerates the exact return payload (screenshot, title/finalUrl/statusCode/loadTimeMs, console errors, per-URL network summary). It also distinguishes itself from its sibling by naming check_app_in_browser explicitly in the NOT FOR section.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The WHEN TO USE section gives concrete agent-facing queries ('did I just break /settings?', 'smoke-test these 5 routes') and the decision constraints (fast, no LLM cost, no agent loop). The NOT FOR section explicitly rules out scenario verification and interaction and names the alternative: 'Use check_app_in_browser for those.' An agent knows exactly when to pick this tool over its sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projectProjectA
Manage DebuggAI projects. Pass an "action":
"get" {uuid} → one project with full detail.
"list" {q?, page?, pageSize?} → paginated project summaries.
"create" {name, platform, (teamUuid|teamName), (repoUuid|repoName)} → create a project. The repo must be GitHub-linked; names resolve by case-insensitive exact match.
Note: there is no update/delete here — rename/delete a project from the DebuggAI web app.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | [list] Free-text search. | |
| name | No | [create] Project name. | |
| page | No | [list] Page (1-indexed). | |
| uuid | No | [get] Project UUID. | |
| action | Yes | Operation to perform. | |
| pageSize | No | [list] Page size (1..200). | |
| platform | No | [create] Platform, e.g. "web". | |
| repoName | No | [create] GitHub repo name "org/repo" (or repoUuid). | |
| repoUuid | No | [create] GitHub repo UUID (or repoName). | |
| teamName | No | [create] Team name (or teamUuid). | |
| teamUuid | No | [create] Team UUID (or teamName). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by detailing that 'create' requires the repo to be GitHub-linked and names resolve by case-insensitive exact match. Annotations indicate not read-only and not destructive, which aligns with the create action. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with a clear structure: an introductory sentence followed by bullet-style action definitions. It is concise and front-loaded, though a list or subheadings could improve scanability. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema, the description adequately describes return types for each action (full detail vs. paginated summaries). It covers all actions and notes important constraints, but lacks details on error handling or pagination behavior beyond page/pageSize.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with descriptions, but the description augments this by grouping parameters per action (e.g., (teamUuid|teamName)) and adding constraints like 'repo must be GitHub-linked'. This provides useful context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages DebuggAI projects and enumerates three distinct actions (get, list, create), each with a specific verb and resource. It explicitly notes that update/delete are not available, differentiating from any potential sibling tools for project mutation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear guidance on when to use each action (e.g., 'get' for full detail, 'list' for summaries) and explicitly states that update/delete are not available here, directing to the web app. While it doesn't compare directly to the listed sibling tools, the siblings are sufficiently different (e.g., executions, browser checks) that the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_caseTest CaseADestructive
Manage individual test cases within a suite. Pass an "action":
"create" {name, description, agentTaskDescription, suiteUuid|(suiteName+project), relativeUrl?, maxSteps?} → add a test case (NOT auto-run).
"update" {testUuid, name?, description?, agentTaskDescription?} → patch a test case.
"delete" {testUuid, confirm?} → soft-delete (DESTRUCTIVE; requires confirmation).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Test case name. | |
| action | Yes | Operation to perform. | |
| confirm | No | [delete] Set true to confirm deletion (when the client cannot prompt). | |
| maxSteps | No | [create] Max agent steps (1..100). | |
| testUuid | No | [update/delete] Test case UUID. | |
| suiteName | No | [create] Suite name (requires a project identifier). | |
| suiteUuid | No | [create] Suite UUID. | |
| description | No | Test case description. | |
| projectName | No | [create] Project name (or projectUuid). | |
| projectUuid | No | [create] Project UUID (or projectName). | |
| relativeUrl | No | [create] Starting path, must start with "/". | |
| agentTaskDescription | No | What the AI agent should do and verify. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint=true), the description explicitly warns that delete is destructive and requires confirmation, clarifies that create does not auto-run the test, and mentions soft-delete. This adds valuable behavioral context, though it does not cover rate limits or authorization.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and well-structured: a one-sentence overview followed by clear action-specific bullet points. Every sentence adds value, with no unnecessary content. The front-loaded purpose immediately orients the agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, 3 actions, and no output schema, the description covers the parameter requirements well but omits return values for create, update, and delete. The absence of output schema documentation is a gap, though annotations partially compensate for behavioral hints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description groups parameters by action, showing required combinations (e.g., suiteUuid or suiteName+project for create). While the schema already uses action-prefixed descriptions, the description's structured grouping significantly aids understanding. Baseline 3 due to 100% schema coverage, but extra value raised score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages test cases within a suite and enumerates three actions (create, update, delete) with specific parameter requirements. It distinguishes itself from sibling tools like test_suite and executions by focusing on individual test case operations and noting that create does not auto-run.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit usage guidance through action-specific parameter lists (e.g., suiteUuid vs. suiteName+project for create), but does not explicitly state when to use this tool over alternatives like test_suite or executions. No direct comparison to siblings is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_suiteTest SuiteADestructive
Manage and run test suites. Identify a suite by suiteUuid, or suiteName + a project identifier (projectUuid|projectName). Pass an "action":
"list" {projectUuid|projectName, search?, page?, pageSize?} → paginated suites with status/pass-rate.
"create" {name, description, projectUuid|projectName} → create a suite.
"run" {suiteUuid|(suiteName+project), targetUrl?} → run all tests async. Poll with action:"results".
"results" {suiteUuid|(suiteName+project)} → suite + per-test outcomes.
"delete" {suiteUuid|(suiteName+project), confirm?} → soft-delete (DESTRUCTIVE; requires confirmation).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | [create] Suite name. | |
| page | No | [list] Page (1-indexed). | |
| action | Yes | Operation to perform. | |
| search | No | [list] Text filter over name/description. | |
| confirm | No | [delete] Set true to confirm deletion (when the client cannot prompt). | |
| pageSize | No | [list] Page size (1..100). | |
| suiteName | No | Test suite name (requires a project identifier). | |
| suiteUuid | No | Test suite UUID. | |
| targetUrl | No | [run] Override the default test target (full URL). | |
| description | No | [create] Suite description. | |
| projectName | No | Project name (or projectUuid). | |
| projectUuid | No | Project UUID (or projectName). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations mark destructiveHint=true, and the description adds context by noting that the 'delete' action is a soft-delete that requires confirmation. It also discloses that 'run' executes tests asynchronously and suggests polling with the 'results' action. While the description does not detail all edge cases, it sufficiently complements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with a clear introductory sentence followed by a bulleted list of actions. It is concise for the complexity (12 parameters) but could be slightly tighter by removing redundant phrasing (e.g., repeated identification pattern). Overall, it is well-organized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema and the tool's complexity (multiple actions, async behavior), the description covers identification and action parameters well but does not describe return values (e.g., paginated list format, test outcomes structure). Agents would need additional inference for expected outputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with descriptions, but the description adds value by grouping parameters per action (e.g., [list] parameters, [create] parameters) and explaining composite identifiers like 'suiteName + a project identifier'. This reduces ambiguity beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Manage and run test suites' and enumerates five specific actions (list, create, run, results, delete), each with distinct purposes. This distinguishes the tool from siblings like 'test_case' and 'executions' by focusing on test suite lifecycle management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on how to identify a suite (by UUID or name+project) and details each action's parameters. However, it does not explicitly contrast with sibling tools (e.g., when to use 'test_case' instead of 'test_suite') or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_crawlTrigger App CrawlA
Trigger a browser-agent crawl of a web app to build the project's knowledge graph. The crawl systematically explores pages, UI states, and navigation flows, then populates the backend's knowledge graph so future evaluations and tests have context about the app.
LOCALHOST SUPPORT: Pass any localhost URL (e.g. http://localhost:3000) and it Just Works. A secure tunnel is automatically created so the remote browser can reach your local dev server.
WHEN TO USE: after a significant new feature, a new environment, or when onboarding a project. NOT for per-change verification — use check_app_in_browser for that.
SCOPE: one crawl per call against one URL. The crawl is long-running (minutes to tens of minutes depending on app size) and populates backend state asynchronously; the tool returns the execution status once the workflow completes. This does NOT return pass/fail — it returns executionId + status + outcome.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to crawl. Can be any public URL or a localhost/local dev server URL. For localhost URLs, a secure tunnel is automatically created — just make sure your dev server is running on that port. | |
| password | No | The real password for the username above. Do NOT guess. | |
| repoName | No | GitHub repository name (e.g. 'my-org/my-repo'). Auto-detected from the current git repo — only provide this to run against a different project. | |
| username | No | A real, existing account email for the target app. Do NOT invent credentials — use one from the available credentials or ask the user. | |
| projectUuid | No | UUID of the project whose knowledge graph the crawl should populate. Auto-detected from the current git repo if omitted. | |
| credentialId | No | UUID of a specific credential for authenticated crawls. See available credentials in the tool description above. | |
| environmentId | No | UUID of a specific environment to use for the crawl. See available environments in the tool description above. | |
| credentialRole | No | Pick a credential by role (e.g. 'admin', 'guest') from the resolved environment. | |
| timeoutSeconds | No | Maximum wall-time the crawl may run, in seconds (1..1800). Backend enforces this per workflow execution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate openWorldHint=true (side effects) and readOnlyHint=false, and the description aligns by detailing that the crawl populates a knowledge graph asynchronously. It adds critical behavioral context: localhost support via automatic tunneling, long-running nature, and that the return value is execution status (not pass/fail). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (LOCALHOST SUPPORT, WHEN TO USE, SCOPE) and front-loads the primary purpose. It is efficient but slightly verbose in parameter descriptions (e.g., repeating credential guidance). Still, every section serves a purpose and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (9 parameters, no output schema, no nested objects), the description covers all necessary aspects: purpose, usage context, behavioral traits, and parameter semantics. It explains what the tool returns (executionId+status+outcome) and addresses long-running behavior. No major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant value beyond the schema by explaining localhost handling for 'url', auto-detection for 'projectUuid' and 'repoName', and important caveats for 'username' and 'password' (e.g., 'do NOT invent credentials'). It also clarifies optional overrides for environment and credential. This extra context raises the score to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool triggers a browser-agent crawl to build a project's knowledge graph. It uses a specific verb ('trigger') and resource ('crawl'), and explicitly distinguishes it from the sibling tool 'check_app_in_browser' by identifying the appropriate use case (post-feature vs. per-change verification).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use (after significant features, new environments, onboarding) and when not to use (per-change verification, recommending check_app_in_browser instead). It also clarifies scope (one crawl per call) and expected duration (minutes to tens of minutes), leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v4.2.2- Changed
check_app_in_browser1 field changed- added
Input schema / properties / freshSessionAdded value: +{ + "description": "Default false. Set true to force a REAL login instead of reusing the warm session the backend keeps per account. Use when the login flow itself is what you're checking, when you suspect the stored session is stale, or when the app's only route between personas is a logout. Costs one login; the run re-captures afterwards, so later runs stay fast.", + "type": "boolean" +}
- Changed
environment4 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "get", - "list", - "create", - "update", - "delete" -]New value: +[ + "get", + "list", + "create", + "update", + "delete", + "sessions", + "clearSessions" +] - changed
Input schema / properties / confirm / descriptionPrevious value: -"[delete] Set true to confirm deletion (when the client cannot prompt)."New value: +"[delete/clearSessions] Set true to confirm (when the client cannot prompt). clearSessions only needs it when no username/credentialId narrows it." - added
Input schema / properties / credentialIdAdded value: +{ + "description": "[sessions/clearSessions] Narrow to one stored credential by UUID.", + "type": "string" +} - added
Input schema / properties / usernameAdded value: +{ + "description": "[sessions/clearSessions] Narrow to one account. Matched case-insensitively.", + "type": "string" +}
- Changed
probe_page2 fields changed- changed
Input schema / properties / targets / items / properties / timeoutMs / descriptionPrevious value: -"Per-URL navigation timeout in milliseconds (1000-30000, default 10000)."New value: +"Per-URL budget in milliseconds for navigating AND settling this target (1000-30000, default 10000). The content settle spends what the navigation left over, so this is the whole cost of the target, not just the goto." - changed
Input schema / properties / targets / items / properties / waitForLoadState / descriptionPrevious value: -"When to consider the page 'loaded' before capturing. Default 'load'. Use 'networkidle' for SPAs to wait until the bundle finishes rendering."New value: +"When to consider the page ready to capture. Default 'domcontentloaded', followed by a bounded content settle (the page's DOM going quiet) — that is what actually makes a client-rendered SPA safe to screenshot, and it needs no override. Only override for a specific reason: 'load' additionally blocks on every sub-resource, including third-party iframes and images we do not control, so a slow embed can time the whole probe out. 'networkidle' is accepted for compatibility but is never issued — a live site's network does not go idle (analytics, polling, websockets, ads) — and behaves as 'domcontentloaded'. To wait on something specific, use waitForSelector."
6 tool updates
v3.10.0- Changed
check_app_in_browser6 fields changed- changed
Input schema / properties / auth / descriptionPrevious value: -"Optional auth-precondition for a 'log in THEN deep-navigate' check. Set precondition:'login' to authenticate first (using the environment's credentials), then land on deepUrl. Use this instead of hoping the agent signs itself in at a login wall."New value: +"Optional auth-precondition for a 'log in THEN deep-navigate' check. Set precondition:'login' to authenticate first, then land on deepUrl. Use this instead of hoping the agent signs itself in at a login wall. Pass username/password here to pin WHICH account it authenticates as; omit them to use the environment's default credential." - added
Input schema / properties / auth / properties / passwordAdded value: +{ + "description": "Password for auth.username.", + "type": "string" +} - added
Input schema / properties / auth / properties / usernameAdded value: +{ + "description": "Account to authenticate as for the precondition login. Overrides the environment's default credential.", + "type": "string" +} - added
Input schema / properties / loginCredentialsAdded value: +{ + "description": "Accounts the agent may sign in as when it hits a login form DURING the task — not just the first login. Use this for flows that authenticate part-way through, e.g. set a password, get bounced to sign-in, then log in as the account you just provisioned. Stating credentials only in `description` is not enough: pass them here and the agent uses exactly these values. Overrides the environment's default credential.", + "items": { + "additionalProperties": false, + "properties": { + "label": { + "description": "Optional human label (e.g. 'newly invited user') to disambiguate in the task text.", + "type": "string" + }, + "password": { + "description": "That account's password.", + "type": "string" + }, + "username": { + "description": "Account email/username to type into the login form.", + "type": "string" + } + }, + "required": [ + "username", + "password" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / useEnvironmentCredentialsAdded value: +{ + "description": "Default true. Set false to forbid the agent from ever auto-filling the environment's stored credentials — it signs in only as an account this call named (username/password, credentialId, credentialRole, loginCredentials, or auth.username), or not at all. Use when a run must prove a SPECIFIC account's experience and a silent fallback to the default test user would invalidate it.", + "type": "boolean" +} - changed
Input schema / properties / username / descriptionPrevious value: -"A real, existing account email for the target app. Do NOT invent or guess credentials — use one from the available credentials listed above, or ask the user. The browser agent will type this into the login form."New value: +"A real, existing account email for the target app. Do NOT invent or guess credentials — use one from the available credentials listed above, or ask the user. The browser agent will type this into the login form. Takes precedence over the environment's default credential for EVERY login in the run."
- Added
environment - Added
executions - Added
project - Added
test_case - Added
test_suite
7 tool updates
v3.7.4- Added
check_app_in_browser - Removed
environment - Removed
executions - Added
probe_page - Removed
project - Removed
test_case - Removed
test_suite
2 tool updates
v3.7.2- Removed
check_app_in_browser - Removed
probe_page
1 tool update
v3.7.0- Changed
check_app_in_browser1 field changed- added
Input schema / properties / authAdded value: +{ + "additionalProperties": false, + "description": "Optional auth-precondition for a 'log in THEN deep-navigate' check. Set precondition:'login' to authenticate first (using the environment's credentials), then land on deepUrl. Use this instead of hoping the agent signs itself in at a login wall.", + "properties": { + "deepUrl": { + "description": "Optional URL to navigate to and evaluate AFTER login (e.g. a deep settings page). Falls back to `url` if omitted.", + "type": "string" + }, + "entryUrl": { + "description": "Optional URL of the login page to authenticate on.", + "type": "string" + }, + "environmentId": { + "description": "UUID of the environment whose credentials to log in with. See available environments in the tool description above.", + "type": "string" + }, + "precondition": { + "description": "'login' = authenticate before evaluating; 'none' (default) = no login precondition.", + "enum": [ + "login", + "none" + ], + "type": "string" + } + }, + "type": "object" +}
23 tool updates
v3.0.1- Removed
create_environment - Removed
create_project - Removed
create_test_case - Removed
create_test_suite - Removed
delete_environment - Removed
delete_project - Removed
delete_test_case - Removed
delete_test_suite - Added
environment - Added
executions - Removed
get_test_suite_results - Added
project - Removed
run_test_suite - Removed
search_environments - Removed
search_executions - Removed
search_projects - Removed
search_test_suites - Added
test_case - Added
test_suite - Changed
trigger_crawl1 field changed- removed
Input schema / properties / headlessRemoved value: -{ - "description": "Run the browser in headless mode. Defaults to backend configuration.", - "type": "boolean" -}
- Removed
update_environment - Removed
update_project - Removed
update_test_case
9 tool updates
v2.9.0- Added
create_test_case - Added
create_test_suite - Added
delete_test_case - Added
delete_test_suite - Added
get_test_suite_results - Added
run_test_suite - Added
search_test_suites - Changed
update_environment3 fields changed- added
Input schema / properties / addCredentialsAdded value: +{ + "description": "Add new login credentials to the environment. Each entry requires label, username, password. role is optional.", + "items": { + "additionalProperties": false, + "properties": { + "label": { + "description": "Human-readable name (e.g. \"admin user\", \"test account\").", + "type": "string" + }, + "password": { + "description": "Password. Write-only — never returned.", + "type": "string" + }, + "role": { + "description": "Optional role tag (e.g. \"admin\", \"guest\").", + "type": "string" + }, + "username": { + "description": "Login email or username.", + "type": "string" + } + }, + "required": [ + "label", + "username", + "password" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / removeCredentialIdsAdded value: +{ + "description": "UUIDs of credentials to delete.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / updateCredentialsAdded value: +{ + "description": "Patch existing credentials by UUID. Only specified fields change.", + "items": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "password": { + "description": "Write-only — never returned.", + "type": "string" + }, + "role": { + "type": "string" + }, + "username": { + "type": "string" + }, + "uuid": { + "description": "UUID of the credential to update.", + "type": "string" + } + }, + "required": [ + "uuid" + ], + "type": "object" + }, + "type": "array" +}
- Added
update_test_case
13 tool updates
v2.6.1- Added
check_app_in_browser - Added
create_environment - Added
create_project - Removed
debugg_ai_test_page_changes - Added
delete_environment - Added
delete_project - Added
probe_page - Added
search_environments - Added
search_executions - Added
search_projects - Added
trigger_crawl - Added
update_environment - Added
update_project
1 tool update
v1.0.0- First observed
debugg_ai_test_page_changes
TDQS
Each tool has a distinct and well-defined purpose: executions for workflow history, check_app_in_browser for interactive browsing, probe_page for fast static checks, trigger_crawl for knowledge graph building, and project/environment/test_suite/test_case for resource management. No two tools overlap in functionality.
All tool names follow a consistent lowercase_with_underscores pattern (e.g., check_app_in_browser, probe_page, trigger_crawl). The pattern is uniform across all 8 tools, making it predictable for an agent.
With 8 tools, the server is well-scoped for its domain of debugging and testing. It covers essential operations without being overwhelming or too sparse.
The tool set covers the main workflows: project/environment setup, test suite/case management, and browser-based checks. However, test_case lacks a 'list' or 'get' action, which is a minor gap given that test_suite results provide per-test outcomes indirectly.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Browser-based QA for AI-built software. Test pages with real browsers via agents.
AI QA tester — real browsers scan sites for bugs, SEO, perf, and accessibility issues via chat.
AI QA that runs your app in a browser on every pull request: projects, test targets, test cases.
End-to-end API testing — generate and run tests from OpenAPI, curl, Postman, or real user traffic.
Related MCP Servers
- AlicenseAqualityDmaintenanceRun real Playwright E2E tests from your AI coding agent.420MIT
- AlicenseNot gradedqualityBmaintenanceAutonomous QA platform powered by Claude + Playwright that allows AI to write, run, and fix tests for any project.MIT
- FlicenseNot gradedqualityDmaintenanceEnd-to-end AI test generation and QA automation server that orchestrates auto-detection, browser exploration, test generation, execution, and dashboard analysis directly from your IDE.2-
- AlicenseAqualityCmaintenanceAI-native browser testing, directly from your coding agent.3MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/debugg-ai/debugg-ai-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server