TestNeo
TestNeo Docs Claude Desktop · MCP

Proven flow ~10 minutes

Run TestNeo from Claude Desktop

Connect Claude Desktop to TestNeo MCP, then drive QA from chat: list projects, run a login flow, check release readiness, and get a PR Release Brief — without hopping through the product UI for every step.

This guide is the Claude Desktop path. Same MCP server works in Cursor, VS Code + Copilot, Windsurf, and Zed. Full reference: MCP docs · Playwright code path: Playwright AI SDK.

What you'll do

API key Claude config Quit & reopen List projects Run login Readiness / PR Brief

When it works, Claude calls TestNeo tools locally. Your tn_… key stays in the config file — never paste it into the chat.

Prerequisites

1 · Get your TestNeo API key

1 Create or copy a key

  1. Sign in at app.testneo.ai.
  2. Open Profile / Settings → API keys (labels may vary slightly).
  3. Generate a new key and copy it once (tn_…).
  4. Keep it private — treat it like a password.

2 · Configure Claude Desktop

Config file paths

OSFile
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json

If the file does not exist, create it. If it already has other MCP servers, merge the "testneo" block under mcpServers — do not wipe existing entries.

JSON to paste

Replace YOUR_API_KEY with your real tn_… key. Start with writes off.

{
  "mcpServers": {
    "testneo": {
      "command": "npx",
      "args": ["-y", "@testneo/mcp-server@0.2.1"],
      "env": {
        "TESTNEO_BASE_URL": "https://app.testneo.ai",
        "TESTNEO_WEB_APP_URL": "https://app.testneo.ai",
        "TESTNEO_API_KEY": "YOUR_API_KEY",
        "TESTNEO_MCP_ALLOW_WRITE": "false",
        "TESTNEO_MCP_TELEMETRY_JSONL": "true",
        "TESTNEO_MCP_DEFAULT_EXECUTION_MODE": "cloud",
        "TESTNEO_MCP_PREFER_LOCAL_AGENT": "false",
        "TESTNEO_MCP_DEFAULT_EXECUTION_PLATFORM": "local",
        "TESTNEO_MCP_REQUIRE_LOCAL_AGENT_FOR_BATCH": "false",
        "TESTNEO_MCP_WAIT_FOR_AGENT_MS": "0"
      }
    }
  }
}

Default = cloud execution. With TESTNEO_MCP_DEFAULT_EXECUTION_MODE: "cloud" and PREFER_LOCAL_AGENT: "false", TestNeo Cloud runs the browser — you do not need a local agent. Only switch to local mode for VPN / internal apps (see Local agent vs cloud).

Self-hosted API? Set TESTNEO_BASE_URL (and usually TESTNEO_WEB_APP_URL) to your API / app origin. Prefer http://127.0.0.1:PORT over localhost if the IDE mis-resolves.

Example config also lives at docs/mcp.json.example.

3 · Restart Claude & confirm tools

3 Fully quit, then reopen

  1. Quit Claude Desktop completely (macOS: Claude → Quit; do not only close the window).
  2. Reopen Claude Desktop.
  3. Start a new chat. You should see TestNeo / MCP tools available (hammer / tools UI varies by Claude version).
  4. First start may take a few seconds while npx downloads @testneo/mcp-server.

4 · Read-only smoke test

With TESTNEO_MCP_ALLOW_WRITE=false, discovery still works. Paste these one at a time:

Validate my TestNeo connection. Summarize success and any account hint.
List my TestNeo projects. Show project_id and name for each.
On project_id <PROJECT_ID>, find test cases matching "login". List id and name.

If Claude lists your projects, the bridge works. Save a project_id and a login test_case_id for the next steps.

5 · Enable writes (only when ready to run)

  1. Edit the config: set "TESTNEO_MCP_ALLOW_WRITE": "true".
  2. Quit and reopen Claude Desktop again.
  3. Runs still need confirm: true on the tool call — Claude should ask or you should say “confirm true”.

Two locks: machine flag ALLOW_WRITE + per-call confirm. Casual “run everything” prompts cannot mutate until both are set.

Local agent vs cloud (before you run)

Claude Desktop only triggers the run. Something still has to drive the browser.

ModeMCP envLocal agent needed?
Cloud (default) TESTNEO_MCP_DEFAULT_EXECUTION_MODE=cloud
TESTNEO_MCP_PREFER_LOCAL_AGENT=false
No — TestNeo Cloud executes. Best for SauceDemo / public URLs.
Local agent TESTNEO_MCP_DEFAULT_EXECUTION_MODE=local
TESTNEO_MCP_PREFER_LOCAL_AGENT=true
optional TESTNEO_MCP_REQUIRE_LOCAL_AGENT_FOR_BATCH=true
TESTNEO_MCP_WAIT_FOR_AGENT_MS=60000
Yes — start the TestNeo local agent and keep it connected before any confirm: true run.

If you use local mode: the agent must be up and connected or runs queue / fail with “agent not connected.” Check first:

Call testneo_get_local_agent_status. Report agent_registered, agent_connected, seconds_since_heartbeat, and setup_url. If not connected, give setup steps only — do not run tests yet.

Local-agent env snippet (replace the five execution lines in your Claude config, then quit/reopen Claude):

"TESTNEO_MCP_DEFAULT_EXECUTION_MODE": "local",
"TESTNEO_MCP_PREFER_LOCAL_AGENT": "true",
"TESTNEO_MCP_DEFAULT_EXECUTION_PLATFORM": "local",
"TESTNEO_MCP_REQUIRE_LOCAL_AGENT_FOR_BATCH": "true",
"TESTNEO_MCP_WAIT_FOR_AGENT_MS": "60000"

More detail: MCP Quickstart — cloud vs local agent · Troubleshooting — local agent.

6 · Run a login test (proven path)

Use your real project_id, test case, and environment name (often dev or staging). With the default cloud config you can run immediately. If you switched to local mode, confirm the agent is connected first (prompt above).

Preview first (no execute)

Call testneo_run_generated_test_pipeline with test_case_id <TEST_CASE_ID>, confirm false, environment_name "<ENV_NAME>". Summarize what would run.

Execute + wait + report

Call testneo_run_generated_test_pipeline with test_case_id <TEST_CASE_ID>, confirm true, environment_name "<ENV_NAME>", idempotency_key "claude-login-001". Summarize pipeline.analytics_summary, canonical_status, execution_id, and if failed the first error_message.

Friendly one-liner (also works)

On project <PROJECT_ID>, find the login test and run it on environment "<ENV_NAME>" with confirm true. Tell me pass or fail and the execution link if available.

Success looks like: Claude returns pass/fail, an execution_id, and you can open the run in TestNeo UI under the project’s executions tab.

If it failed

Call testneo_get_failure_bundle with execution_id "<EXECUTION_ID>", include_nlp_patch_suggestion true. Summarize root cause and whether suggested_nlp_patch is safe to apply.

Demo flows (recommended order)

Use these as a live walkthrough. Replace <PROJECT_ID> with your project (e.g. 40). Keep confirm: false unless you intend to run tests.

A Login run B Release readiness C PR Brief Explain / fix

Flow A — Login execute (~2 min)

  1. Validate connection + list projects.
  2. Find login test on <PROJECT_ID>.
  3. Pipeline preview → execute with confirm true (writes on).
Using TestNeo MCP: validate connection, list projects, confirm project_id <PROJECT_ID> exists. Then find test cases matching "login" and list id + name.
On project <PROJECT_ID>, find the login test and run it on environment "<ENV_NAME>" with confirm true. Tell me pass or fail and execution_id.

Flow B — Release readiness / ship decision (~3 min, no git needed)

Best opener when you already have data in the project (history, executions, memory). No branch required.

For TestNeo project_id <PROJECT_ID>, give me a release readiness check.

1) Call testneo_get_release_readiness with project_id <PROJECT_ID> if available.
2) Call testneo_get_pr_validation_history with project_id <PROJECT_ID>, limit 15.
3) Call testneo_run_agent_workflow with workflow_type "qa_intelligence_workflow", project_id <PROJECT_ID>, range "30d", top_failures 5, rerun_limit 5.

Then answer in plain language:
- PASS / WARN / BLOCK trend from recent PR validations
- Top failure themes from executions
- Go / Hold / Go-with-conditions (with the specific condition)
- Top 3 actions before we ship

Do not run any tests. confirm stays false.
Call testneo_get_pr_validation_history with project_id <PROJECT_ID>, limit 20.
Present a table: workflow_id | risk level | score | date | short summary.
Then say: is this project trending safer or riskier for release? One paragraph.

Flow C — PR validation → Release Brief (~5 min)

Needs git context (repo open / Claude can detect SHAs) or you paste base_sha, head_sha, owner, name, PR number, and changed files. Never invent SHAs.

Validate this PR for TestNeo project_id <PROJECT_ID>.

1) Detect git context from the workspace:
   - head_sha = git rev-parse HEAD
   - base_sha = git merge-base HEAD origin/main (or origin/master)
   - changed_files from git diff --name-status <base_sha> HEAD
   - repository owner/name from git remote get-url origin
2) If no git repo is available, ask me for base_sha, head_sha, owner, name, PR number, and changed_files — do not invent SHAs.

3) Call testneo_pr_validation_workflow with:
   - project_id: <PROJECT_ID>
   - repository: { owner, name }
   - pull_request: { number: <PR_NUMBER> }
   - git: { base_sha, head_sha, changed_files }
   - sync_jira_before_validate: true
   - execution: { run_impacted_tests: true }
   - confirm: false

4) Display the FULL Release Brief (do not truncate): risk level, score, findings, merge recommendation, workflow_id.
5) If risk is BLOCK or WARN, immediately offer explain + fix plan.
Call testneo_explain_failure with workflow_id "<WORKFLOW_ID>", include_rerun_plan true.
Explain each blocking finding in plain English and list exact tests to rerun.
Call testneo_suggest_fix with workflow_id "<WORKFLOW_ID>", priority_filter "all".
Show NOW vs NEXT fixes and a re-validate plan.

Live demo tip: start with Flow B (wow, no git). Add Flow A if you want a green run. Finish with Flow C when a branch/PR is available. Natural one-liner: “Using TestNeo MCP on project <ID>: check release readiness. Should we ship?”

Prompt cookbook

Copy-paste prompts that work well in Claude Desktop. Replace placeholders. For role packs (C17–C20, EM1–EM9), see Prompt packs and standalone prompt packs.

Discover

Connection
Call testneo_validate_connection. Summarize success.
Projects
Call testneo_list_projects with limit 50. Table of project_id and name.
Find by name
Call testneo_find_test_cases with project_id <ID>, search "login". List id, name, tags.
Find by tags
Call testneo_list_tests_by_tags with project_id <ID>, tags ["smoke","login"], match_mode "intersection". List matches.
Unified contexts
Call testneo_list_unified_contexts with project_id <ID>, compact true. Table of id and name.
Resolve Figma context by name
Call testneo_get_unified_context_by_name with project_id <ID>, name_query "figma checkout", match_mode "auto". Return resolved_context_id.

Execute & triage

Local agent status (before local runs)
Call testneo_get_local_agent_status. Report agent_connected and setup_url. If false, stop — do not execute until the agent is up.
Pipeline preview
Call testneo_run_generated_test_pipeline with test_case_id <ID>, confirm false, environment_name "staging".
Pipeline execute
Call testneo_run_generated_test_pipeline with test_case_id <ID>, confirm true, environment_name "staging", idempotency_key "run-001". Summarize status and execution_id.
Batch by tags
Call testneo_run_batch_by_tags with project_id <ID>, tags ["smoke"], match_mode "union", confirm true, environment_name "staging", idempotency_key "batch-smoke-001".
Execution summary
Call testneo_get_execution_summary for execution_id "<EXEC>". Then logs with limit 80. Summarize pass/fail and first fix.
Failure bundle
Call testneo_get_failure_bundle with execution_id "<EXEC>", include_nlp_patch_suggestion true. Summarize cause + patch safety.
QA intelligence (30d)
Call testneo_run_agent_workflow with workflow_type "qa_intelligence_workflow", project_id <ID>, range "30d", top_failures 5. Summarize themes; do not rerun.

Generate from context / docs / Swagger

Generate from unified context
Call testneo_generate_tests_from_context with project_id <ID>, context_id <CTX>, test_types ["positive","negative","edge"], include_ui_tests true, max_tests 12, auto_align_saucedemo_route_map false. List generated ids and names.
SauceDemo-style auth generate
Call testneo_generate_tests_from_context with project_id <ID>, context_id <CTX>, test_types ["positive","negative","edge"], include_ui_tests true, max_tests 12, auth_preamble {"enabled": true, "preset": "saucedemo"}, persist_auth_preamble true, auto_align_saucedemo_route_map true.
Web AI Assistant (read-only Q&A)
Call testneo_ai_assistant_query with project_id <ID>, query "Summarize highest-risk user flows for automation", response_style "concise". Return assistant_reply.
Assistant scoped to Figma context
Call testneo_ai_assistant_query with project_id <ID>, context_name_query "figma checkout", query "What edge cases should UI tests cover?", response_style "detailed".

Swagger / OpenAPI upload + generate uses write tools — see Customer E2E playbook · Part F.

Release readiness (no git required)

Ship decision (hero)
For TestNeo project_id <ID>, give me a release readiness check: get_release_readiness (if available), pr_validation_history limit 15, qa_intelligence_workflow range 30d. Answer Go/Hold/Go-with-conditions with evidence. Do not run tests.
PR risk history table
Call testneo_get_pr_validation_history with project_id <ID>, limit 20. Table: workflow_id | risk | score | date | summary. Is the project trending safer or riskier?
QA intelligence cross-ref
Call testneo_get_pr_validation_history with project_id <ID>, limit 15. Call testneo_run_agent_workflow with workflow_type "qa_intelligence_workflow", project_id <ID>, range "7d", top_failures 3. Cross-reference PR blockers with execution themes. Go/hold recommendation.
Plain-language PM brief
Using TestNeo MCP on project <ID>: check release readiness and PR validation history. Should we ship? Give Go/Hold/Go-with-conditions with evidence. Do not run tests.

PR validation → Release Brief

Validate my PR (planning)
Validate my PR for project_id <ID>. Detect git base/head SHAs and changed_files (do not invent). Call testneo_pr_validation_workflow with sync_jira_before_validate true, execution.run_impacted_tests true, confirm false. Show the FULL Release Brief and workflow_id.
Validate + run impacted (writes on)
Same as validate my PR, but confirm true so impacted tests can run. If blocking_count > 0, call testneo_suggest_fix with priority_filter "now".
Explain blockers
Call testneo_explain_failure with workflow_id "<WORKFLOW_ID>", include_rerun_plan true. Plain English root cause + tests to rerun.
Fix plan NOW / NEXT
Call testneo_suggest_fix with workflow_id "<WORKFLOW_ID>", priority_filter "all". Show NOW vs NEXT and re-validate plan.
Full board detail
Call testneo_get_pr_validation_detail with workflow_id "<WORKFLOW_ID>". Summarize the full board for QA.
Pre-flight before coding
I will change login/auth on project <ID>. Find login tests, get_pr_validation_history limit 10, get_risk_signals for those test ids, optional pre_validate_hint. Report risky tests and what to validate before merge. No execution.

Engineering Memory

List patterns + trend
Call testneo_list_engineering_memory_patterns with project_id <ID>. Summarize top patterns, trend (worsening/stable), and what to watch on the next PR.
List memory entries
Call testneo_list_engineering_memory with project_id <ID>. Summarize recent bugs/incidents by area.
Incident matches (changed files)
Call testneo_get_incident_matches with project_id <ID> and changed_files from my branch (or sample paths like src/auth/login.ts). Summarize prior incidents and known fixes.
Sample paths (no git)
Call testneo_get_incident_matches with project_id <ID> and changed_files: [{"path":"src/auth/login.ts","status":"modified"},{"path":"src/checkout/CheckoutService.ts","status":"modified"}]. Summarize matches for an EM.

Deep dive: Release Intelligence guide · PR Validation in MCP docs · Workflow 7.

Security FAQ (what customers ask)

QuestionStraight answer
Does Claude get my API key? No — keep tn_… in Claude’s MCP env. Never paste it into chat.
Does Claude see my projects / executions? Yes, for that chat: whatever you ask plus tool results (names, statuses, error snippets). Same class of data you’d see in the TestNeo UI for that action.
Is the whole DB uploaded to Anthropic? No. Only tool calls Claude makes and their responses. Figma/PDF bytes stay on TestNeo unless a tool returns them into chat.
What about passwords? Use env secrets ({{password}}). Don’t hardcode credentials in NLP or prompts.
We can’t use any LLM on QA data Use TestNeo UI / API / n8n / CI instead. MCP is optional for AI-friendly teams.

More governance detail: Security & Governance.

Troubleshooting

SymptomFix
No TestNeo tools in Claude Quit Claude fully; check JSON validity; confirm Node 20+; wait for first npx download.
Connection / 401 Wrong or revoked TESTNEO_API_KEY; wrong TESTNEO_BASE_URL.
“Write tools are disabled” Set TESTNEO_MCP_ALLOW_WRITE=true, restart Claude, pass confirm: true.
project_precondition_failed Project needs a real http(s) base_url / website URL — not example.com.
Stale tools after upgrade Bump version in args (e.g. @0.2.1), run npx clear-npx-cache, quit/reopen Claude.
“Agent not connected” / run stuck If using local mode: start the TestNeo local agent, then testneo_get_local_agent_status. Or switch back to cloud + PREFER_LOCAL_AGENT=false for public apps.
Login fails with bad credentials Check environment variables in TestNeo; prefer {{username}} / {{password}} over hardcoded NLP.

Full list: MCP troubleshooting.

Next steps