mcp-test-tools
Files approved bug drafts as GitHub issues through the GitHub bug backend, using GITHUB_TOKEN and github_repo, with duplicate detection via the local index and GitHub issue search.
Files approved bug drafts as Jira issues through the Jira bug backend, using JIRA_BASE_URL, JIRA_EMAIL, JIRA_API_TOKEN, and jira_project; duplicate detection is limited to the local index.
Click on "Deploy 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., "@mcp-test-toolsrun the sample test suite and show me what failed"
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.
๐งช mcp-test-tools
An MCP server that lets an AI agent run tests, read the results and file bugs, with safe defaults.
Why this exists
Agents are good at reading a failing test and reasoning about it, but handing them a shell is risky: they can run anything, leak tokens to the code under test, or flood your bug tracker. This server gives an agent exactly the verbs a QA engineer needs, and nothing more:
run a suite โ read what failed and why โ file a bug a human has approved
It speaks the Model Context Protocol, so any MCP-compatible client or agent framework can use it.
Related MCP server: deploytest MCP server
What an agent can do
Tool | What it does |
| Show the suites a human configured, and whether each accepts a selector |
| Start a suite (optionally narrowed with |
| Status and counts of a run; can wait for it to finish |
| Recent runs |
| Failed (default), passed, skipped or all results of a run |
| Failure message, stack trace and captured output for one test |
| The end of the raw console output, for runs that crashed before reporting |
| New failures, fixed tests and still-failing tests between two runs |
| Draft a bug for a failed test, and file it only after |
| Bugs filed through this server |
prompt | A ready-made, human-in-the-loop triage workflow |
How it keeps an agent safe
flowchart LR
A[Agent] -->|suite name + vetted selector| S[mcp-test-tools]
S -->|no shell ยท minimal env ยท timeout| T[(Your tests)]
T -->|JUnit XML| S
S -->|redacted, truncated results| A
A -->|file_bug draft| S
S -.->|draft for a human| H{Person approves?}
H -->|confirm=true| B[Bug tracker]Risk | Control |
Agent runs arbitrary commands | It picks a suite name; commands live in a config a human wrote, run without a shell |
Argument injection via the selector | Only allow-listed options ( |
Tokens leak into the code under test | Tests run with a minimal environment; |
Runaway or hung runs | Per-suite timeout (the whole process tree is killed) and a concurrent-run limit |
Bug-tracker flooding |
|
Secrets in bug reports | API keys, bearer tokens, |
Prompt injection through test output | Results carry an explicit "untrusted data" note, the server's instructions say so, and nothing in test output can trigger an action |
Path tricks via run ids | Run ids are validated against a strict pattern |
Quick start
git clone https://github.com/TheByteCodeHQ/mcp-test-tools.git
cd mcp-test-tools
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]"
cp mcp-test-tools.example.toml mcp-test-tools.toml # Windows: copy ...The example config points at a small sample project with two deliberate failures. Start the server (stdio):
mcp-test-tools --config mcp-test-tools.tomlConnect a client
Add it to any MCP client that launches servers over stdio. The shape is usually:
{
"mcpServers": {
"test-tools": {
"command": "mcp-test-tools",
"args": ["--config", "/absolute/path/to/mcp-test-tools.toml"]
}
}
}Use the full path to the mcp-test-tools executable (or python -m mcp_test_tools) if it is inside a virtual environment. For a networked client use --transport streamable-http --host 127.0.0.1 --port 8000, and keep it on localhost unless you add authentication in front.
A session
you: Run the sample suite and tell me what's broken.
agent: run_tests(suite="sample") -> completed, 2 failed, 6 passed, 1 skipped
get_results(run_id=...) -> 2 failures
get_test_details(...) -> "DID NOT RAISE ValueError", "gateway returned 502"
"Two real failures: negative total for a 150% discount, and the gateway stub returns 502."
you: File the first one.
agent: file_bug(run_id=..., test_id=...) -> status: draft (shows you the draft)
you: Looks good.
agent: file_bug(..., confirm=true) -> status: filed, BUG-0001
agent: file_bug(..., confirm=true) -> status: duplicate of BUG-0001Configuration
[suites.unit]
description = "Unit tests"
command = ["{python}", "-m", "pytest", "-q", "--junitxml={junit}"] # must write JUnit XML to {junit}
cwd = "."
allow_selector = true
allowed_flags = ["-k", "-m", "-x", "--maxfail"]
timeout_seconds = 300
# env_passthrough = ["BASE_URL"]
[bugs]
backend = "local" # local | github | jira
max_per_run = 5Any runner that can emit JUnit XML works (pytest, Maven Surefire, TestNG, Jest with a reporter, and so on), because results are read from that file, not from console text.
Bug backends
Backend | Needs | Duplicate detection |
| nothing, writes Markdown files | local index |
|
| local index + issue search |
|
| local index only |
Credentials come from the environment, never from the config file.
Project layout
src/mcp_test_tools/
server.py MCP tools, prompt and CLI
runner.py suite execution, selector vetting, run store
junit.py JUnit XML parsing
bugs.py drafts, fingerprints, dedupe, local / GitHub / Jira backends
redact.py secret and personal-data redaction
config.py TOML config and validation
examples/sample-project/ pytest project with deliberate failures
tests/ 55 tests, including real MCP protocol runsTests
pytest
ruff check .The suite covers the selector rules (including injection attempts), the real execution of the sample project, timeouts and process cleanup, environment isolation, redaction, bug dedupe and caps, and the MCP protocol both in-process and through a real stdio subprocess.
Honest limits
Tested through the MCP SDK's own client, in-process and over stdio. It has not been tried against every desktop client or agent framework.
GitHub and Jira calls are tested against mocked HTTP, not live accounts. Jira duplicate detection uses the local index only.
Runs are tracked by the server process. If the server restarts mid-run, that run is reported as
lost.Redaction is pattern-based. It lowers risk but cannot guarantee that no secret ever appears in output.
Only the suites you configure can run, but those suites are real code with real side effects. Point them at safe environments.
Roadmap
Rerun-failed tool and flaky-test detection across runs
Live Jira duplicate search
Result history and trend resources
Optional token authentication for the HTTP transport
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Agentic AI quality engineering: run, debug and triage tests on real browsers and devices
Browser-based QA for AI-built software. Test pages with real browsers via agents.
AI agents use your app like your users, in real browsers, and report what is broken or confusing.
- AIVAOAuthworks.aiva
No-code, AI-assisted UI testing: record new tests, run existing ones, and monitor the results.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables automated end-to-end testing powered by Playwright where test cases are defined in natural language and executed by AI. Uses lightweight snapshot analysis with vision mode fallback for sophisticated testing scenarios.3Apache 2.0
- AlicenseAqualityDmaintenanceEnables AI agents to run reusable Playwright test fixtures against live deployments, providing structured test results, screenshots, and assertions.3MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to drive a real browser like a person โ crawling every page and role, running real user journeys, and auditing controls a DOM-based test misses โ so UI, accessibility and permission bugs are found and only the screens affected by recent changes are re-tested. Runs are script-driven and read-only by default, so testing costs no model tokens and nothing about the app is sent to an AI.MIT
- AlicenseAqualityAmaintenanceEnables AI agents to run, debug, and inspect Playwright end-to-end tests, returning structured pass/fail stats, failure diagnostics with actionable fix hints, live DOM inspection, selector validation, visual diffs, and flakiness verdicts instead of raw test output.111,348 npmMIT