# io.github.fastslack/e2e-runner (oci · docker.io/fastslack/e2e-runner-mcp:1.3.0)

JSON-driven E2E test runner with parallel Chrome pool execution and 16 MCP tools.

- Trust score: 37/100 (low)
- Change this week: −1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `@matware/e2e-runner`: 35/100, [markdown](https://verifymcp.io/servers/fastslack-e2e-runner/matware-e2e-runner.md), [page](https://verifymcp.io/servers/fastslack-e2e-runner/matware-e2e-runner)
- oci · `docker.io/fastslack/e2e-runner-mcp:1.3.0`: 37/100 (this document), [markdown](https://verifymcp.io/servers/fastslack-e2e-runner/docker-io-fastslack-e2e-runner-mcp-1-3-0.md), [page](https://verifymcp.io/servers/fastslack-e2e-runner/docker-io-fastslack-e2e-runner-mcp-1-3-0)

## Channel facts

- Registry: `oci`
- Package: `docker.io/fastslack/e2e-runner-mcp:1.3.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 0/100
  - Malware scan not yet available for this package.
  - CVE data not yet available for this package.
  - Install-script risk not yet assessed.
  - Dependency-health data not yet available.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 143 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 63/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3483 tokens (~217/item across 16 items; 16 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add fastslack-e2e-runner -- docker run --rm -i docker.io/fastslack/e2e-runner-mcp:1.3.0
```

### Codex

```bash
codex mcp add fastslack-e2e-runner -- docker run --rm -i docker.io/fastslack/e2e-runner-mcp:1.3.0
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "fastslack-e2e-runner": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "docker.io/fastslack/e2e-runner-mcp:1.3.0"
      ],
      "enabled": true
    }
  }
}
```

### Hermes

```yaml
mcp_servers:
  fastslack-e2e-runner:
    command: "docker"
    args: ["run", "--rm", "-i", "docker.io/fastslack/e2e-runner-mcp:1.3.0"]
```

### Other

```json
{
  "mcpServers": {
    "fastslack-e2e-runner": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "docker.io/fastslack/e2e-runner-mcp:1.3.0"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 37, +3)

- [functional improvement] Stability: unverified → 0.20

### 2026-07-31 (score 34, −4)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-27 (score 38, +30)

- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: excellent
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] First check of Schema quality: fail

### 2026-07-26 (score 8)

First indexed and scored.

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (16)

### `e2e_run` (~252 tokens)

Run E2E browser tests. Specify "all" to run every suite, "suite" for a specific suite, or "file" for a JSON file path. Returns structured results with pass/fail status, duration, and error details.

Input parameters:

- `all` (boolean): Run all test suites from the tests directory
- `baseUrl` (string): Override the base URL for this run
- `concurrency` (number): Number of parallel workers (default from config)
- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `failOnNetworkError` (boolean): Fail tests when network requests fail (e.g. ERR_CONNECTION_REFUSED). Default: false.
- `file` (string): Absolute or relative path to a JSON test file
- `retries` (number): Number of retries for failed tests
- `suite` (string): Suite name to run (e.g. "auth", "01-login"). Matches with or without numeric prefix.
- `verificationStrictness` (string): Visual verification strictness. strict: no ambiguity allowed, any doubt = FAIL. moderate: reasonable judgment (default). lenient: only fail on clear contradictions.

### `e2e_list` (~48 tokens)

List all available E2E test suites with their test names and counts.

Input parameters:

- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.

### `e2e_create_test` (~1266 tokens)

Create a new E2E test JSON file. IMPORTANT: prefer built-in actions over evaluate blocks.

\## Action selection guide (use instead of evaluate)

\**Clicking elements by text** — DON'T write evaluate to find+click elements:
  click:           { type: "click", text: "Submit" }              — searches button, a, [role=tab], span, etc.
  click_regex:     { type: "click_regex", text: "save|guardar" }  — regex match, case-insensitive
  click_menu_item: { type: "click_menu_item", text: "Delete" }    — [role=menuitem], .MenuItem, etc.
  click_option:    { type: "click_option", text: "Option A" }     — [role=option] in dropdowns
  click_chip:      { type: "click_chip", text: "Active" }         — MUI Chip / tag elements
  click_icon:      { type: "click_icon", value: "edit" }          — SVG/icon by data-testid, aria-label, class
  click_in_context:{ type: "click_in_context", text: "Row text", selector: "button" } — child within container

\**Asserting text presence/absence** — DON'T write evaluate with body.includes():
  assert_text:     { type: "assert_text", text: "Welcome" }      — text IS on page (case-sensitive). Uses: text
  assert_no_text:  { type: "assert_no_text", text: "Error" }     — text is NOT on page. Uses: text
  assert_text_in:  { type: "assert_text_in", selector: "[class*='Drawer']", text: "profesional|doctor" }
                   — scoped regex in container (case-insensitive default). Uses: selector + text (+ value:"exact")

\**Asserting elements** — DON'T write evaluate to count or check visibility:
  assert_visible:      { type: "assert_visible", selector: ".modal" }           — Uses: selector (NOT text)
  assert_not_visible:  { type: "assert_not_visible", selector: ".loader" }      — Uses: selector (NOT text)
  assert_count:        { type: "assert_count", selector: "input", value: ">= 2" } — Uses: selector + value
  assert_element_text: { type: "assert_element_text", selector: "h1", text: "Dashboard" } — Uses: selector + text
  assert_matches:      { type: "…

Input parameters:

- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `hooks` (object): Optional hooks: beforeAll, afterAll, beforeEach, afterEach (each an array of actions). Note: beforeAll runs on a SEPARATE page that is closed before tests — use beforeEach for auth/setup.
- `name` (string, required): Suite file name without .json extension (e.g. "login-flow", "issue-1743-sidebar")
- `tests` (array, required): Array of test objects with { name, actions, expect }

### `e2e_pool_status` (~59 tokens)

Get the status of the Chrome pool (browserless/chrome). Shows availability, running sessions, capacity, and queued requests.

Input parameters:

- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.

### `e2e_screenshot` (~86 tokens)

Retrieve a screenshot by its hash (e.g. ss:a3f2b1c9). Returns the image. Hashes are shown in the dashboard next to screenshots.

Input parameters:

- `hash` (string, required): Screenshot hash with or without ss: prefix (e.g. "ss:a3f2b1c9" or "a3f2b1c9")

### `e2e_dashboard_start` (~77 tokens)

Start the E2E Runner web dashboard. Provides a real-time UI for running tests, viewing results, screenshots, history, and pool status.

Input parameters:

- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `port` (number): Dashboard port (default 8484)

### `e2e_dashboard_stop` (~20 tokens)

Stop the E2E Runner web dashboard.

### `e2e_dashboard_restart` (~93 tokens)

Restart the E2E Runner web dashboard. Stops the current instance and starts a new one, optionally with a new cwd or port. Useful when switching projects or when the dashboard was started from another session.

Input parameters:

- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `port` (number): Dashboard port (default: same port or 8484)

### `e2e_issue` (~207 tokens)

Fetch a GitHub/GitLab issue and prepare E2E test generation. Returns issue details and a prompt for test creation. Use mode "verify" to auto-generate and run tests (requires ANTHROPIC_API_KEY).

Input parameters:

- `authStorageKey` (string): localStorage key name for the auth token (default: "accessToken")
- `authToken` (string): JWT or auth token to inject into localStorage before running tests (for authenticated apps)
- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `mode` (string): prompt = return issue + prompt for Claude Code to create tests (default). verify = auto-generate tests via Claude API and run them.
- `testType` (string): Test category: 'e2e' (default) for UI-driven tests, 'api' for backend API tests
- `url` (string, required): Issue URL (GitHub or GitLab)

### `e2e_capture` (~276 tokens)

Capture a screenshot of any URL on demand. Connects to the Chrome pool, navigates to the URL, takes a screenshot, and returns the image with its ss:HASH.

Input parameters:

- `authStorageKey` (string): localStorage key name for the auth token (default: "accessToken")
- `authToken` (string): JWT or auth token to inject into localStorage before navigating (for authenticated pages)
- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `delay` (number): Wait N milliseconds after page load before capturing (default: 0)
- `filename` (string): Output filename (default: capture-<timestamp>.png)
- `fullPage` (boolean): Capture full scrollable page (default: false)
- `selector` (string): Wait for this CSS selector before capturing
- `url` (string, required): Full URL to capture (e.g. "https://example.com" or "http://host.docker.internal:3000/dashboard")
- `waitUntil` (string): Navigation wait strategy. "auto" (default) tries networkidle2 first with a short timeout, then falls back to domcontentloaded + delay for SPA/WebSocket apps. Use "domcontentloaded" for apps with pers…

### `e2e_analyze` (~324 tokens)

Analyze a page's structure and return all interactive elements (forms, buttons, links, navigation, tables, modals, etc.) with their CSS selectors, plus suggested test scaffolds. One call replaces the entire screenshot→guess-selectors→retry cycle.

Input parameters:

- `authStorageKey` (string): localStorage key name for the auth token (default: "accessToken")
- `authToken` (string): JWT or auth token to inject into localStorage before navigating (for authenticated pages)
- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `delay` (number): Wait N milliseconds after page load before analyzing (default: 0)
- `includeScreenshot` (boolean): Include a screenshot alongside the JSON analysis (default: true)
- `maxElements` (number): Max elements per category (default: 50). Lower values produce smaller responses.
- `scope` (string): CSS selector to limit analysis to a section (e.g. "#sidebar", ".modal-content")
- `selector` (string): Wait for this CSS selector before analyzing
- `url` (string, required): Full URL to analyze (e.g. "https://example.com" or "http://host.docker.internal:3000/dashboard")
- `waitUntil` (string): Navigation wait strategy. "auto" (default) tries networkidle2 first with a short timeout, then falls back to domcontentloaded + delay for SPA/WebSocket apps. Use "domcontentloaded" for apps with pers…

### `e2e_create_module` (~217 tokens)

Create a reusable module for E2E tests. Modules encapsulate repeated action sequences referenced via { "$use": "module-name", "params": {...} }.

Good module candidates: auth setup, page navigation, tab clicking, opening sidebars/drawers, form fill sequences, cleanup routines. Modules can compose — a module can $use other modules. Params use {{paramName}} mustache syntax in action fields. Extract a module when you see the same 2+ action sequence in multiple tests.

Input parameters:

- `actions` (array, required): Sequential actions with {{param}} placeholders for substitution
- `cwd` (string): Absolute path to the project root directory.
- `description` (string): Human-readable description of what this module does
- `name` (string, required): Module name (used in $use references, e.g. "auth-jwt", "navigate-patient")
- `params` (object): Parameter definitions. Each key is a param name, value is { required: boolean, default?: string, description?: string }

### `e2e_learnings` (~168 tokens)

Query the E2E learning system for insights about test stability, flaky tests, selector health, page health, API health, error patterns, and trends. Builds knowledge across runs.

Input parameters:

- `cwd` (string): Absolute path to the project root directory. Claude Code should pass its current working directory.
- `days` (number): Analysis window in days (default: 30)
- `query` (string, required): What to query: "summary" (full overview), "flaky" (flaky tests), "selectors" (selector stability), "pages" (page health), "apis" (API health), "errors" (error patterns), "trends" (7-day trend). Drill…

### `e2e_neo4j` (~55 tokens)

Manage the Neo4j knowledge graph container for E2E learnings. Requires Docker.

Input parameters:

- `action` (string, required): Container lifecycle action
- `cwd` (string): Absolute path to the project root directory.

### `e2e_network_logs` (~203 tokens)

Query network request/response logs for a specific test run. Returns filtered logs from SQLite. Use the runDbId from e2e_run results to drill down into network details on demand.

Input parameters:

- `errorsOnly` (boolean): Only return requests with status >= 400
- `includeBodies` (boolean): Include request/response bodies (default: false, implies includeHeaders)
- `includeHeaders` (boolean): Include request/response headers (default: false)
- `method` (string): Filter by HTTP method (GET, POST, etc.)
- `runDbId` (number, required): The run database ID (returned by e2e_run in the summary)
- `statusMax` (number): Maximum HTTP status code
- `statusMin` (number): Minimum HTTP status code (e.g. 400 for errors only)
- `testName` (string): Filter by test name
- `urlPattern` (string): Regex pattern to match against request URLs

### `e2e_vars` (~132 tokens)

Manage project variables stored in SQLite. Variables can be referenced in test JSON as {{var.KEY}}. Supports project-wide and per-suite scoping.

Input parameters:

- `action` (string, required): Action to perform: set (upsert), get (one key), list (all), delete
- `cwd` (string): Absolute path to the project root directory.
- `key` (string): Variable name (required for set, get, delete)
- `scope` (string): Scope: "project" (default) or a suite name for suite-specific override
- `value` (string): Variable value (required for set)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/fastslack-e2e-runner/docker-io-fastslack-e2e-runner-mcp-1-3-0#diagnostics

## Score history

- 2026-08-03: 37
- 2026-08-02: 37
- 2026-08-01: 34
- 2026-07-31: 34
- 2026-07-30: 38
- 2026-07-29: 38
- 2026-07-28: 38
- 2026-07-27: 38
- 2026-07-26: 8

## Links

- Repository: https://github.com/fastslack/mtw-e2e-runner
- Changelog RSS feed: https://verifymcp.io/servers/fastslack-e2e-runner/docker-io-fastslack-e2e-runner-mcp-1-3-0/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/fastslack-e2e-runner/docker-io-fastslack-e2e-runner-mcp-1-3-0/changelog.json
- HTML version of this page: https://verifymcp.io/servers/fastslack-e2e-runner/docker-io-fastslack-e2e-runner-mcp-1-3-0
