loading…
Search for a command to run...
loading…
MCP server for Allure TestOps — lets an LLM agent (Claude Code, Cursor, Windsurf, etc.) inspect test quality without leaving the chat.
MCP server for Allure TestOps — lets an LLM agent (Claude Code, Cursor, Windsurf, etc.) inspect test quality without leaving the chat.
PyPI Python License: MIT Tests
An MCP server for Allure TestOps. It lets an LLM agent (Claude Code, Cursor, OpenCode, …) explore and manage projects, launches, test cases, test results and reference data through the Allure REST API.
qameta.io or self-hosted / on-prem (API at /api/rs).allure_list_projects, then pass any project_id. No reconfiguration to switch or compare projects.claude mcp add allure -s user \
--env ALLURE_URL=https://allure.example.com \
--env ALLURE_TOKEN=your-api-token \
-- uvx --from allure-testops-mcp allure-testops-mcp
Then ask your agent: "List all Allure projects" or "Show failed tests in the last launch for project 175". Get an API token in Allure TestOps under Profile → API tokens. See Configuration for other clients and Environment variables for all options.
14 tools — 11 read-only (always on) and 3 write tools (opt-in via ALLURE_ENABLE_WRITE=true). Every tool
carries MCP annotations and returns both a typed structuredContent payload and a markdown summary.
| Tool | Kind | Purpose |
|---|---|---|
allure_list_projects |
read | All projects (id, name, abbreviation) |
allure_get_project_statistics |
read | TC count, automation rate, last-launch summary |
allure_list_launches |
read | Recent launches with pass/fail stats |
allure_get_test_results |
read | Test results in a launch (filter by status) |
allure_search_failed_tests |
read | FAILED/BROKEN tests in the last or a given launch |
allure_list_test_cases |
read | Test cases (automated/manual + owner filters) |
allure_get_test_case |
read | One test case's full detail + scenario steps |
allure_get_test_case_custom_fields |
read | A test case's custom-field values |
allure_list_statuses |
read | A project's statuses (id, name, color) |
allure_list_layers |
read | A project's test layers (id, name) |
allure_list_custom_fields |
read | A project's custom-field schema |
allure_create_test_case |
write ⚑ | Create a test case |
allure_update_test_case |
write ⚑ | Partial update of a test case |
allure_delete_test_case |
write ⚑ | Permanent delete (destructive — needs confirm=true) |
⚑ Registered only when ALLURE_ENABLE_WRITE=true. Without the flag they are never imported, so the agent
never sees them — see Security considerations.
allure_create_test_case / allure_update_test_case accept status and layer as either a name
(status / layer) or a numeric id (status_id / layer_id). Names are auto-resolved to ids against
the project's status/layer lists (GET /api/rs/status, GET /api/rs/testlayer) — an unknown name returns an
actionable error listing the valid options. Update is partial (only the fields you pass change), and
allure_delete_test_case is irreversible: it carries destructiveHint: True (compliant clients prompt) and
additionally requires an explicit confirm=true argument.
readOnlyHint: True / openWorldHint: True so clients don't
prompt; allure_delete_test_case is destructiveHint: True.TypedDict return type, so FastMCP
auto-generates an outputSchema and every result carries both structuredContent and a markdown block.pagination block with page, total, has_more, next_page.ctx.report_progress + ctx.info events.allure_update_test_case issues PATCH and falls back to PUT on
HTTP 405, so it works across Allure deployments that expose only one verb.__version__ derives from installed package metadata, and a test
asserts pyproject.toml matches both server.json version fields, so the published version can't drift.Requires Python 3.10+. No manual install needed if you use uvx (recommended) — your MCP client runs it.
# run on demand via uvx (recommended)
uvx --from allure-testops-mcp allure-testops-mcp
# or install with pipx
pipx install allure-testops-mcp
Claude Code — one command:
claude mcp add allure -s user \
--env ALLURE_URL=https://allure.example.com \
--env ALLURE_TOKEN=your-api-token \
--env ALLURE_SSL_VERIFY=true \
-- uvx --from allure-testops-mcp allure-testops-mcp
Any MCP client — add to ~/.claude.json, a project .mcp.json, Cursor's mcp.json, etc.:
{
"mcpServers": {
"allure": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "allure-testops-mcp", "allure-testops-mcp"],
"env": {
"ALLURE_URL": "https://allure.example.com",
"ALLURE_TOKEN": "${ALLURE_TOKEN}",
"ALLURE_SSL_VERIFY": "true"
}
}
}
}
See .env.example for a template. Verify the connection:
claude mcp list
# allure: uvx --from allure-testops-mcp allure-testops-mcp - ✓ Connected
| Variable | Required | Default | Description |
|---|---|---|---|
ALLURE_URL |
yes | — | Allure TestOps URL (e.g. https://allure.example.com) |
ALLURE_TOKEN |
yes | — | API token (Allure → Profile → API tokens) |
ALLURE_SSL_VERIFY |
no | true |
true/false. Set false for self-signed corp certs |
ALLURE_ENABLE_WRITE |
no | false |
true registers the 3 write tools; default is a read-only server |
ALLURE_TEST_PROJECT_ID (plus optional ALLURE_TEST_STATUS / ALLURE_TEST_LAYER) are used only by the
opt-in live integration tests — see Development.
The server is a stdio process your client respawns each session, so the running version is decided by the
uvx invocation. uvx caches the resolved environment under ~/.cache/uv, so an older version sticks until
you refresh:
uvx --refresh --from allure-testops-mcp allure-testops-mcp # force latest on next run
uv cache clean allure-testops-mcp # or drop the cached env
Then reconnect the server (/mcp → reconnect, or restart the session). To control the version from config,
edit args — pin for stability, or always-latest for currency:
// Pin a version (deterministic; bump consciously)
"args": ["--from", "allure-testops-mcp==0.8.0", "allure-testops-mcp"]
// Always latest on every start (adds a PyPI lookup per launch)
"args": ["--refresh", "--from", "allure-testops-mcp", "allure-testops-mcp"]
Read-only:
With ALLURE_ENABLE_WRITE=true, drive test-case CRUD in natural language:
smoke, layer E2E"confirm=true, and a compliant client prompts you firstALLURE_TOKEN only — never passed on the command line, never written to logs.ALLURE_SSL_VERIFY=false (default true). Disabling verification on a
public network is a risk; use only for trusted corporate instances.session.trust_env = False) — the server ignores HTTP_PROXY /
HTTPS_PROXY so it can't be silently routed through an unintended proxy.ALLURE_ENABLE_WRITE=true the server registers only the
11 read-only tools and cannot create, modify, or delete anything, even with a write-scoped token. When
enabled, allure_delete_test_case carries destructiveHint: True and requires confirm=true.Api-Token auth inherits the issuing user's
role, so a read-only (guest) account yields a read-only server regardless of the ALLURE_ENABLE_WRITE flag.Allure TestOps enforces per-instance rate limits (typically ~60 requests/minute per token). On HTTP 429 the
server returns an actionable error suggesting you wait 30–60s, reduce size, or paginate with smaller pages.
Two tools make multiple API calls internally — allure_get_project_statistics (3) and
allure_search_failed_tests (2–3) — and report per-step progress via MCP Context.
git clone https://github.com/mshegolev/allure-testops-mcp.git
cd allure-testops-mcp
pip install -e '.[dev]'
pytest # unit suite (all HTTP mocked)
ruff check src tests && ruff format --check src tests
Run the server directly (stdio transport — waits on stdin for MCP messages):
ALLURE_URL=... ALLURE_TOKEN=... allure-testops-mcp
An opt-in suite runs a real create → update → delete lifecycle against a live Allure project. It is
deselected by default and skips itself unless credentials are present, so a normal pytest stays green:
export ALLURE_URL=https://allure.example.com
export ALLURE_TOKEN=... # token from an account with write access
export ALLURE_ENABLE_WRITE=true
export ALLURE_TEST_PROJECT_ID=63 # a throwaway project you can write to
pytest -m integration tests/integration -v
Issues and PRs welcome. Keep the unit suite green (pytest) and the linter clean (ruff check,
ruff format); CI runs both on Python 3.10 / 3.11 / 3.12. See CHANGELOG.md for the
release history.
MIT © Mikhail Shchegolev
Run in your terminal:
claude mcp add mshegolev-allure-testops-mcp -- npx Yes, Allure Testops MCP is free — one-click install via Unyly at no cost.
No, Allure Testops runs without API keys or environment variables.
A hosted option is available: Unyly runs the server in the cloud, no local setup required.
Open Allure Testops on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
CSA PROJECT - FZCO © 2026 IFZA Business Park, DDP, Premises Number 31174 - 001
Security
Low riskAutomated heuristic from public metadata — not a security guarantee.