testmcp
Lists and parses GitHub Actions artifacts containing test logs, extracting structured test results from CI pipelines.
Executes Jest tests and returns structured results with summary, failure details, and source context.
Executes Pytest tests using a layered fallback strategy (reportlog, JUnit XML, or verbose stdout parsing) and returns structured results.
Executes Vitest tests and returns structured results with summary, failure details, and source context.
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., "@testmcprun tests affected by my recent changes"
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.
testmcp
An MCP server that wraps existing test frameworks (Jest, Vitest, Pytest) and exposes structured, LLM-optimized results via MCP tools.
Why?
Test frameworks were designed for humans. LLMs get ANSI escape codes, watch mode prompts, and 5000-line outputs that blow up context windows. testmcp fixes this with:
Progressive disclosure — Get a summary first, drill into failures on demand
Structured output — JSON, not terminal formatting
Diff-aware testing — Run only tests affected by your git changes
Time-budgeted execution — Set a timeout, get partial results
Source enrichment — Failure reports include the relevant source code around each assertion
Watch mode protection — Impossible to accidentally enter interactive mode
Related MCP server: Testing MCP
Installation
git clone https://github.com/r-marques/testmcp.git
cd testmcp
yarn install
yarn buildConfigure as MCP server
Claude Code (recommended):
claude mcp add testmcp -- node /absolute/path/to/testmcp/dist/index.jsThis registers testmcp as a local stdio MCP server. Restart Claude Code after adding.
Other MCP clients (Cursor, Windsurf, etc.):
Add to your MCP configuration file:
{
"mcpServers": {
"testmcp": {
"command": "node",
"args": ["/absolute/path/to/testmcp/dist/index.js"]
}
}
}Verify it works
After restarting your MCP client, the testmcp tools should be available. In Claude Code you can verify with:
claude mcp list
# Should show: testmcp: node /path/to/testmcp/dist/index.js - ✓ ConnectedTools
Test Execution
Tool | Purpose |
| Auto-detect test frameworks in a project |
| Execute tests, return a compact summary |
| Git-aware: only run tests affected by changes |
| Drill into failures with source context |
| Single test deep-dive with full stack trace |
| Re-execute only previously failed tests |
| Coverage data from a previous run |
| List recent test run summaries |
CI Log Parsing
Tool | Purpose |
| Parse raw CI/test log text and extract structured test results. Auto-detects framework. |
| List artifacts from a GitHub Actions run |
| Download a GitHub Actions artifact and parse it as test results |
The CI tools enable a workflow where the LLM reads a CI workflow file to identify the right artifact, then uses parse_artifact to get structured results — no manual log parsing needed.
How It Works
The Progressive Disclosure Flow
Instead of dumping thousands of lines of test output, testmcp gives you information in layers:
Step 1: Run tests — Get a compact summary
run_tests({ projectDir: "/app" })
→ { total: 200, passed: 197, failed: 3, failedTests: ["auth > login > rejects expired token", ...] }Step 2: Drill into failures — Get failure details with source context
get_failures({ runId: "abc-123" })
→ For each failure:
- Concise error message
- 7 lines of source code around the assertion
- Test file and line numberStep 3: Deep dive — Full stack trace for a single test (only when needed)
get_test_detail({ runId: "abc-123", testName: "auth > login > rejects expired token" })
→ Complete error output with full stack traceThis approach uses 4-5x fewer tokens compared to raw test output in typical failure scenarios, because you never pay for the 197 passing tests you don't care about.
Diff-Aware Test Selection
run_affected analyzes your git changes through three layers:
Direct changes — Test files you modified are included
Naming conventions — Changed
src/api/client.ts? Looks fortests/api/client.test.tsImport scanning — Greps test files for imports of changed source files
Each selected test includes a reason explaining why it was chosen.
Time-Budgeted Execution
run_tests({ projectDir: "/app", timeout: 30000 })If the suite takes longer than 30 seconds, the process is killed and partial results are recovered. The response includes timedOut: true so you know results are incomplete.
Supported Frameworks
Framework | Detection | Output Parsing |
Jest |
|
|
Vitest |
|
|
Pytest |
| Layered fallback: |
testmcp auto-detects the framework and package manager (npm, yarn, pnpm, poetry). No configuration needed.
Pytest Fallback Chain
Pytest has no built-in JSON reporter, so testmcp uses a three-layer fallback strategy:
pytest-reportlog(primary) — JSONL format via--report-log. Streaming-friendly, survives timeouts. Requirespip install pytest-reportlog.--junitxml(fallback) — Built into pytest, zero dependencies. Standard JUnit XML format.Verbose stdout (last resort) — Parses
-v --tb=shortoutput with regex. Works everywhere.
The server automatically falls through the chain if a plugin isn't installed — no configuration needed.
Architecture
src/
├── index.ts # Entry: McpServer + StdioServerTransport
├── server.ts # 11 MCP tool registrations & handlers
├── types.ts # Core types
├── store.ts # In-memory test run storage (LRU, 50 runs)
├── adapters/
│ ├── base.ts # Abstract adapter interface
│ ├── jest.ts # Jest adapter
│ ├── vitest.ts # Vitest adapter (v1.x + v2+ formats)
│ └── pytest.ts # Pytest adapter (reportlog → junitxml → verbose)
├── ci/
│ ├── log-parser.ts # Framework detection + raw CI log parsing
│ └── artifacts.ts # GitHub Actions artifact listing + download + parsing
├── git/
│ └── diff-analyzer.ts # Git diff → affected test files
├── enrichment/
│ └── source-context.ts # Stack trace parser + source snippets
└── utils/
├── process.ts # Child process runner with timeout
└── detect.ts # Framework auto-detectionKey Design Decisions
Stdio transport only — No HTTP server, no ports. Works as a local subprocess for Claude Code and IDE integrations.
Subprocess isolation — Frameworks are spawned as child processes with
CI=true,TERM=dumb. Zero coupling to framework versions.In-memory store — Test runs stored by UUID with LRU eviction at 50 runs. Enables progressive drill-down without re-running tests.
Minimal dependencies — Only
@modelcontextprotocol/sdkandzod. Everything else uses Node.js built-ins.
Development
yarn build # Compile TypeScript
yarn dev # Run in dev mode (tsx)
yarn test # Run test suite (Vitest)
yarn test:watch # Run tests in watch modeLicense
MIT
Available Tools
11 toolsdiscoverC
Auto-detect test frameworks configured in a project directory
| Name | Required | Description | Default |
|---|---|---|---|
| projectDir | Yes | Absolute path to the project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it discloses almost nothing: whether the operation is read-only, what it returns (a list of framework names? config paths?), how multiple/zero frameworks are handled, or whether it inspects files on disk.
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?
A single tight sentence with the key action and scope front-loaded and no filler. It is appropriately sized, though its brevity is partly the result of omitting useful detail rather than sheer efficiency.
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 should explain what detection yields, and there are no annotations to cover safety or side effects. For a tool agents will call before running tests, essential context about the return value and error behavior 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?
Schema description coverage is 100%, so the single projectDir parameter (absolute path) is already fully documented in the schema. The description adds no additional semantics about the path, which matches the baseline for high schema coverage.
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 action (auto-detect) and resource (test frameworks configured in a project directory), which is far more informative than the vague name 'discover'. It is distinguishable from the run/parse/list siblings, though it never explicitly names them.
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?
No when-to-use guidance, no prerequisites, and no mention of alternatives among the many test-related siblings (list_runs, run_tests, etc.). Use is only weakly implied by the notion of detecting frameworks before acting on them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_coverageB
Get coverage data from a previous test run.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | Filter coverage to specific file paths | |
| runId | Yes | The run ID from a test run with coverage enabled |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not state that this is a read-only operation, what the returned coverage payload looks like, how large it might be, or how it behaves when coverage was never enabled for the run — significant gaps for a tool with zero annotation coverage.
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?
A single front-loaded sentence with no filler or redundancy. It is efficient, though arguably too terse to be appropriately sized for a data-retrieval tool.
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?
With no output schema and no annotations, the description needs to explain the return shape and preconditions (coverage must have been enabled on the run). It omits both, leaving the agent unable to predict the response or failure modes.
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 both parameters (runId and files) are already documented in the schema, making a 3 the baseline. The description adds only the 'previous test run' framing and no extra detail about filtering semantics or runId format beyond what the schema supplies.
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?
States a specific verb and resource ('Get coverage data') plus a scope qualifier ('from a previous test run'), which separates it from sibling write/run tools like run_tests and rerun_failed. It does not, however, explicitly contrast itself with the closest read siblings (get_failures, get_test_detail), so it falls short of a 5.
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?
'From a previous test run' implies it only applies to already-completed runs that had coverage enabled, which is useful context. But there is no explicit when-to-use vs. when-not guidance and no mention of what happens if the run lacked coverage, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_failuresB
Get detailed failure information for a test run, including source context around each failure.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The run ID from a previous run_tests or run_affected call |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. It usefully discloses that results are enriched with source context around each failure, but says nothing about read-only safety, large-run behavior, pagination, or what happens when a run has no failures.
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?
One sentence, front-loaded with the core action, and the enriching detail (source context) is appended efficiently. No wasted 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?
With no output schema and no annotations, the description is the only source of behavioral and return information. It covers the gist of the returned data but omits the failure record shape, result limits, and error conditions, leaving clear gaps for an agent invoking it.
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?
There is a single parameter and schema description coverage is 100%, so the schema fully documents 'runId' including its origin from run_tests/run_affected. The description adds no syntax, format, or edge-case meaning beyond the schema, which is the expected baseline.
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 gives a specific verb and resource ('Get detailed failure information for a test run') and adds scope with 'including source context around each failure.' It is clearly distinguishable from run_tests or list_runs, though it never explicitly contrasts itself with the closest sibling, get_test_detail.
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?
There is no when-to-use statement, no prerequisite, and no named alternative. The phrase 'for a test run' weakly implies it is called after a run, but nothing tells an agent when to prefer this over get_test_detail or rerun_failed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_detailB
Get complete details for a single test, including full stack trace.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The run ID from a previous test run | |
| testName | Yes | The test fullName or name to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the response includes a full stack trace, but says nothing about read-only nature, permissions, or what happens for a non-existent test.
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?
A single efficient sentence with the resource and the notable return field front-loaded. Nothing is wasted, though it is arguably too terse to be maximally useful.
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 should ideally describe the shape of the returned details beyond the stack trace. With two fully documented required params and no annotations, it is adequate but leaves gaps about the response.
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%, with runId and testName both documented, so the baseline is 3. The description adds no extra semantics such as whether testName accepts fullName vs name ambiguity beyond the schema's own note.
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?
States a specific verb+resource ('Get complete details for a single test') and adds the return highlight ('full stack trace'). However, it never names or contrasts with siblings like get_failures or list_runs, so an agent must infer the distinction from the singular 'single test'.
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?
No explicit when-to-use guidance, no prerequisites, and no mention of alternatives such as get_failures (which surfaces failing tests in bulk). The only signal is the implied 'single test' lookup, which is thin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_artifactsB
List artifacts from a GitHub Actions run. Use with parse_artifact to download and parse test result artifacts.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | GitHub repo in owner/repo format (e.g. "r-marques/testmcp") | |
| runId | Yes | GitHub Actions run ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not say whether the call is read-only (implied by 'list'), whether results are paginated, what the artifact entries contain, or what authentication the repo/runId require. Only the bare 'list' semantics are conveyed.
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?
Two short sentences, front-loaded with the action and resource, with no filler. Slightly terse given the absence of any behavioral detail, but nothing is wasted.
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 two-parameter listing tool with no output schema and no annotations, the description covers purpose and a companion tool but omits return shape (what an artifact entry looks like) and any read-only/auth context. Adequate but with clear 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 description coverage is 100% and both required parameters (repo, runId) are documented in the schema with format examples. The description adds nothing beyond that, which is the expected baseline when the schema does the heavy lifting.
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?
States a specific verb+resource (list artifacts) scoped to a GitHub Actions run, which separates it from list_runs and the parse_* siblings. It does not explicitly name list_runs as the alternative for run-level data, so it falls short of full sibling differentiation.
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 second sentence implies a workflow (use alongside parse_artifact to download and parse test result artifacts), which gives the agent a downstream context. It does not state when to reach for this tool versus list_runs or when artifacts would be absent, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_runsC
List recent test run summaries.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of runs to return (default: 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only listing via 'List', but says nothing about permissions, pagination, ordering, or what a 'summary' omits versus a full run record.
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?
A single short sentence with no waste and the purpose front-loaded. It is efficient, though arguably under-specified rather than optimally concise.
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 simple zero-required-parameter list tool with no output schema, the description is minimally viable but omits what a 'summary' contains and how results are ordered or paginated, which the agent would want when calling it.
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% and the single 'limit' parameter is fully documented in the schema, so baseline 3 applies. The description adds only the word 'recent', which mildly implies a default sort order not stated in 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?
States a specific verb (List) and resource (recent test run summaries), which is clearer than a tautology. However, it does not differentiate itself from siblings such as get_failures, get_test_detail, or list_artifacts, leaving the agent to infer the boundary.
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?
No guidance on when to use this tool versus siblings, no mention of prerequisites or exclusions. 'recent' hints at a recency scope but the agent gets no trigger conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_artifactB
Download a GitHub Actions artifact and parse it as test results. Supports JUnit XML, Jest JSON, Vitest JSON, and pytest-reportlog JSONL.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | GitHub repo in owner/repo format (e.g. "r-marques/testmcp") | |
| runId | Yes | GitHub Actions run ID | |
| artifactName | Yes | Name of the artifact to download and parse |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It usefully reveals that the tool performs a network download from GitHub and which four test-report formats are accepted, which is real behavioral context. However, it is silent on authentication requirements, whether the download is cached, and how malformed or unsupported artifacts are handled.
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?
Two tightly written sentences with zero filler; the core action is front-loaded and the format enumeration is compressed into a single compact clause.
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?
With no annotations and no output schema, the description should shoulder more of the burden — particularly what the parsed result looks like (a structure? a summary? failures only?) and how it relates to get_failures/get_test_detail. The format list is helpful, but the return contract is left entirely to inference.
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 repo, runId, and artifactName are already documented in the schema, making the baseline 3 appropriate. The description adds only the format-detection behavior, not additional parameter semantics such as whether artifactName is case-sensitive or a glob.
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 two specific verbs (download, parse) against a concrete resource (GitHub Actions artifact) and names the output domain (test results). It implicitly differentiates from siblings like list_artifacts and parse_log, though it never names them explicitly.
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?
There is no guidance on when to reach for this tool versus list_artifacts, parse_log, or get_test_detail, nor any stated prerequisite such as needing a prior list call to obtain artifactName. The supported-format list hints at applicability but does not constitute usage routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_logA
Parse raw CI/test log text and extract structured test results. Auto-detects framework (Jest, Vitest, Pytest) from the log content.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Raw CI log or test output text to parse | |
| framework | No | Force a specific framework instead of auto-detecting |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does little beyond stating auto-detection. It does not say what happens when detection fails or the log is malformed, whether parsing is deterministic/pure, or what the structured result looks like. For a tool with zero annotation coverage this is a notable gap.
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?
Two tight sentences with zero waste; the core purpose is front-loaded and the framework detail follows naturally.
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 should ideally hint at the shape of the extracted results or at least the failure mode for unparseable logs. It covers inputs adequately but leaves the return contract and error behavior unspecified.
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% and both parameters are documented inline, including the enum values and the override semantics. The description only restates the auto-detect behavior, adding no syntax or format detail beyond the schema, so the baseline 3 applies.
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?
States a specific verb (parse) and resource (raw CI/test log text) plus the outcome (extract structured test results), and names the supported frameworks. An agent can tell it apart from the sibling parse_artifact, which implies parsing a stored artifact rather than raw log text.
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 auto-detect default and the force-a-framework escape hatch are stated, which implies when to pass the framework parameter. However, there is no guidance on when to prefer this tool over parse_artifact or how it relates to get_failures/get_test_detail, leaving the selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rerun_failedB
Re-execute only the tests that failed in a previous run.
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The run ID whose failed tests should be re-run | |
| timeout | No | Time budget in milliseconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and falls short: it does not say whether this creates a new run or mutates the old one, what happens if there are no failures, whether the runId must reference a completed run, or what permissions are needed. For an execution tool that kicks off work, that is a meaningful gap.
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?
A single front-loaded sentence with no filler, and the scoping constraint is stated before any elaboration. Nothing here is wasted.
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 that re-executes tests with no annotations and no output schema, the definition omits the return shape, run-creation semantics, and failure/no-failure behavior. An agent knows the intent but not the mechanics or consequences of calling it.
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 both runId and timeout are already documented in the schema; baseline is 3. The description adds no syntax, format, or timeout-unit guidance beyond what the schema already states.
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?
States a specific verb and resource ('Re-execute ... tests') plus a scoping qualifier ('only the tests that failed in a previous run'), which cleanly separates it from run_tests and run_affected. It stops short of naming any sibling explicitly, so an agent must infer the boundary rather than being told it.
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 phrase 'in a previous run' implies the trigger condition (a prior run that had failures), but there is no explicit when-to-use statement, no prerequisites, and no mention of alternatives such as get_failures or run_tests for the non-failed case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_affectedA
Run only tests affected by git changes. Analyzes diff to find related test files.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Git ref to diff against (e.g., "main", "HEAD~3"). Defaults to unstaged/staged changes. | |
| timeout | No | Time budget in milliseconds | |
| coverage | No | Enable coverage collection | |
| projectDir | Yes | Absolute path to the project directory |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose meaningful behavior beyond the schema: it analyzes the git diff to select test files. It still omits execution side effects (e.g., coverage artifact writes implied by the 'coverage' param), failure semantics, and run duration expectations.
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?
Two short sentences with zero filler. The core action and selecting mechanism are front-loaded and nothing is redundant.
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 test-execution tool with no annotations and no output schema, the description is thin on runtime behavior and results. The fully documented schema compensates on the input side, but an agent still lacks context on what execution returns and how failures surface.
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 all four parameters (base, timeout, coverage, projectDir) are already documented in the schema. The description adds no additional parameter meaning, which makes the baseline 3 appropriate.
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 verb ("Run") and resource ("tests affected by git changes") and explains the mechanism ("Analyzes diff to find related test files"). It implicitly differentiates from sibling run_tests by scoping to git-affected tests, but never names run_tests to make the distinction explicit.
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?
Usage is implied by "Run only tests affected by git changes" – an agent can infer this is for incremental/PR-focused runs rather than full suites. However, there is no explicit when-to-use vs run_tests, no guidance on when to prefer a full run, and no note on prerequisites such as a git repository being present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_testsA
Run tests and return a compact summary. Use get_failures to drill into failures.
| Name | Required | Description | Default |
|---|---|---|---|
| timeout | No | Time budget in milliseconds. Process is killed if exceeded. | |
| coverage | No | Enable coverage collection | |
| fileGlob | No | Glob pattern to filter test files | |
| framework | No | Force a specific framework | |
| projectDir | Yes | Absolute path to the project directory | |
| testNamePattern | No | Regex pattern to filter test names |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the result is a compact summary and that failure details require get_failures, which is genuine behavioral context. It omits side-effect information (spawning processes, writing coverage artifacts, the kill-on-timeout behavior) that an agent would want before invoking.
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?
Two short, front-loaded sentences with no redundancy. The primary action comes first and the routing hint follows immediately; every clause earns its place.
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?
With no output schema, the description should convey what the compact summary contains and how options like coverage change it. It signals summarization and points to the drill-down tool, which covers the essential workflow, but leaves the shape of the returned summary unspecified.
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 all six parameters (projectDir, timeout, coverage, fileGlob, framework, testNamePattern) are already documented in the schema. The description adds no parameter-level meaning beyond that, so the baseline of 3 applies.
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?
States a specific verb and resource ('Run tests') plus the return character ('compact summary'), and explicitly names the sibling get_failures for drill-down. It does not differentiate from other run-oriented siblings like run_affected or rerun_failed, so it falls short of a 5.
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 second sentence gives useful follow-up routing ('Use get_failures to drill into failures'), which implies this tool is the entry point for a full run. However it never states when to choose this over run_affected, rerun_failed, or discover, nor any prerequisites such as a discovered project setup.
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.
11 tool updates
v0.1.0- First observed
discover - First observed
get_coverage - First observed
get_failures - First observed
get_test_detail - First observed
list_artifacts - First observed
list_runs - First observed
parse_artifact - First observed
parse_log - First observed
rerun_failed - First observed
run_affected - First observed
run_tests
TDQS
Scored across 11 tools
Most tools have distinct resource+action targets: run_tests vs run_affected, list_runs vs list_artifacts, and get_failures vs get_test_detail are separable. However, get_failures and get_test_detail both surface failure detail, and parse_log and parse_artifact both 'parse' test data, creating mild potential for misselection.
Nearly all names follow a consistent snake_case verb_noun pattern (list_runs, run_tests, get_failures, parse_artifact, rerun_failed). The lone outlier is 'discover', a bare verb with no noun object, which is a minor deviation from the otherwise uniform convention.
11 tools is well-scoped for a test-runner server, with each tool covering a distinct facet (discovery, execution, failure drill-down, coverage, artifact parsing). No redundant or filler tools appear.
The surface covers the full test lifecycle: discovery, running (full and affected), failure inspection, reruns, coverage, and CI log/artifact parsing. Minor gaps exist (e.g., no config/watch or artifact listing beyond GitHub Actions), but core workflows are complete.
Maintenance
Related MCP Connectors
Run, debug, and triage tests from your IDE using natural language, no dashboard switching, no manual data transfers. The TestMu AI (formerly LambdaTest) MCP Server is a single remote server exposing four tool suites: HyperExecute — analyze your project, generate YAML configs and test runner commands, then monitor jobs and sessions. Automation — pull a TestID's details plus command, network, and console logs into one chat for instant root-cause analysis. Includes mobile app upload. SmartUI — explain pixel, layout, DOM, and perceptual changes in a visual regression run, with context-aware React/HTML/CSS fixes. Accessibility — audit any public URL or a local React app against WCAG and get ready-to-apply remediation steps. Connects over https://mcp.lambdatest.com/mcp using OAuth 2.1 — no API keys in your config. One-click install in Cursor; works with Claude, GitHub Copilot, Cline, and any MCP client. Tests execute on the TestMu AI cloud: 3,000+ browsers and 10,000+ real devices.
3rd Generation Testing (3TG) — generate deterministic test suites from Markdown spec tables via MCP.
Generates unit tests for Python code with coverage before/after reports and concrete edge cases.
One MCP endpoint for Claude, GPT & Gemini: 100+ tools + no-code connectors + agent workers.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceExposes a set of CLI tools (test generation, documentation generation, linting, test running, code search) to AI assistants via MCP, allowing them to perform these tasks through natural language.3-
- AlicenseNot gradedqualityBmaintenanceA universal AI-powered testing server built on the Model Context Protocol (MCP). Allows AI agents to inspect, execute, test, monitor, debug, and report on software projects.3GNU Lesser General Public v2.1 only

io.github.phoeniceofficial
AlicenseAqualityCmaintenanceContract-driven test enforcement and reporting for LLM-generated code via MCP, VS Code, Copilot CLI, Claude, Cursor, or Python SDK.14MIT- AlicenseDqualityDmaintenanceMCP server for deterministic local test execution and normalized test result reporting, supporting pytest and Jest with coverage summaries.6MIT