io.github.mshegolev/allure-testops-mcp
PYPI · ALLURE-TESTOPS-MCP · SCANNED SEP 20
Allure TestOps MCP — projects, launches, test cases, test results via REST API.
Available components
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. How we score → Why this is hard to score →
Supply Chain Security100
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 0 of 32 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: the license (MIT License) isn't a recognized OSI-approved license. See how to fix → Fail
- Actively maintained (last published 44 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability67
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 3627 tokens (~279/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.mshegolev/allure-testops-mcp server?
io.github.mshegolev/allure-testops-mcp runs locally as a PyPI package, launched with uvx allure-testops-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · allure-testops-mcp
claude mcp add mshegolev-allure-testops-mcp -- uvx allure-testops-mcp
{
"mcpServers": {
"mshegolev-allure-testops-mcp": {
"command": "uvx",
"args": [
"allure-testops-mcp"
]
}
}
} {
"servers": {
"mshegolev-allure-testops-mcp": {
"command": "uvx",
"args": [
"allure-testops-mcp"
]
}
}
} codex mcp add mshegolev-allure-testops-mcp -- uvx allure-testops-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mshegolev-allure-testops-mcp": {
"type": "local",
"command": [
"uvx",
"allure-testops-mcp"
],
"enabled": true
}
}
} openclaw mcp add mshegolev-allure-testops-mcp --command uvx --arg allure-testops-mcp
mcp_servers:
mshegolev-allure-testops-mcp:
command: "uvx"
args: ["allure-testops-mcp"] {
"McpServers": {
"mshegolev-allure-testops-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"allure-testops-mcp"
]
}
}
} assistant mcp add mshegolev-allure-testops-mcp -t stdio -c uvx -a allure-testops-mcp
{
"mcpServers": {
"mshegolev-allure-testops-mcp": {
"command": "uvx",
"args": [
"allure-testops-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 20 Sept 26 0
- Stability: 0.97 → pass security
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 16 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 −2
- Stability: pass → 0.80 functional
- 13 Sept 26 0
- Stability: 0.97 → pass security
- 12 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 7 Sept 26 −2
- Stability: pass → 0.80 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/allure-testops-mcp@0.9.3
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 32 packages
| Packages resolved | 32 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
allure_get_project_statistics ~355
Get summary statistics for an Allure project. Returns TC count, automation rate, and the last closed launch's pass/fail breakdown. Performs 3-4 API calls — progress is reported via MCP Context (visible as progress updates in compatible clients). Args: project_id: Allure project ID (see ``allure_list_projects``). ctx: MCP Context injected by FastMCP (used for progress reporting; never supplied by the agent directly). Returns: dict with keys: - ``project_id`` (int) - ``total_test_cases`` (int) - ``automated_test_cases`` (int) - ``manual_test_cases`` (int) - ``automation_rate_pct`` (float) - ``last_launch_id`` (int | None): latest *closed* launch - ``last_launch_name`` (str | None) - ``last_launch_passed`` / ``last_launch_failed`` / ``last_launch_broken`` (int) - ``last_launch_total`` (int) - ``recent_launches_count`` (int): launches examined to find the latest closed one Examples: - "How automated is project 63?" -> ``project_id=63``, read ``automation_rate_pct`` - "What was the last passing run for project 175?" -> read ``last_launch_passed`` Don't use when: - You need per-test detail (use ``allure_get_test_results``). - You need the full launch history (use ``allure_list_launches``).
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | integer | yes | Allure project ID (discover via allure_list_projects). |
| Name | Type | Req | Description |
|---|---|---|---|
| automated_test_cases | integer | yes | – |
| automation_rate_pct | number | yes | – |
| last_launch_broken | integer | yes | – |
| last_launch_failed | integer | yes | – |
| last_launch_id | – | yes | – |
| last_launch_name | – | yes | – |
| last_launch_passed | integer | yes | – |
| last_launch_total | integer | yes | – |
| manual_test_cases | integer | yes | – |
| project_id | integer | yes | – |
| recent_launches_count | integer | yes | – |
| total_test_cases | integer | yes | – |
No examples provided.
allure_get_test_case ~296
Get one test case's full detail — fields, status/layer, tags, and steps. Unlike ``allure_list_test_cases`` (summaries), this returns the body of a single test case: description, precondition, expected result, and the manual scenario steps (flattened with a ``depth`` marker). Use it to read or review the actual content of a test case. Scenario steps are loaded from ``GET /testcase/{id}/scenario`` (nested tree). If that returns no steps, falls back to ``GET /testcase/{id}/step`` (normalized ``root`` + ``scenarioSteps`` map used by some Allure versions). Returns: dict with ``id``, ``name``, ``project_id``, ``automated``, ``description``, ``precondition``, ``expected_result``, ``status``, ``layer``, ``tags`` and ``steps`` (each: ``depth``, ``keyword``, ``name``, ``expected_result``). ``steps`` is empty when ``include_scenario`` is false or the case has none.
| Name | Type | Req | Description |
|---|---|---|---|
| include_scenario | boolean | – | Also fetch manual scenario steps. Tries GET /scenario first; if empty, falls back to GET /step (one or two extra calls). |
| test_case_id | integer | yes | Allure test-case ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| automated | boolean | yes | – |
| created_by | string | yes | – |
| description | string | yes | – |
| expected_result | string | yes | – |
| id | integer | yes | – |
| last_modified_by | string | yes | – |
| layer | string | yes | – |
| name | string | yes | – |
| precondition | string | yes | – |
| project_id | integer | yes | – |
| status | string | yes | – |
| steps | array | yes | – |
| tags | array | yes | – |
No examples provided.
allure_get_test_case_custom_fields ~115
List the custom-field values set on a test case. Returns each value flattened to ``field_id`` / ``field_name`` (the custom field) and ``value_id`` / ``value_name`` (the chosen value) — e.g. field "Priority" → value "High". These are not included in ``allure_get_test_case``; fetch them here when you need a test case's custom-field assignments.
| Name | Type | Req | Description |
|---|---|---|---|
| test_case_id | integer | yes | Allure test-case ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| custom_fields | array | yes | – |
| test_case_id | integer | yes | – |
No examples provided.
allure_get_test_results ~365
Get individual test results inside a launch, optionally filtered by status. The Allure server may ignore the ``status`` query parameter and return mixed-status pages. When ``status`` is set, this tool enforces the filter client-side (case-insensitive comparison) so the returned ``results`` always contain only rows matching the requested status. Args: launch_id: Allure launch ID (from ``allure_list_launches``). status: Filter — ``PASSED`` / ``FAILED`` / ``BROKEN`` / ``SKIPPED``. ``None`` returns all. page: 0-based page index. size: Items per page (1-200; default 50). Returns: dict with keys: - ``launch_id`` (int) - ``count`` (int): number of results after client-side status filter - ``pagination`` (dict) - ``results`` (list): each with ``id`` / ``name`` / ``status`` / ``duration_ms`` / ``error`` (first 300 chars of ``statusMessage``) Examples: - "FAILED tests in launch 12345" -> ``launch_id=12345, status="FAILED"`` - "All results in launch X, second page" -> ``launch_id=X, page=1`` Don't use when: - You want only FAILED+BROKEN (``allure_search_failed_tests`` does both in one call).
| Name | Type | Req | Description |
|---|---|---|---|
| launch_id | integer | yes | Allure launch ID. |
| page | integer | – | 0-based page. |
| size | integer | – | Items per page (1-200). |
| status | – | – | Filter by status. None returns all statuses. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| launch_id | integer | yes | – |
| pagination | – | yes | – |
| results | array | yes | – |
No examples provided.
allure_list_categories ~251
List the defect categories configured for a project. Categories are the named, coloured buckets shown on the project's *Categories* settings page (``name`` / ``color`` / ``description``). They are inert on their own — the regex rules that auto-assign failures live in ``allure_list_category_matchers``. Args: project_id: Allure project ID. page: 0-based page index. size: Items per page (1-500). Returns: dict with keys: - ``project_id`` (int) - ``count`` (int): items in this response - ``pagination`` (dict) - ``categories`` (list): each ``id`` / ``name`` / ``color`` / ``description`` Examples: - "What defect categories does project 175 have?" -> ``project_id=175`` Don't use when: - You want the regex automation rules (use ``allure_list_category_matchers``).
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | 0-based page. |
| project_id | integer | yes | Allure project ID. |
| size | integer | – | Items per page (1-500). |
| Name | Type | Req | Description |
|---|---|---|---|
| categories | array | yes | – |
| count | integer | yes | – |
| pagination | – | yes | – |
| project_id | integer | yes | – |
No examples provided.
allure_list_category_matchers ~270
List the regex automation rules (matchers) for a project. Each matcher carries a ``message_regex`` / ``trace_regex`` (Java regex) and the ``category_id`` / ``category_name`` it feeds. This is the project's *automation schema* — what makes failing results land in a category automatically at result-ingest time. Args: project_id: Allure project ID. page: 0-based page index. size: Items per page (1-500). Returns: dict with keys: - ``project_id`` (int) - ``count`` (int) - ``pagination`` (dict) - ``matchers`` (list): each ``id`` / ``name`` / ``message_regex`` / ``trace_regex`` / ``category_id`` / ``category_name`` Examples: - "Show the auto-classification rules for project 175" -> ``project_id=175`` Don't use when: - You only need the bucket names/colours (use ``allure_list_categories``).
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | 0-based page. |
| project_id | integer | yes | Allure project ID. |
| size | integer | – | Items per page (1-500). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| matchers | array | yes | – |
| pagination | – | yes | – |
| project_id | integer | yes | – |
No examples provided.
allure_list_custom_fields ~114
List the custom fields defined on a project (its schema). Returns each field's ``field_id``, ``name``, ``single_select`` and ``required``. Use it to discover which custom fields a project has before reading a test case's values with ``allure_get_test_case_custom_fields``. Built-in metadata fields (Epic/Feature/Story/Component/Suite) use negative ids; project-specific custom fields use positive ids.
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | integer | yes | Allure project ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| custom_fields | array | yes | – |
| project_id | integer | yes | – |
No examples provided.
allure_list_launches ~345
List recent launches for a project, newest first. Each launch carries a pass/fail/broken/skipped breakdown from Allure's ``statistic`` field. Pagination info is returned in the ``pagination`` block (use ``next_page`` to continue). Args: project_id: Allure project ID. page: 0-based page index. size: Items per page (1-100; 20 is usually enough for triage). Returns: dict with keys: - ``project_id`` (int) - ``count`` (int): items in this response - ``pagination`` (dict): ``page`` / ``size`` / ``total`` / ``total_pages`` / ``has_more`` / ``next_page`` - ``launches`` (list): each with ``id`` / ``name`` / ``status`` / ``created_date`` / ``passed`` / ``failed`` / ``broken`` / ``skipped`` / ``total`` Examples: - "Last 10 launches for project 63" -> ``project_id=63, size=10`` - "Older launches beyond page 1" -> repeat with ``page=1`` Don't use when: - You need test results inside a launch (``allure_get_test_results``). - You need just the latest FAILED/BROKEN tests (``allure_search_failed_tests``).
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | 0-based page. |
| project_id | integer | yes | Allure project ID. |
| size | integer | – | Items per page (1-100). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| launches | array | yes | – |
| pagination | – | yes | – |
| project_id | integer | yes | – |
No examples provided.
allure_list_layers ~110
List the test layers defined in a project (id, name). Use this to discover valid layer names/ids before setting a layer on ``allure_create_test_case`` / ``allure_update_test_case``. Built-in layers use negative ids (e.g. API Tests = -3). Returns: dict with ``project_id``, ``count`` and ``layers`` (each: ``id``, ``name``).
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | integer | yes | Allure project ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| layers | array | yes | – |
| project_id | integer | yes | – |
No examples provided.
allure_list_projects ~181
List all projects in the Allure TestOps instance. Use this first to discover which project IDs exist — all other tools take a ``project_id`` that you can look up here. Returns: dict with keys: - ``count`` (int): number of projects in this response - ``projects`` (list): each item has ``id``, ``name``, ``abbreviation`` Examples: - "Which projects exist in Allure?" -> default call, take the names/ids - "Find project by abbreviation" -> iterate ``projects`` and match Don't use when: - You already know the project id (skip discovery, go straight to the target tool).
| Name | Type | Req | Description |
|---|---|---|---|
| page | integer | – | 0-based page number. |
| size | integer | – | Items per page (1-500). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| projects | array | yes | – |
No examples provided.
allure_list_statuses ~118
List the test-case statuses defined in a project (id, name, color). Use this to discover valid status names/ids before setting a status on ``allure_create_test_case`` / ``allure_update_test_case``. Built-in statuses use negative ids (e.g. Draft = -1). Returns: dict with ``project_id``, ``count`` and ``statuses`` (each: ``id``, ``name``, ``color``).
| Name | Type | Req | Description |
|---|---|---|---|
| project_id | integer | yes | Allure project ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| project_id | integer | yes | – |
| statuses | array | yes | – |
No examples provided.
allure_list_test_cases ~810
List test cases for a project with optional automation and ownership filters. Each TC carries ``id``, ``name``, ``automated``, ``status``, ``layer`` (e.g. ``UNIT``, ``API``, ``E2E``), the ``createdBy`` / ``lastModifiedBy`` audit usernames, and a flat list of tag names. **Caveat:** the audit fields and ``tags`` are only populated when ``owner`` is set, because Allure's plain ``/testcase`` endpoint returns a compact projection that omits them — the ``owner`` path uses ``__search`` which returns the full projection. Args: project_id: Allure project ID. ctx: MCP Context (auto-injected by FastMCP for progress reporting). automated: ``True`` — only automated, ``False`` — only manual, ``None`` — both. owner: Optional Allure username. When set, the response is narrowed to TCs where ``createdBy = owner OR lastModifiedBy = owner`` (case-sensitive, exact match), enforced **server-side** via Allure's RQL ``__search`` endpoint. The username must match ``[A-Za-z0-9._@-]+`` — anything else is rejected at the MCP input layer (Pydantic ``pattern``) to prevent RQL injection. **Why "creator/modifier" and not "owner".** Allure TestOps does not expose a separate ``owner`` field in RQL on most deployments — the closest stable proxy for "TCs I touched" is the union of ``createdBy`` and ``lastModifiedBy``. **Trade-off when ``owner`` is set.** ``__search`` does not accept the ``automated`` query parameter, so an ``automated`` filter combined with ``owner`` is applied **client-side after the page is fetched**. ``pagination`` then reflects the raw owner-filtered set, not the further automation-filtered view — a fetched page of 50 may shrink. Raise ``size`` (max 200) or iterate ``page`` for full coverage. page: 0-based page index. size: Items per page (1-200; default 50). Returns: dict with keys: - ``project_id`` (int)…
| Name | Type | Req | Description |
|---|---|---|---|
| automated | – | – | True: only automated. False: only manual. None: both. |
| owner | – | – | Allure username — narrows the result to TCs where the user is the creator OR the last modifier. Applied server-side via Allure RQL (see docstring). |
| page | integer | – | 0-based page. |
| project_id | integer | yes | Allure project ID. |
| size | integer | – | Items per page (1-200). |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| pagination | – | yes | – |
| project_id | integer | yes | – |
| test_cases | array | yes | – |
No examples provided.
allure_search_failed_tests ~297
Find FAILED and BROKEN tests in the most recent (or given) launch. Useful for triage: _"what's broken in the latest run"_ without listing every test. Performs up to 3 API calls; progress reported via MCP Context. Args: project_id: Allure project ID. launch_id: Specific launch ID. If ``None``, the latest launch is used. limit: Max failures per status (so up to ``2 * limit`` total). ctx: MCP Context (auto-injected). Returns: dict with keys: - ``launch_id`` (int): the resolved launch (latest if not passed in) - ``failed_count`` (int) - ``results`` (list): ``id`` / ``name`` / ``status`` / ``duration_ms`` / ``error`` Examples: - "What's failing in project 63 right now?" -> ``project_id=63`` - "Failures in launch 98765" -> ``project_id=N, launch_id=98765`` Don't use when: - You need PASSED tests too (use ``allure_get_test_results`` without status filter).
| Name | Type | Req | Description |
|---|---|---|---|
| launch_id | – | – | Specific launch ID. If omitted, uses the most recent launch. |
| limit | integer | – | Max failures to return per status. |
| project_id | integer | yes | Allure project ID. |
| Name | Type | Req | Description |
|---|---|---|---|
| failed_count | integer | yes | – |
| launch_id | integer | yes | – |
| reason | – | yes | – |
| results | array | yes | – |
No examples provided.
What is the io.github.mshegolev/allure-testops-mcp server?
io.github.mshegolev/allure-testops-mcp is listed in the public MCP registry as io.github.mshegolev/allure-testops-mcp. Allure TestOps MCP, projects, launches, test cases, test results via REST API. This page covers its PyPI package (allure-testops-mcp).
Is the io.github.mshegolev/allure-testops-mcp server safe to use?
io.github.mshegolev/allure-testops-mcp scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.mshegolev/allure-testops-mcp server expose?
io.github.mshegolev/allure-testops-mcp exposes 13 tools: allure_list_projects, allure_get_project_statistics, allure_list_launches, allure_get_test_results, allure_search_failed_tests, and 8 more. Their descriptions and schemas cost roughly 3,627 tokens of context every time the server is loaded.
Is the io.github.mshegolev/allure-testops-mcp server still maintained?
io.github.mshegolev/allure-testops-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.