Releases: MimoJanra/TestOpsMCP
Releases · MimoJanra/TestOpsMCP
v2.0.3
What's Changed
- No changes
Full Changelog: v2.0.2...v2.0.3
Docker Image
docker pull ghcr.io/mimojanra/testopsmcp:v2.0.3
docker pull ghcr.io/mimojanra/testopsmcp:latestPlatforms: linux/amd64, linux/arm64 · Setup guide
v2.0.2
What's Changed
- No changes
Full Changelog: v2.0.1...v2.0.2
Docker Image
docker pull ghcr.io/mimojanra/testopsmcp:v2.0.2
docker pull ghcr.io/mimojanra/testopsmcp:latestPlatforms: linux/amd64, linux/arm64 · Setup guide
v2.0.1
What's Changed
- No changes
Full Changelog: v2.0.0...v2.0.1
Docker Image
docker pull ghcr.io/mimojanra/testopsmcp:v2.0.1
docker pull ghcr.io/mimojanra/testopsmcp:latestPlatforms: linux/amd64, linux/arm64 · Setup guide
v2.0.0
[2.0.0] - 2026-05-31 - MCP Protocol Improvements
Added
Generic Typed Handlers
- All 104+ tool handlers now use a
Typed[T]generic wrapper that auto-deserializes JSON input — eliminates ~200 manualjson.Unmarshalcalls. - Handler signatures changed from
(ctx, json.RawMessage)to(ctx, TypedArgs)— cleaner and type-safe.
slog Integration
internal/core.Loggernow wrapslog/slogwithslog.NewJSONHandler. Same public API, standard Go logging internals.
Middleware Chain + Panic Recovery
- New
internal/mcp/middleware.gowith composablemiddlewareFuncchain. - Panic recovery middleware (first in chain): catches handler panics, logs stack trace, returns
{code: -32603}instead of crashing the server. - Audit logging extracted to its own middleware;
dispatch()simplified to a single call.
MCP Protocol 2025-11-25
ProtocolVersionbumped to"2025-11-25".- Version negotiation in
initialize: server accepts client's requested version if in supported list (2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25). - New
loggingandelicitationcapability fields inServerCapabilities.
Cursor-Based Pagination
tools/list,resources/list,prompts/listnow support cursor-based pagination (page size 50).- Response includes
nextCursorwhen more pages exist. Tools list sorted alphabetically for stable cursors.
Async Task System
- New
internal/taskspackage:Taskstruct with status lifecycle (working/succeeded/failed/cancelled), in-memoryStorewith context-based cancellation. - Three new tools:
get_task_status,list_running_tasks,cancel_task. - Long-running operations now return
{task_id, message}immediately and complete in the background:run_allure_launch,copy_launch,merge_launches,bulk_run_test_cases_new_launch,bulk_run_test_cases_existing_launch,bulk_clone_test_cases.
Completion (Argument Autocompletion)
- New
completion/completeJSON-RPC method. - Registry has a
Complete(promptName, argName, partial)method — returns up to 10 suggestions. project_idarguments complete against live Allure project list when API is configured.
Elicitation (Confirmation Dialogs)
- Server can ask the user to confirm destructive operations via
elicitation/createnotification. session.ElicitFunccontext key lets handlers call into the elicitation round-trip.- Applied to:
delete_test_caseandbulk_delete_test_cases— user must accept before deletion proceeds. - Route:
notifications/elicitation/completedelivers user's answer back to the server.
Resource Subscriptions
resources/subscribeandresources/unsubscribeJSON-RPC methods are now handled.Server.PublishResource(uri)sendsnotifications/resources/updatedto all subscribed sessions.- Launch dashboard widget auto-starts a 10-second polling watcher when subscribed via
ui://widgets/launch-dashboard?launch_id=N. - Server advertises
resources.subscribe = truein capabilities.
Sampling (Server → LLM via Client)
- Server can request LLM inference through the client via
sampling/createMessage. session.SamplingFunccontext key exposes this to handlers.- New
analyze_launch_failurestool: fetches failed test results and asks Claude to identify root causes and suggest fixes. Gracefully degrades if sampling is unavailable.
Fixed
Async Task System
- Panic recovery in goroutines —
tasks.Store.Run()wraps every background goroutine inrecover(). A panic marks the taskFailedand logs the stack trace; the server and other sessions remain unaffected. - Session token lost in async context —
Store.Create()now acceptsparentCtxand usescontext.WithoutCancelto propagate session ID (and all other context values) without inheriting the request's cancellation signal. Async operations (run_allure_launch,copy_launch,merge_launches,bulk_run_*,bulk_clone_test_cases) now correctly resolve per-user Allure tokens in multi-user deployments. - Data race in task reads —
Store.Get()andStore.List()now return struct copies underRLockinstead of raw pointers;taskToMapno longer races against concurrentUpdatewrites. - Async task timeout —
taskCtxcarries a 30-minute hard deadline viacontext.WithTimeout; hung Allure calls can no longer leak goroutines and memory indefinitely. - Task store memory leak — Added background janitor (
StartJanitor) that purges succeeded/failed/cancelled tasks older than 1 hour; runs every 5 minutes.
MCP Protocol — Elicitation & Sampling
- Standard JSON-RPC response routing —
elicitation/createis now sent as a proper JSON-RPC request (withid);sampling/createMessagealready had anid. Both now receive the client's standard JSON-RPC response{id, result}routed through a newhandleJSONRPCResponsedispatcher, keyed by the request ID. The previous non-standard methodsnotifications/elicitation/completeandsampling/createMessage/responseare removed. Compatible with Claude Desktop and any spec-compliant MCP client. - Silent deletion on stdio —
delete_test_caseandbulk_delete_test_caseson the stdio transport previously bypassed the confirmation guard (noElicitFuncin context → theif okblock was skipped, and data was deleted silently). Now they return an error: "deletion requires user confirmation but no interactive session is available". Also, transport errors fromelicit()are now returned as errors instead of being masked as a user cancellation.
Resource Subscriptions
- Push notifications never arrived —
handleResourcesSubscribewas passing the HTTP request context toOnSubscribe → StartLaunchWatch → watchLaunch. The request'sr.Context()was cancelled when thePOST /messageshandler returned (202 Accepted), so the watcher exited before the first 10-second tick. Nowsess.ctx(session lifetime) is used — the watcher runs until the client disconnects.
Other
- Unstable pagination —
resources/listandprompts/listnow sort by URI and name respectively before slicing, matchingtools/listbehaviour. Previously, cursor-based pagination over Go maps produced non-deterministic results. - Completion hits Allure on every keystroke —
Completenow maintains a 30-second in-process cache of project/launch ID lists fetched with a 5-second timeout derived from the request context. Completion is gated onref.type == "ref/prompt"to avoid unintended Allure calls from resources with identically-named arguments. - UTF-8 truncation in analysis —
analyzeLaunchFailurestruncated error messages and stack traces by byte index (msg[:300]), which split multi-byte runes (Cyrillic, CJK, emoji). Now usestruncateRuneswhich truncates at rune boundary.
Changed
- Tool count: 100 → 104 (added
get_task_status,list_running_tasks,cancel_task,analyze_launch_failures). initializeresponse now includesloggingcapability.resources.subscribeis nowtrueininitializecapabilities.
Docker Image
docker pull ghcr.io/mimojanra/testopsmcp:v2.0.0
docker pull ghcr.io/mimojanra/testopsmcp:latestPlatforms: linux/amd64, linux/arm64 · Setup guide
v1.9.0
[1.9.0] - 2026-05-31 - MCP Prompts & Resources
Added
MCP Prompts
analyze-test-failures— prompt template that instructs Claude to retrieve launch details, list failed/broken results, group by error pattern, and surface critical issues. Argument:launch_id(required),project_id(optional).launch-report-summary— prompt template that instructs Claude to generate a concise executive summary (pass rate, counts, duration, environment, top failures). Argument:launch_id(required),project_id(optional).- Server now advertises
promptscapability in the MCPinitializeresponse. prompts/listandprompts/getJSON-RPC methods are fully handled.
MCP Resources
allure://docs/quickstart— static Markdown resource listing tool groups, prompt templates, and quick-start steps. Available even when no Allure token is configured; clients can attach it as context.
Docker Image
docker pull ghcr.io/mimojanra/testopsmcp:v1.9.0
docker pull ghcr.io/mimojanra/testopsmcp:latestPlatforms: linux/amd64, linux/arm64 · Setup guide
v1.8.1
What's Changed
- No changes
Full Changelog: v1.8.0...v1.8.1
Docker Image
docker pull ghcr.io/mimojanra/testopsmcp:v1.8.1
docker pull ghcr.io/mimojanra/testopsmcp:latestPlatforms: linux/amd64, linux/arm64 · Setup guide
v1.8.0
[1.8.0] - 2026-05-30 - Multi-User Auth & Audit Log
Added
Multi-User Authentication
MCP_AUTH_TOKENSenvironment variable — configure named user tokens inname:token,...format (e.g.alice:abc123,bob:xyz789). Each user authenticates with their own bearer token; requests are attributed to the user by name in logs and audit records.- Backward-compatible — existing
MCP_AUTH_TOKEN(single token) still works and is treated as user"default". - Startup log now shows the configured user count instead of a boolean auth flag.
Audit Log
- Daily JSONL audit files written to a configurable directory (
AUDIT_LOG_PATH, defaultaudit/). - Each entry records:
timestamp,user,session_id,remote_addr,method,tool(fortools/call),status(ok/error),duration_ms. - Automatic retention — files older than
AUDIT_RETENTION_DAYSdays (default 30) are deleted nightly. - Docker Compose mounts
./auditas a host volume so logs survive container restarts. - Audit logger is disabled gracefully (warning logged) if the directory cannot be created.
New Environment Variables
| Variable | Default | Description |
|---|---|---|
MCP_AUTH_TOKENS |
— | Named user tokens: alice:tok1,bob:tok2 |
AUDIT_LOG_PATH |
audit |
Directory for daily audit JSONL files |
AUDIT_RETENTION_DAYS |
30 |
Days to keep audit files |
Fixed
GitHub Actions — Docker Release
- Added QEMU setup step (
docker/setup-qemu-action@v3) required for multi-platform (linux/amd64,linux/arm64) builds — previously the multi-arch build was silently skipped. - Added
platforms: linux/amd64,linux/arm64tobuild-push-action. - Added
type=raw,value=latesttag so the:latestimage is correctly pushed on tag releases. - Fixed
publish-releasestep using--notes-appendinstead of--notes-file(which was overwriting the full release body). - Pinned action versions to stable releases (
actions/checkout@v4,docker/setup-buildx-action@v3,docker/login-action@v3,docker/metadata-action@v5).
Changed
docker-compose.yml— removed duplicatedenvironmentkeys that were already covered byenv_file; addedAUDIT_LOG_PATHandAUDIT_RETENTION_DAYSwith defaults; added./audit:/app/auditvolume mount.
v1.7.1 - MCP Compliance Fixes & Model Expansions
What's Fixed
MCP Protocol Compliance
- Tool annotations missing on 3 tools —
configure_allure_token,search_testops_operations, andexecute_testops_operationwere registered after the annotation loop and sentnullannotations to Claude. All three now receive correctreadOnlyHint/destructiveHintvalues. execute_testops_operationmarkeddestructiveHint: true— can execute any API operation including DELETE/PUT.- CORS headers —
Mcp-Session-IdandX-Allure-Tokenadded toAccess-Control-Allow-Headers;DELETEadded toAccess-Control-Allow-Methods. Cross-origin preflight requests now work correctly. - Streamable HTTP Content-Type validation — POST
/mcprejects non-JSONContent-Typewith415 Unsupported Media Typeper MCP spec 2025-03-26. GetLaunchStatisticsresponse parsing — the API returns[{"status","count"}]array, not a single object. Launch Dashboard widget now shows correct pass/fail/broken counts.ClientCapabilitiesparsing —InitializeRequest.Capabilitieswasstruct{}, silently discardingelicitation,sampling, androotsflags.
Data Models
LaunchCreateRequestexpanded withAutoClose,External,Issues,Links,TagsLaunchResponseenriched with UUID, timestamps, and full nested fieldsStatisticsResponse+ newStatisticItemDTO for the array statistics endpoint- New DTOs:
CategoryDto,TestLayerDto,JobRunDto,IdAndNameOnlyDto,IntegrationTypeDto,RoleDto,StatusDto,WorkflowRowDto,CustomFieldValueWithCfDto
No Breaking Changes
Fully backwards-compatible — existing Claude Desktop and claude.ai configurations require no changes.
Full Changelog
See CHANGELOG.md for complete details.
v1.7.0
[1.7.0] - 2026-05-27 - Interactive API Discovery Widgets
Added
MCP App Widgets for Search/Execute Tools
- Action Picker Widget — interactive searchable picker for
search_testops_operationsresults- Real-time filtering by operation name, description, or API path
- HTTP method color-coding (GET green, POST blue, PUT orange, DELETE red)
- Click to select operation and inject operation_id into chat
- Results Display Widget — formatted result viewer for
execute_testops_operation- Status indicator (Success/Error) with color
- Auto-formatted JSON with proper indentation
- Scrollable body for large API responses
- Graceful fallback for raw text responses
Changed
search_testops_operations— updated to render Action Picker widget; description now mentions widget supportexecute_testops_operation— updated to render Results Display widget; description now mentions widget support
Notes
- All widgets support light/dark mode via host theme detection
- Compatible with Claude Desktop and claude.ai
- Uses ext-apps bundle for cross-platform rendering
v1.6.0 — Full Test Case API Coverage (102 tools)
[1.6.0] - 2026-05-26 - Full Test Case API Coverage
Added
Test case single-item operations (25 new tools)
get_test_case_tags/set_test_case_tags— read and replace tags on a test caseget_test_case_issues/set_test_case_issues— read and replace linked bug-tracker issuesget_test_case_examples/set_test_case_examples— parametrized data table rows (full replace)list_test_case_versions/create_test_case_version/restore_test_case_version— version snapshot managementget_test_case_version_data/delete_test_case_version— version content and cleanupget_test_case_attachments/delete_test_case_attachment— attachment listing and removalsearch_test_cases— AQL/RQL full-text search across project test caseslist_deleted_test_cases— browse soft-deleted test caseslist_muted_test_cases— browse muted test casesdelete_test_case_scenario— remove the entire step scenario from a test casemove_test_case_step/copy_test_case_step— reposition steps within a scenarioget_test_case_relations/set_test_case_relations— test-case-to-test-case relationsget_test_case_custom_fields/update_test_case_custom_fields— custom field values via dedicated/cfvendpointget_test_case_workflow— workflow definition for a test caseget_test_case_keys/set_test_case_keys— integration test keys (Jira, Azure DevOps, etc.)get_test_case_scenario_from_run— scenario captured from the last automated rundetach_test_case_automation— convert an automated test case back to manualget_test_case_audit— change history / audit logvalidate_test_case_query— validate AQL/RQL expression without executing itsuggest_test_cases— autocomplete suggestions by name
Bulk test-case operations (14 new tools)
bulk_add_test_case_members/bulk_remove_test_case_membersbulk_add_test_case_custom_fields/bulk_remove_test_case_custom_fieldsbulk_add_test_case_external_linksbulk_add_test_case_issues/bulk_remove_test_case_issuesbulk_set_test_case_layerbulk_move_test_cases— move test cases to another projectbulk_delete_test_cases— permanent bulk deletebulk_run_test_cases_new_launch/bulk_run_test_cases_existing_launchbulk_create_test_plan— create a test plan from selected test casesbulk_mute_test_cases
Fixed
execute_testops_operationparameter routing — path parameters no longer leaked into the request body; unknown parameters are now collected separatelyexecute_testops_operationarray bodies — new explicitbodykey lets callers pass any JSON value (array or object) directly as the HTTP request body
Changed
- Total MCP tools: 57 → 102 (45 new tools, all backed by proper client methods — no OpenAPI dynamic execution fallback)
- All new client methods added to
internal/adapters/allure/client.gowith typed request/response models inmodels.go - New file
internal/tools/tools_testcases_extra.gofor the extended single-item test case tools