Testdino MCP
Vendor MCP38 toolsOAuth 2.1/DCRDeveloper ToolsAnalyticsMonitoringTestDino is a Playwright test reporting and analytics platform that centralizes test data, detects flaky tests, and provides AI-powered debugging via MCP...
Testdino MCP connector
-
Install the SDK
Section titled “Install the SDK”Terminal window npm install @scalekit-sdk/nodeTerminal window pip install scalekit -
Set your credentials
Section titled “Set your credentials”Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret> -
Authorize and make your first call
Section titled “Authorize and make your first call”quickstart.ts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENV_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'testidinomcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Testdino MCP:', link)process.stdout.write('Press Enter after authorizing...')await new Promise(r => process.stdin.once('data', r))// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'testidinomcp_get_trace_analysis',toolInput: {},})console.log(result)quickstart.py import osfrom scalekit.client import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENV_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "testidinomcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Testdino MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="testidinomcp_get_trace_analysis",connection_name=connection_name,identifier=identifier,)print(result)
What you can do
Section titled “What you can do”Connect this agent connector to let your agent:
- Fix verify — Check whether a fix actually held for one test, against the run you saw when you proposed it
- Get trace analysis, run error clusters, integration status — Debug a failing Playwright test from its trace.zip using the Playwright agent CLI (npx playwright trace …, Playwright 1.59+)
- Create external issue, session, release — Create a provider issue/task/item linked to a TestDino entity
- Integration connect — Start the provider OAuth/connect flow for a TestDino project
- Update session, run test case, release — Modify an existing exploratory session
- Report submit audit — FINAL STEP of the TestDino Playwright audit flow — submits a completed audit report
Tool list
Section titled “Tool list”Use the exact tool names from the Tool list below when you call execute_tool. If you’re not sure which name to use, list the tools available for the current user first.
testidinomcp_connect_integration#Start the provider OAuth/connect flow for a TestDino project. The tool first checks current status and returns already_connected instead of starting OAuth when the provider is connected.3 params
Start the provider OAuth/connect flow for a TestDino project. The tool first checks current status and returns already_connected instead of starting OAuth when the provider is connected.
projectIdstringrequiredTestDino project ID.providerstringrequiredIntegration provider connected to this TestDino project.orgIdstringoptionalTestDino organization ID. Usually inferred from the PAT scope; pass explicitly if the token spans multiple orgs.testidinomcp_create_external_issue#Create a provider issue/task/item linked to a TestDino entity. Supported source types include automated and manual runs, test cases, suites, releases, and sessions. Check get_integration_status first for required provider fields.9 params
Create a provider issue/task/item linked to a TestDino entity. Supported source types include automated and manual runs, test cases, suites, releases, and sessions. Check get_integration_status first for required provider fields.
projectIdstringrequiredTestDino project ID.providerstringrequiredIntegration provider connected to this TestDino project.sourceobjectrequiredTestDino entity to link with the external issue.descriptionstringoptionalIssue body/description. Later phases can derive this from source.idempotencyKeystringoptionalCaller-provided stable key for retrying the same create request without creating duplicates when supported downstream.linkBackbooleanoptionalWhether TestDino should link the created external issue back to the source entity.previewbooleanoptionalWhen true, resolve and return the issue draft without creating anything in the provider.summarystringoptionalIssue title. Later phases can derive this from source.targetobjectoptionalProvider-specific target/field values. Jira accepts human-readable aliases such as { jiraProjectKey: "TRX", issueType: "Bug" } or { jiraProjectName, issueTypeName }; raw { jiraProjectId, issueTypeId } also works. Linear { teamId }, Asana { workspaceId, projectId }, monday.com { boardId }.testidinomcp_create_manual_run#Create a new manual test run. Requires write permission. selectionMode controls which test cases are included: "all" (default — every case in the project) or "selected" (use testCaseIds and/or suiteIds to scope). releaseId attaches the run to a release. note accepts rich HTML. IMPORTANT: tags must be a JSON array of strings — e.g. ["smoke","regression"] — NOT the comma-separated form that list_manual_runs accepts as a filter.15 params
Create a new manual test run. Requires write permission. selectionMode controls which test cases are included: "all" (default — every case in the project) or "selected" (use testCaseIds and/or suiteIds to scope). releaseId attaches the run to a release. note accepts rich HTML. IMPORTANT: tags must be a JSON array of strings — e.g. ["smoke","regression"] — NOT the comma-separated form that list_manual_runs accepts as a filter.
namestringrequiredRun name.projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.attachmentsarrayoptionalArray of attachment objects or URLs.environmentstringoptionalEnvironment label, e.g. "Staging".forecastnumberoptionalNumeric forecast/target for the run.includeUnsortedbooleanoptionalAlso include cases with no suite when selectionMode="selected".linkedIssuesarrayoptionalArray of linked-issue objects (same shape as list_manual_runs returns).linksarrayoptionalArray of link objects with title and url.notestringoptionalRich HTML note.releaseIdstringoptionalAttach run to this release.selectionModestringoptionalDefault "all". Use "selected" with testCaseIds/suiteIds to scope.statestringoptionalWorkflow state (default "new"). Either canonical ("in_progress") or display ("In Progress") form — server normalizes to lowercase+underscored.suiteIdsarrayoptionalSuite IDs whose cases are included when selectionMode="selected".tagsarrayoptionalArray of tag strings, e.g. ["smoke","regression"]. NOT a comma-separated string.testCaseIdsarrayoptionalCase IDs to include when selectionMode="selected".testidinomcp_create_manual_test_case#Create a new manual test case. Requires write permission. MANDATORY FIRST STEP: always call list_manual_test_suites() before this tool to get the exact suite name — suiteName must be an exact match, not approximate. Steps default to Classic format (action + expectedResult). Set testStepsDeclarationType="Gherkin" if using Given/When/Then steps. Classic step shape: { action, expectedResult, data, attachments }. Gherkin step shape: { event: "Given"|"When"|"And"|"Then"|"But", stepDescription, attachments }. Use top-level attachments for whole-test-case files, or step.attachments for files tied to a specific step.19 params
Create a new manual test case. Requires write permission. MANDATORY FIRST STEP: always call list_manual_test_suites() before this tool to get the exact suite name — suiteName must be an exact match, not approximate. Steps default to Classic format (action + expectedResult). Set testStepsDeclarationType="Gherkin" if using Given/When/Then steps. Classic step shape: { action, expectedResult, data, attachments }. Gherkin step shape: { event: "Given"|"When"|"And"|"Then"|"But", stepDescription, attachments }. Use top-level attachments for whole-test-case files, or step.attachments for files tied to a specific step.
projectIdstringrequiredProject ID. Obtain from the health tool.suiteNamestringrequiredTarget suite name (exact match required — get from list_manual_test_suites first).titlestringrequiredTest case title.attachmentsarrayoptionalWhole-test-case attachments as URLs, local paths, or file data objects.automationStatusstringoptionalAutomation status. Values come from Project Settings → Test Case Properties. Defaults: Manual, Automated, To Be Automated.behaviorstringoptionalBehavior. Values come from Project Settings → Test Case Properties. Defaults: Positive, Negative, Destructive, Not Set.customFieldsobjectoptionalCustom fields defined in project settings.descriptionstringoptionalTest case description.flagsarrayoptionalAutomation flags/checklist values.layerstringoptionalLayer. Values come from Project Settings → Test Case Properties. Defaults: E2E, API, Unit, Not Set.postconditionsstringoptionalPostconditions for the test case.preconditionsstringoptionalPreconditions for the test case.prioritystringoptionalPriority. Values come from Project Settings → Test Case Properties. Defaults: Critical, High, Medium, Low, Not Set.severitystringoptionalSeverity. Values come from Project Settings → Test Case Properties. Defaults: Blocker, Critical, Major, Normal, Minor, Trivial, Not Set.statusstringoptionalStatus. Values come from Project Settings → Test Case Properties. Defaults: Active, Draft, Deprecated.stepsarrayoptionalArray of test steps. Classic shape: { action, expectedResult, data, attachments }. Gherkin shape: { event: "Given"|"When"|"And"|"Then"|"But", stepDescription, attachments }.tagsstringoptionalComma-separated tag names.testStepsDeclarationTypestringoptionalStep format: "Classic" (action + expectedResult) or "Gherkin" (Given/When/Then).typestringoptionalType. Values come from Project Settings → Test Case Properties. Defaults: Smoke, Regression, Functional, Integration, E2E, API, Unit, Performance, Security, Accessibility, Usability, Compatibility, Acceptance, Exploratory, Other.testidinomcp_create_manual_test_suite#Create a new test suite folder for organizing manual test cases. Requires write permission. Use parentSuiteId to nest it under an existing suite — get the ID from list_manual_test_suites() first.4 params
Create a new test suite folder for organizing manual test cases. Requires write permission. Use parentSuiteId to nest it under an existing suite — get the ID from list_manual_test_suites() first.
namestringrequiredSuite name.projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.descriptionstringoptionalOptional description for the test suite.parentSuiteIdstringoptionalID of the parent suite to nest this suite under. Obtain from list_manual_test_suites().testidinomcp_create_release#Create a new release. Requires write permission. Use parentReleaseId to nest under another release (max 3 levels deep). startDate/endDate are ISO date strings. isStarted/isCompleted are independent flags — startedAt/completedAt are recorded separately. branch/environment/buildTarget/testers describe what build the release ships and who tests it (testers must be org members — pass User _ids).17 params
Create a new release. Requires write permission. Use parentReleaseId to nest under another release (max 3 levels deep). startDate/endDate are ISO date strings. isStarted/isCompleted are independent flags — startedAt/completedAt are recorded separately. branch/environment/buildTarget/testers describe what build the release ships and who tests it (testers must be org members — pass User _ids).
namestringrequiredRelease name.projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.branchstringoptionalSource branch this release ships from.buildTargetobjectoptionalBuild the release cuts against: { platform: "web"|"ios"|"android"|"api", version, buildNumber, source, deployUrl }.completedAtstringoptionalISO datetime when the release was completed.descriptionstringoptionalOptional description for the release.endDatestringoptionalEnd date as ISO date string (e.g. 2026-07-31).environmentstringoptionalEnvironment label this release targets, e.g. "Staging".isCompletedbooleanoptionalWhether the release is completed.isStartedbooleanoptionalWhether the release has started.linkedIssuesarrayoptionalArray of linked-issue objects (same shape as list_releases returns).notestringoptionalRich HTML note.parentReleaseIdstringoptionalID of the parent release to nest under (max 3 levels deep).startDatestringoptionalStart date as ISO date string (e.g. 2026-07-01).startedAtstringoptionalISO datetime when the release started.testersarrayoptionalUser _ids assigned as testers. Must be members of the org.typestringoptionalRelease type. Default options: "release", "version", "sprint", "iteration", "plan", "cycle", "feature" (case-insensitive).testidinomcp_create_session#Create a new exploratory testing session. Requires write permission. mission accepts rich HTML (the high-level charter). assigneeUserId accepts either a User _id ("user_abc...") or an email address — the email is resolved against TestDino users automatically. estimate is in minutes. Findings are not available via MCP — add them in the UI. IMPORTANT: tags must be a JSON array of strings — e.g. ["exploratory","auth"] — NOT the comma-separated form that list_sessions accepts as a filter.13 params
Create a new exploratory testing session. Requires write permission. mission accepts rich HTML (the high-level charter). assigneeUserId accepts either a User _id ("user_abc...") or an email address — the email is resolved against TestDino users automatically. estimate is in minutes. Findings are not available via MCP — add them in the UI. IMPORTANT: tags must be a JSON array of strings — e.g. ["exploratory","auth"] — NOT the comma-separated form that list_sessions accepts as a filter.
namestringrequiredSession name.projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.assigneeUserIdstringoptionalUser _id ("user_abc...") OR email address — both accepted. Email is looked up server-side.attachmentsarrayoptionalArray of attachment objects or URLs.configstringoptionalSession configuration.environmentstringoptionalEnvironment label, e.g. "Staging".estimateintegeroptionalEstimate in minutes.linkedIssuesarrayoptionalArray of linked-issue objects (same shape as list_sessions returns).missionstringoptionalRich HTML mission/charter.releaseIdstringoptionalAttach session to this release.sessionTypestringoptionalFree-text type, e.g. "Exploratory", "Regression".statestringoptionalWorkflow state (default "new"). Either canonical ("under_review") or display ("Under review") form — server normalizes to lowercase+underscored.tagsarrayoptionalArray of tag strings, e.g. ["exploratory","auth"]. NOT a comma-separated string.testidinomcp_debug_testcase#AI-assisted root cause analysis for a failing or flaky test. Returns historical execution data, aggregated failure patterns (error types, frequency, browsers affected), common error messages, and a debugging_prompt field. If you are debugging a failing test, call get_debug_evidence first: it already carries the debugging_prompt, the verdict and the artifact links. Come here afterwards only for the stored AI suggestions or the full execution history. IMPORTANT: always read the debugging_prompt field in the response — it contains pre-formatted analysis instructions curated for this specific test. Treat it as your analysis context before drawing conclusions. Any fixes you produce from this analysis are recommendations only — validate them against the live code before applying. Use this when the user asks "why is test X failing?", "debug test X", or "is test X flaky?". If the title is shared across multiple files, pair with suite_file_path to disambiguate (else data-handler returns 409 AMBIGUOUS_IDENTITY with candidates). Set include_ai_insights=true to also get TestDino's stored AI analysis for this test under `ai_fixes`: recommendations (investigation/remediation steps + reasoning + historical insight) and quick fixes (concrete fixes, often with code snippets, plus long-term stabilization steps). By default they target the most recent failing execution; pass testrun_id to target a specific run. AI payloads are generated lazily — if `ai_fixes` sections report status "in_progress", poll get_ai_insights(testrun_id=..., testcase_id=...) until they report "completed". An "unavailable" section carries the upstream statusCode: a 5xx or timeout is transient (retry once via get_ai_insights); a 4xx (bad ids) is terminal.5 params
AI-assisted root cause analysis for a failing or flaky test. Returns historical execution data, aggregated failure patterns (error types, frequency, browsers affected), common error messages, and a debugging_prompt field. If you are debugging a failing test, call get_debug_evidence first: it already carries the debugging_prompt, the verdict and the artifact links. Come here afterwards only for the stored AI suggestions or the full execution history. IMPORTANT: always read the debugging_prompt field in the response — it contains pre-formatted analysis instructions curated for this specific test. Treat it as your analysis context before drawing conclusions. Any fixes you produce from this analysis are recommendations only — validate them against the live code before applying. Use this when the user asks "why is test X failing?", "debug test X", or "is test X flaky?". If the title is shared across multiple files, pair with suite_file_path to disambiguate (else data-handler returns 409 AMBIGUOUS_IDENTITY with candidates). Set include_ai_insights=true to also get TestDino's stored AI analysis for this test under `ai_fixes`: recommendations (investigation/remediation steps + reasoning + historical insight) and quick fixes (concrete fixes, often with code snippets, plus long-term stabilization steps). By default they target the most recent failing execution; pass testrun_id to target a specific run. AI payloads are generated lazily — if `ai_fixes` sections report status "in_progress", poll get_ai_insights(testrun_id=..., testcase_id=...) until they report "completed". An "unavailable" section carries the upstream statusCode: a 5xx or timeout is transient (retry once via get_ai_insights); a 4xx (bad ids) is terminal.
projectIdstringrequiredProject ID. Obtain from the health tool.testcase_namestringrequiredTest case name / title to debug.include_ai_insightsbooleanoptionalAttach AI recommendations + quick fixes for this test under `ai_fixes` (targets the most recent failing execution unless testrun_id is set).suite_file_pathstringoptionalOptional spec file path — disambiguates when several tests share the same title. Example: "tests/checkout.spec.ts".testrun_idstringoptionalOnly with include_ai_insights: fetch the AI analysis for this specific run instead of the most recent failure.testidinomcp_get_ai_insights#TestDino's AI Insights, at three levels. With testrun_id + testcase_id: that test case's AI fixes — recommendations (investigation/remediation steps + reasoning) and quick fixes (concrete fixes, often with code snippets). With testrun_id only: that run's AI analysis — AI failure categorization (flaky/bug/ui_change), failure clusters, new-failures cards, the error-analysis table, and the LLM-written run summary. With neither: the project-level overview — per-category failure counts over the date range with the top offending test cases in each category. AI payloads are generated lazily: sections may report status "not_generated", "queued", "processing", or "failed" before "completed" — poll this tool every few seconds while "processing". A "disabled" status is terminal (AI features are off for the project, Settings → AI) — do not poll it. Case mode (testrun_id + testcase_id) reports "in_progress" while ai_fixes generate; the run-level sections use "processing". An "unavailable" section carries the upstream statusCode: a 5xx or timeout is transient (retry once), a 4xx (bad ids) is terminal. Use the project overview to answer "what should we fix first?"; the run mode to triage one run; the case mode to get fixes for one failing test — each also serves as the poll target after get_run_details(include_ai_insights=true) / debug_testcase(include_ai_insights=true) reported a pending status. Requires AI features to be enabled in the project settings (Settings → AI).7 params
TestDino's AI Insights, at three levels. With testrun_id + testcase_id: that test case's AI fixes — recommendations (investigation/remediation steps + reasoning) and quick fixes (concrete fixes, often with code snippets). With testrun_id only: that run's AI analysis — AI failure categorization (flaky/bug/ui_change), failure clusters, new-failures cards, the error-analysis table, and the LLM-written run summary. With neither: the project-level overview — per-category failure counts over the date range with the top offending test cases in each category. AI payloads are generated lazily: sections may report status "not_generated", "queued", "processing", or "failed" before "completed" — poll this tool every few seconds while "processing". A "disabled" status is terminal (AI features are off for the project, Settings → AI) — do not poll it. Case mode (testrun_id + testcase_id) reports "in_progress" while ai_fixes generate; the run-level sections use "processing". An "unavailable" section carries the upstream statusCode: a 5xx or timeout is transient (retry once), a 4xx (bad ids) is terminal. Use the project overview to answer "what should we fix first?"; the run mode to triage one run; the case mode to get fixes for one failing test — each also serves as the poll target after get_run_details(include_ai_insights=true) / debug_testcase(include_ai_insights=true) reported a pending status. Requires AI features to be enabled in the project settings (Settings → AI).
projectIdstringrequiredProject ID (e.g. project_<id>).dateRangestringoptionalProject overview only: e.g. "7d", "30d", or "custom" (with fromDate/toDate).environmentstringoptionalProject overview only: filter by environment name.fromDatestringoptionalProject overview only: custom range start (YYYY-MM-DD).testcase_idstringoptionalCase mode: with testrun_id, return AI fixes (recommendations + quick fixes) for this test case (its pw_test_id) in that run.testrun_idstringoptionalRun mode: AI insights for this single test run. Also required for case mode (with testcase_id).toDatestringoptionalProject overview only: custom range end (YYYY-MM-DD).testidinomcp_get_audit_report#Read-only TestDino Playwright audit reads. Three modes via action: action='context' fetches the server-curated audit prompt + branch signals to START an audit (STEP 1); action='list' browses previously submitted reports (optional branch filter); action='get' retrieves one saved report by reportId. Only use this when the user EXPLICITLY names TestDino (e.g. "TestDino audit"). For a generic audit without TestDino named, do NOT call this tool.6 params
Read-only TestDino Playwright audit reads. Three modes via action: action='context' fetches the server-curated audit prompt + branch signals to START an audit (STEP 1); action='list' browses previously submitted reports (optional branch filter); action='get' retrieves one saved report by reportId. Only use this when the user EXPLICITLY names TestDino (e.g. "TestDino audit"). For a generic audit without TestDino named, do NOT call this tool.
actionstringrequiredRead mode: 'context' (fetch audit prompt + branch signals to start), 'list' (browse past reports), 'get' (one report by reportId).projectIdstringrequiredProject ID (required).branchstringoptionalGit branch. For action='context', the branch to audit. For action='list', an optional filter.limitintegeroptionalPage size for action='list'.pageintegeroptionalPage number for action='list'.reportIdstringoptionalReport ID. Required for action='get'.testidinomcp_get_debug_evidence#Start every failing-test investigation here. One call returns the whole cheap tier of the evidence ladder: the computed flake verdict with its per-attempt failure signatures, the regression boundary (the last run this test passed and the first it failed), and download links for every stored artifact — trace, screenshots, and the expected/actual/diff images on a visual failure. Read all of it before forming a hypothesis. The verdict says whether the failure repeats, never why, so it rules fixes out rather than pointing at a cause; the boundary turns "why does this fail" into "what changed between these two runs", which is a far smaller question. Artifact links are minutes-scale: download what you need immediately, and call this again to mint fresh ones rather than treating an expired link as a missing artifact.8 params
Start every failing-test investigation here. One call returns the whole cheap tier of the evidence ladder: the computed flake verdict with its per-attempt failure signatures, the regression boundary (the last run this test passed and the first it failed), and download links for every stored artifact — trace, screenshots, and the expected/actual/diff images on a visual failure. Read all of it before forming a hypothesis. The verdict says whether the failure repeats, never why, so it rules fixes out rather than pointing at a cause; the boundary turns "why does this fail" into "what changed between these two runs", which is a far smaller question. Artifact links are minutes-scale: download what you need immediately, and call this again to mint fresh ones rather than treating an expired link as a missing artifact.
projectIdstringrequiredProject ID (e.g. project_<id>).formatstringoptionalResponse shape. "md" is markdown, and markedly cheaper for the same content.include_instructionsbooleanoptionalDefault true. The procedure and the trace runbook are identical on every call and about half the response — set false on repeat calls once you have read them.maxLengthintegeroptionalCap the markdown length. Applies to format="md" only; anything cut is announced in the output. JSON is never truncated, because a cut payload would not parse and would read as a complete one.suite_file_pathstringoptionalSpec file path — only needed when the title is shared across files.testcase_idstringoptionalThe case's pw_test_id.testcase_namestringoptionalFull test title. Required for the regression boundary — prefer it when known.testrun_idstringoptionalRun scope. Omit to use the most recently started run carrying this case.testidinomcp_get_external_issue#Fetch external issue/task details by provider IDs or keys previously linked to TestDino, such as Jira keys TD-17 or Linear issue identifiers.4 params
Fetch external issue/task details by provider IDs or keys previously linked to TestDino, such as Jira keys TD-17 or Linear issue identifiers.
issueIdsarrayrequiredExternal issue IDs or keys.projectIdstringrequiredTestDino project ID.providerstringrequiredIntegration provider connected to this TestDino project.targetobjectoptionalProvider-specific target/context values. For Jira, pass { defaultApp } to read from a specific Atlassian site/resource.testidinomcp_get_flake_verdict#Say whether a failing test behaves the same way every time, by comparing its retry attempts within one run. If you are debugging a failing test, call get_debug_evidence first — it returns this plus the regression boundary and every artifact link in one call, so calling this separately afterwards repeats work already done. Returns a computed verdict — "deterministic" (every attempt failed with the same signature, so the failure repeats), "flaky" (an attempt passed on retry, so the outcome is not consistent), or "inconclusive" (too few attempts, or the attempts failed differently) — plus the per-attempt signatures behind it. The verdict describes the behaviour, not the cause. It tells you which fixes the evidence cannot support; it does not tell you where the fix goes. Decide that after reading the artifacts, the trace and the code. Needs a test that ran with retries enabled; a single attempt is always inconclusive.3 params
Say whether a failing test behaves the same way every time, by comparing its retry attempts within one run. If you are debugging a failing test, call get_debug_evidence first — it returns this plus the regression boundary and every artifact link in one call, so calling this separately afterwards repeats work already done. Returns a computed verdict — "deterministic" (every attempt failed with the same signature, so the failure repeats), "flaky" (an attempt passed on retry, so the outcome is not consistent), or "inconclusive" (too few attempts, or the attempts failed differently) — plus the per-attempt signatures behind it. The verdict describes the behaviour, not the cause. It tells you which fixes the evidence cannot support; it does not tell you where the fix goes. Decide that after reading the artifacts, the trace and the code. Needs a test that ran with retries enabled; a single attempt is always inconclusive.
projectIdstringrequiredProject ID (e.g. project_<id>).testcase_idstringrequiredPlaywright pw_test_id of the failing case.testrun_idstringoptionalRun scope. Omit to use the most recently started run carrying this case.testidinomcp_get_integration_status#Check whether Jira, Linear, Asana, monday.com, or GitHub is connected for a TestDino project. Call this before connect_integration or create_external_issue.4 params
Check whether Jira, Linear, Asana, monday.com, or GitHub is connected for a TestDino project. Call this before connect_integration or create_external_issue.
projectIdstringrequiredTestDino project ID.providerstringrequiredIntegration provider connected to this TestDino project.includeCreateOptionsbooleanoptionalWhen true, include provider create metadata (createOptions: projects, issue types, required/optional fields). Resolved against the provider default target when no target is supplied.targetobjectoptionalProvider-specific target/field values. Jira accepts human-readable aliases such as { jiraProjectKey: "TRX", issueType: "Bug" } or { jiraProjectName, issueTypeName }; raw { jiraProjectId, issueTypeId } also works. Linear { teamId }, Asana { workspaceId, projectId }, monday.com { boardId }.testidinomcp_get_manual_run#Get the full details of one manual test run: name, status, environment, linked release, test stats (total/passed/failed/blocked/untested), contributors, attachments, linked issues. runId accepts either the internal _id or a counter-style ID like "RUN-12".2 params
Get the full details of one manual test run: name, status, environment, linked release, test stats (total/passed/failed/blocked/untested), contributors, attachments, linked issues. runId accepts either the internal _id or a counter-style ID like "RUN-12".
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.runIdstringrequiredInternal _id or counter-style ID (e.g. "RUN-12").testidinomcp_get_manual_test_case#Get the full details of one manual test case: steps, preconditions, postconditions, metadata, linkedIssues, and activity (comments, version history, and execution results across all manual runs). caseId accepts either the internal _id or a human-readable ID like "TC-123". Call this before update_manual_test_case to see current steps, comments, and linked issues before modifying them. Version history and results are read-only — they reflect what happened, you cannot mutate them. Comments and linked issues are added via update_manual_test_case.2 params
Get the full details of one manual test case: steps, preconditions, postconditions, metadata, linkedIssues, and activity (comments, version history, and execution results across all manual runs). caseId accepts either the internal _id or a human-readable ID like "TC-123". Call this before update_manual_test_case to see current steps, comments, and linked issues before modifying them. Version history and results are read-only — they reflect what happened, you cannot mutate them. Comments and linked issues are added via update_manual_test_case.
caseIdstringrequiredInternal _id or human-readable ID like "TC-123".projectIdstringrequiredProject ID. Obtain from the health tool.testidinomcp_get_release#Get the full details of one release: dates, status, linked issues, parent/root, and rolled-up progress stats (run counts, test status breakdown across all runs in this release and its descendants). releaseId accepts either the internal _id or a counter-style ID like "MS-12".2 params
Get the full details of one release: dates, status, linked issues, parent/root, and rolled-up progress stats (run counts, test status breakdown across all runs in this release and its descendants). releaseId accepts either the internal _id or a counter-style ID like "MS-12".
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.releaseIdstringrequiredInternal _id or counter-style ID (e.g. MS-12).testidinomcp_get_run_details#Get the full breakdown of one or more test runs — test statistics, error category breakdown, suite list, and all test cases in the run. Use testrun_id for ID-based lookup or counter for the human-readable run number (e.g. counter="47"). Batch up to 20 runs by comma-separating: testrun_id="id1,id2,id3". Typical workflow: list_testruns() → pick IDs → get_run_details() for the specific run. Set include_ai_insights=true (single testrun_id only) to also get the run's AI Insights under `ai_insights`: AI failure categorization (flaky/bug/ui_change), failure clusters, new-failures cards, the error-analysis table, and the LLM-written run summary. AI payloads are generated lazily — if `ai_insights` sections report status "processing"/"not_generated", poll get_ai_insights(testrun_id=...) until "completed" instead of re-calling this tool. An "unavailable" section carries the upstream statusCode: a 5xx or timeout is transient (retry once via get_ai_insights), a 4xx (bad ids) is terminal.4 params
Get the full breakdown of one or more test runs — test statistics, error category breakdown, suite list, and all test cases in the run. Use testrun_id for ID-based lookup or counter for the human-readable run number (e.g. counter="47"). Batch up to 20 runs by comma-separating: testrun_id="id1,id2,id3". Typical workflow: list_testruns() → pick IDs → get_run_details() for the specific run. Set include_ai_insights=true (single testrun_id only) to also get the run's AI Insights under `ai_insights`: AI failure categorization (flaky/bug/ui_change), failure clusters, new-failures cards, the error-analysis table, and the LLM-written run summary. AI payloads are generated lazily — if `ai_insights` sections report status "processing"/"not_generated", poll get_ai_insights(testrun_id=...) until "completed" instead of re-calling this tool. An "unavailable" section carries the upstream statusCode: a 5xx or timeout is transient (retry once via get_ai_insights), a 4xx (bad ids) is terminal.
projectIdstringrequiredProject ID. Obtain from the health tool.counterstringoptionalRun counter. Number for a single run (e.g. 47), or comma-separated string ("47,48,49", max 20) for batch lookup.include_ai_insightsbooleanoptionalAttach the run's AI Insights (categorization, clusters, error-analysis table, written summary) under `ai_insights`. Requires a single testrun_id (not counter, not a batch).testrun_idstringoptionalSingle test run ID, or comma-separated IDs (max 20).testidinomcp_get_run_error_clusters#Group ONE run's failing tests by shared error signature (normalized error fingerprint), computed for that run only. Returns error clusters (each = one signature + its affected tests + an error category), an `unclustered` bucket for blank/unfingerprintable errors, a per-category rollup, and run totals. Failed/timed-out tests cluster on their final-attempt error; flaky tests cluster on the error they recovered from (pre-recovery). Categories: assertion, timeout, element_not_found, network, other. Use this to answer "what are the distinct failures in this run?" or "which error affected the most tests?" — it is far cheaper than paging every failed case. Optionally narrow with status="failed" or status="flaky" (default "all"). Workflow: list_testruns() → pick a testrun_id → get_run_error_clusters().3 params
Group ONE run's failing tests by shared error signature (normalized error fingerprint), computed for that run only. Returns error clusters (each = one signature + its affected tests + an error category), an `unclustered` bucket for blank/unfingerprintable errors, a per-category rollup, and run totals. Failed/timed-out tests cluster on their final-attempt error; flaky tests cluster on the error they recovered from (pre-recovery). Categories: assertion, timeout, element_not_found, network, other. Use this to answer "what are the distinct failures in this run?" or "which error affected the most tests?" — it is far cheaper than paging every failed case. Optionally narrow with status="failed" or status="flaky" (default "all"). Workflow: list_testruns() → pick a testrun_id → get_run_error_clusters().
projectIdstringrequiredProject ID (e.g. project_<id>).testrun_idstringrequiredThe test run ID to cluster errors for (single run).statusstringoptionalWhich contributing tests populate the clusters (default "all").testidinomcp_get_session#Get the full details of one exploratory session: name, mission, status, assignee, linked release, attachments, linked issues, findings. sessionId accepts either the internal _id or a counter-style ID like "SES-12".2 params
Get the full details of one exploratory session: name, mission, status, assignee, linked release, attachments, linked issues, findings. sessionId accepts either the internal _id or a counter-style ID like "SES-12".
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.sessionIdstringrequiredInternal _id or counter-style ID (e.g. "SES-12").testidinomcp_get_testcase_details#Get full details of a test case — errors, stack traces, steps, console logs, and artifacts. Use testcase_id (the Playwright pw_test_id) for the most precise lookup; it can be used alone for latest detail or paired with testrun_id for exact run-scoped detail. testcase_name resolves through test history; combine it with testrun_id to scope to specific run(s), otherwise the latest run is used. Always pass steps_filter="failed_only" when debugging — it drops unrelated passing setup/hook steps and keeps failed branches plus required parent context, cutting noise significantly. Every stored artifact comes back in `evidence[]` — trace, video, screenshots, and for a visual failure the expected/actual/diff images — each with its attempt index, a `url`, and an `expires_at`. Download what you need as soon as you receive it: the links are minutes-scale by design. If one has expired, call this tool again to mint fresh links rather than treating the artifact as missing. `traceDownloadUrl` points at the first FAILING attempt, which on a flaky test is not the last one. testcaseid, by_title, by_testrun_id (top-level) are deprecated aliases for testcase_id, testcase_name, and testrun_id, kept for backward compatibility.12 params
Get full details of a test case — errors, stack traces, steps, console logs, and artifacts. Use testcase_id (the Playwright pw_test_id) for the most precise lookup; it can be used alone for latest detail or paired with testrun_id for exact run-scoped detail. testcase_name resolves through test history; combine it with testrun_id to scope to specific run(s), otherwise the latest run is used. Always pass steps_filter="failed_only" when debugging — it drops unrelated passing setup/hook steps and keeps failed branches plus required parent context, cutting noise significantly. Every stored artifact comes back in `evidence[]` — trace, video, screenshots, and for a visual failure the expected/actual/diff images — each with its attempt index, a `url`, and an `expires_at`. Download what you need as soon as you receive it: the links are minutes-scale by design. If one has expired, call this tool again to mint fresh links rather than treating the artifact as missing. `traceDownloadUrl` points at the first FAILING attempt, which on a flaky test is not the last one. testcaseid, by_title, by_testrun_id (top-level) are deprecated aliases for testcase_id, testcase_name, and testrun_id, kept for backward compatibility.
projectIdstringrequiredProject ID. Obtain from the health tool.by_fulltitlestringoptionalFull test title including suite prefix.by_testrun_idstringoptionalDeprecated alias for testrun_id (kept for backward compatibility).by_testrun_idsstringoptionalComma-separated (max 20).by_titlestringoptionalDeprecated alias for testcase_name (kept for backward compatibility).history_limitintegeroptionalMaximum history timeline cells to keep when include_history=true.include_historybooleanoptionalAttach DH /analytics/test-history output to returned case detail items.steps_filterstringoptionalUse "failed_only" to drop passing setup/hook steps.testcase_idstringoptionalExact test case ID(s) — Playwright pw_test_id, comma-separated (max 50).testcase_namestringoptionalTest case title — resolves through test history; scoped by testrun_id when given, else latest matching detail.testcaseidstringoptionalDeprecated alias for testcase_id (kept for backward compatibility).testrun_idstringoptionalRun scope for testcase_id / testcase_name lookup. Comma-separated (max 20).testidinomcp_get_trace_analysis#Debug a failing Playwright test from its trace.zip using the Playwright agent CLI (npx playwright trace …, Playwright 1.59+). Returns a runbook that teaches the exact CLI protocol (open → actions → action → snapshot → close) plus how to classify the failure and propose a fix. Pass projectId + testcase_id (the Playwright pw_test_id) to also get a short-lived download URL for that case's hosted trace; optionally scope with testrun_id. Omit the ids to just get the runbook for a trace.zip you already have locally. The analysis runs on your machine — download the trace, run the CLI commands yourself, then report the root cause and fix.3 params
Debug a failing Playwright test from its trace.zip using the Playwright agent CLI (npx playwright trace …, Playwright 1.59+). Returns a runbook that teaches the exact CLI protocol (open → actions → action → snapshot → close) plus how to classify the failure and propose a fix. Pass projectId + testcase_id (the Playwright pw_test_id) to also get a short-lived download URL for that case's hosted trace; optionally scope with testrun_id. Omit the ids to just get the runbook for a trace.zip you already have locally. The analysis runs on your machine — download the trace, run the CLI commands yourself, then report the root cause and fix.
projectIdstringoptionalProject ID — required to resolve the hosted trace download URL.testcase_idstringoptionalPlaywright pw_test_id of the failing case whose hosted trace to resolve.testrun_idstringoptionalOptional run scope for testcase_id (single run).testidinomcp_health#ALWAYS call this first — before any other tool in every session. Verifies your PAT, returns your account identity, and lists every organization and project you can access with their projectId AND human names (orgName, projectName). Every other tool requires a projectId; this is the only way to get it. Extract the projectId for the project the user is asking about (match by projectName if the user gives a name) and store it for all subsequent calls. Each organization also reports your `role` in it (owner, admin, member, billing, or viewer) so you can tell the user what they can do there — treat it as informational, not a security guarantee. Wildcard scopes surface as `projects: { allProjects: true }` with no per-project names — for those, ask the user which projectId to use, or call a listing tool. Recently-renamed orgs/projects may show the old name for up to 30s (registry poll cadence). Also call this whenever you get a PROJECT_NOT_FOUND or auth error from another tool — it will tell you which projects are actually accessible.0 params
ALWAYS call this first — before any other tool in every session. Verifies your PAT, returns your account identity, and lists every organization and project you can access with their projectId AND human names (orgName, projectName). Every other tool requires a projectId; this is the only way to get it. Extract the projectId for the project the user is asking about (match by projectName if the user gives a name) and store it for all subsequent calls. Each organization also reports your `role` in it (owner, admin, member, billing, or viewer) so you can tell the user what they can do there — treat it as informational, not a security guarantee. Wildcard scopes surface as `projects: { allProjects: true }` with no per-project names — for those, ask the user which projectId to use, or call a listing tool. Recently-renamed orgs/projects may show the old name for up to 30s (registry poll cadence). Also call this whenever you get a PROJECT_NOT_FOUND or auth error from another tool — it will tell you which projects are actually accessible.
testidinomcp_list_manual_runs#Browse manual test runs for a project. Filter by status (active|closed), state (new|in_progress|on_hold|done), environment, release (releaseId), tags, or free-text search on name. Default page size 25 (max 200).12 params
Browse manual test runs for a project. Filter by status (active|closed), state (new|in_progress|on_hold|done), environment, release (releaseId), tags, or free-text search on name. Default page size 25 (max 200).
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.environmentstringoptionalFilter by environment label.isClosedbooleanoptionalFilter by closed state (boolean).limitintegeroptionalItems per page. Default 25, max 200.pageintegeroptionalPage number (1-indexed).releaseIdstringoptionalFilter to runs in this release. Pass "none" to list unlinked runs.searchstringoptionalMatch by run name.sortBystringoptionalField to sort results by.sortOrderstringoptionalSort direction.statestringoptionalWorkflow state. Either canonical ("new", "in_progress", "on_hold", "done") or display ("In Progress", "On Hold") form.statusstringoptionalFilter by run status: active or closed.tagsstringoptionalSingle tag or comma-separated tags.testidinomcp_list_manual_test_cases#Search and browse manual test cases with filters. Use suiteId to scope to a folder, search to match by title or caseId (e.g. "TC-123"), status for active/draft/deprecated, and tags for comma-separated tag filtering. Default limit is 10 — increase it if you need more results.13 params
Search and browse manual test cases with filters. Use suiteId to scope to a folder, search to match by title or caseId (e.g. "TC-123"), status for active/draft/deprecated, and tags for comma-separated tag filtering. Default limit is 10 — increase it if you need more results.
projectIdstringrequiredProject ID. Obtain from the health tool.automationStatusstringoptionalAutomation status. Values come from Project Settings → Test Case Properties. Defaults: Manual, Automated, To Be Automated.behaviorstringoptionalBehavior. Values come from Project Settings → Test Case Properties. Defaults: Positive, Negative, Destructive, Not Set.layerstringoptionalLayer. Values come from Project Settings → Test Case Properties. Defaults: E2E, API, Unit, Not Set.limitintegeroptionalMaximum results to return (default 10, max 1000).prioritystringoptionalPriority. Values come from Project Settings → Test Case Properties. Defaults: Critical, High, Medium, Low, Not Set.searchstringoptionalMatch by title or caseId (e.g. "TC-123").severitystringoptionalSeverity. Values come from Project Settings → Test Case Properties. Defaults: Blocker, Critical, Major, Normal, Minor, Trivial, Not Set.statusstringoptionalFilter by test case status.suiteIdstringoptionalFilter to a specific test suite folder.tagsstringoptionalSingle tag or comma-separated tags.timestringoptionalTime filter, e.g. "last 1 hour", "Yesterday", "last 7 days".typestringoptionalType. Values come from Project Settings → Test Case Properties. Defaults: Smoke, Regression, Functional, Integration, E2E, API, Unit, Performance, Security, Accessibility, Usability, Compatibility, Acceptance, Exploratory, Other.testidinomcp_list_manual_test_suites#Get the test suite folder hierarchy for a project. Returns suite IDs, names, parent relationships, and child counts. Always call this before create_manual_test_case — you need the exact suiteName (case-sensitive) to create a test case. Pass parentSuiteId to list only the direct children of a specific suite.2 params
Get the test suite folder hierarchy for a project. Returns suite IDs, names, parent relationships, and child counts. Always call this before create_manual_test_case — you need the exact suiteName (case-sensitive) to create a test case. Pass parentSuiteId to list only the direct children of a specific suite.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.parentSuiteIdstringoptionalFilter to direct children of a specific suite.testidinomcp_list_releases#Browse releases (milestones) for a project. Supports filtering by type, completion status, parent release, and free-text search on name. Pass parentReleaseId to get only the direct children of a release (releases nest up to 3 levels deep). Default page size is 25 (max 200).10 params
Browse releases (milestones) for a project. Supports filtering by type, completion status, parent release, and free-text search on name. Pass parentReleaseId to get only the direct children of a release (releases nest up to 3 levels deep). Default page size is 25 (max 200).
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.isCompletedbooleanoptionalFilter by completion status.limitintegeroptionalItems per page. Default 25, max 200.pageintegeroptionalPage number (1-indexed).parentReleaseIdstringoptionalFilter to direct children of a release.searchstringoptionalMatch by release name.sortBystringoptionalField to sort results by.sortOrderstringoptionalSort direction.statusstringoptionalRelease status (project-specific).typestringoptionalRelease type. Default options: "release", "version", "sprint", "iteration", "plan", "cycle", "feature". Projects can customize this list.testidinomcp_list_run_test_cases#Get the per-case execution records inside a manual run — what the UI shows as rows in the run's test-case table. Each row carries the test case identity (caseKey like "TC-156", title), the current assignee, and the current result/status ("untested", "passed", "failed", etc.). Filter by assignee (email or User _id) or result/status. Use this before update_run_test_case so you have the rtcRef for each case you want to update.10 params
Get the per-case execution records inside a manual run — what the UI shows as rows in the run's test-case table. Each row carries the test case identity (caseKey like "TC-156", title), the current assignee, and the current result/status ("untested", "passed", "failed", etc.). Filter by assignee (email or User _id) or result/status. Use this before update_run_test_case so you have the rtcRef for each case you want to update.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.runIdstringrequiredInternal run _id or counter-style ID (e.g. "RUN-12").assigneestringoptionalFilter by assignee — User _id OR email (server resolves).limitintegeroptionalItems per page (default 25, max 200).pageintegeroptional1-indexed page number.resultstringoptionalFilter by result/status. Display ("Passed") or canonical ("passed") form.searchstringoptionalMatch by case title or caseKey.sortBystringoptionalField to sort by.sortOrderstringoptionalSort direction.statusstringoptionalAlias for result. Same normalization rules.testidinomcp_list_sessions#Browse exploratory sessions for a project. Filter by status (active|closed), state, sessionType, assignee, release (releaseId), tags, or free-text search on name. Default page size 25 (max 200).13 params
Browse exploratory sessions for a project. Filter by status (active|closed), state, sessionType, assignee, release (releaseId), tags, or free-text search on name. Default page size 25 (max 200).
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.assigneeUserIdstringoptionalUser _id (e.g. "user_abc...") OR email address — both are accepted.isClosedbooleanoptionalFilter to closed sessions.limitintegeroptionalItems per page (default 25, max 200).pageintegeroptional1-indexed page number.releaseIdstringoptionalFilter to sessions in this release. Pass "none" for unlinked.searchstringoptionalMatch by session name.sessionTypestringoptionalFilter by session type.sortBystringoptionalField to sort by.sortOrderstringoptionalSort direction.statestringoptionalWorkflow state. Pass canonical ("new", "under_review", "done", "rejected") or display ("Under review") form — server normalizes to lowercase+underscored.statusstringoptionalFilter by status.tagsstringoptionalSingle tag or comma-separated tags.testidinomcp_list_testcase#List and filter test cases across runs. Provide at least one run context: by_testrun_id, counter, by_pages, by_branch, by_time_interval, by_environment, by_author, or by_commit. Without a run context the tool returns an empty result with a warning. KEY INSIGHT: when you use by_branch, by_time_interval, by_author, or by_commit, this tool resolves the matching runs internally — you do NOT need to call list_testruns first. Combine filters freely: e.g. by_branch="main" + by_status="failed" + by_time_interval="1d" gives you all failures on main today in one call. Batch up to 20 run IDs with by_testrun_id="id1,id2,id3". Prefer specific filters and pagination over broad result sets.20 params
List and filter test cases across runs. Provide at least one run context: by_testrun_id, counter, by_pages, by_branch, by_time_interval, by_environment, by_author, or by_commit. Without a run context the tool returns an empty result with a warning. KEY INSIGHT: when you use by_branch, by_time_interval, by_author, or by_commit, this tool resolves the matching runs internally — you do NOT need to call list_testruns first. Combine filters freely: e.g. by_branch="main" + by_status="failed" + by_time_interval="1d" gives you all failures on main today in one call. Batch up to 20 run IDs with by_testrun_id="id1,id2,id3". Prefer specific filters and pagination over broad result sets.
projectIdstringrequiredProject ID. Obtain from the health tool.by_artifactsbooleanoptionalFilter to test cases that have artifacts.by_attempt_numberintegeroptionalExact retry count filter. 0 means initial/no-retry cases (attempt_count=1), 1 means one retry (attempt_count=2).by_authorstringoptionalFilter by commit author, resolving matching runs internally.by_branchstringoptionalFilter by git branch name.by_commitstringoptionalFilter by commit, resolving matching runs internally.by_environmentstringoptionalFilter by environment label, resolving matching runs internally.by_pagesintegeroptionalTest-run page for cross-run lookup (1-indexed, newest first). MCP fetches one run-list page and uses up to 20 matching runs.by_shardintegeroptional1-based shard index — scope results to a single shard of a sharded run.by_statusstringoptionalFilter by test case status.by_tagstringoptionalComma-separated tag names.by_testrun_idstringoptionalSingle test run ID or comma-separated (max 20).by_testsuite_idstringoptionalFilter by suite ID.by_time_intervalstringoptionalTime filter for resolving matching runs, e.g. "1h", "1d", "weekly", "monthly", "last 5 days", or "YYYY-MM-DD,YYYY-MM-DD".by_total_runtimestringoptionalPer-test duration filter. Numbers are SECONDS by default; suffix with `ms` for milliseconds. Examples: ">10" (>10s), "<1000ms", ">5s".counterstringoptionalTest run counter (alternative to by_testrun_id). Single run only, e.g. 47. Use by_testrun_id for batch lookup.limitintegeroptionalItems per page. Data Handler accepts 10, 25, 50, or 100.pageintegeroptional1-indexed page number (default: 1).searchstringoptionalSearch test title or title path.sortstringoptionalCase list sort order.testidinomcp_list_testruns#Browse test runs for a project with optional filters. Use this when you need run-level metadata: pass/fail totals, duration, branch, commit, author, or when you need testrun_id values for follow-up calls. Use specific filters and pagination instead of fetching broad result sets. You do NOT need to call this before list_testcase when you already have branch/time/author filters — list_testcase resolves runs internally. Common time values: "1d", "3d", "weekly", "monthly", or "YYYY-MM-DD,YYYY-MM-DD" for a custom range.12 params
Browse test runs for a project with optional filters. Use this when you need run-level metadata: pass/fail totals, duration, branch, commit, author, or when you need testrun_id values for follow-up calls. Use specific filters and pagination instead of fetching broad result sets. You do NOT need to call this before list_testcase when you already have branch/time/author filters — list_testcase resolves runs internally. Common time values: "1d", "3d", "weekly", "monthly", or "YYYY-MM-DD,YYYY-MM-DD" for a custom range.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.by_authorstringoptionalFilter by commit author.by_branchstringoptionalFilter by git branch name.by_commitstringoptionalFilter by commit hash prefix.by_environmentstringoptionalFilter by CI/deployment environment.by_statusstringoptionalFilter by run status.by_test_case_tagsstringoptionalComma-separated test case tags contained in the run.by_time_intervalstringoptionalTime filter: "1h", "1d", "weekly", "monthly", "last 5 days", or "YYYY-MM-DD,YYYY-MM-DD".limitintegeroptionalItems per page. Data Handler accepts 10, 25, 50, or 100.pageintegeroptional1-indexed page number (default: 1).searchstringoptionalSearch run commit message, or exact counter when numeric.sortstringoptionalRun list sort order.testidinomcp_submit_audit_report#FINAL STEP of the TestDino Playwright audit flow — submits a completed audit report. Requires write permission. Call this only AFTER get_audit_report(action='context') and after you have analyzed the local Playwright code and produced findings. score (0-100) and markdownReport are required; include findings, recommendations, reportName, branch, scope, and target as available. orgId is required — resolve it via health() if you do not have it. Every finding MUST include title, summary, and severity (low|medium|high|critical) — incomplete findings are rejected, not stored. category is normalized to a known bucket. target, if sent, accepts only { value, path } as non-empty strings. Use the same branch/scope/target you passed to get_audit_report(action='context') so the report attaches to the right context.10 params
FINAL STEP of the TestDino Playwright audit flow — submits a completed audit report. Requires write permission. Call this only AFTER get_audit_report(action='context') and after you have analyzed the local Playwright code and produced findings. score (0-100) and markdownReport are required; include findings, recommendations, reportName, branch, scope, and target as available. orgId is required — resolve it via health() if you do not have it. Every finding MUST include title, summary, and severity (low|medium|high|critical) — incomplete findings are rejected, not stored. category is normalized to a known bucket. target, if sent, accepts only { value, path } as non-empty strings. Use the same branch/scope/target you passed to get_audit_report(action='context') so the report attaches to the right context.
markdownReportstringrequiredCompleted markdown report (required).projectIdstringrequiredProject ID (required).scorenumberrequiredFinal audit score 0-100 (required).branchstringoptionalGit branch that was audited.findingsarrayoptionalStructured findings for the completed report.orgIdstringoptionalOrganization ID (required to submit). Resolve via health() if you don't have it.recommendationsarrayoptionalRecommendation strings for the completed report.reportNamestringoptionalShort human-readable title for the saved report.scopestringoptionalAudit scope. Defaults to 'suite'.targetobjectoptionalOptional scoped-audit target. Only { value, path } (non-empty strings) are stored — the dashboard reads these; any other key is rejected.testidinomcp_update_manual_run#Modify an existing manual test run. Send only fields you want to change inside the updates object. Requires write permission. Allowed fields: name, note, environment, releaseId, state, forecast, tags, linkedIssues, attachments, links, selectionMode. Pass updates.status="closed" to close the run (same as the UI "Close run" button: freezes it, snapshots remaining cases). This is not reversible via MCP. IMPORTANT: updates.tags must be a JSON array of strings — e.g. ["smoke","regression"] — NOT a comma-separated string.3 params
Modify an existing manual test run. Send only fields you want to change inside the updates object. Requires write permission. Allowed fields: name, note, environment, releaseId, state, forecast, tags, linkedIssues, attachments, links, selectionMode. Pass updates.status="closed" to close the run (same as the UI "Close run" button: freezes it, snapshots remaining cases). This is not reversible via MCP. IMPORTANT: updates.tags must be a JSON array of strings — e.g. ["smoke","regression"] — NOT a comma-separated string.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.runIdstringrequiredInternal _id or counter-style ID (e.g. "RUN-12").updatesobjectrequiredFields to update: name, note, environment, releaseId, state, forecast, tags, linkedIssues, attachments, links, selectionMode. status="closed" closes the run.testidinomcp_update_manual_test_case#Modify an existing manual test case. Send only the fields you want to change inside the updates object — omit everything else. Requires write permission. IMPORTANT: steps is a full replacement — passing a steps array overwrites all existing steps. Always call get_manual_test_case() first to read current steps before modifying them. For attachments use the nested shape: { add: ["url-or-path"], remove: ["attachment-id"] } — you can add and remove in the same call. To add comments, pass updates.comments as an array of comment-body strings — each is appended as a new comment. Cap of 20 comments/case is enforced. To link issues, pass updates.issues as an array of ticket keys (e.g. ["PROJ-123","ENG-9"]).3 params
Modify an existing manual test case. Send only the fields you want to change inside the updates object — omit everything else. Requires write permission. IMPORTANT: steps is a full replacement — passing a steps array overwrites all existing steps. Always call get_manual_test_case() first to read current steps before modifying them. For attachments use the nested shape: { add: ["url-or-path"], remove: ["attachment-id"] } — you can add and remove in the same call. To add comments, pass updates.comments as an array of comment-body strings — each is appended as a new comment. Cap of 20 comments/case is enforced. To link issues, pass updates.issues as an array of ticket keys (e.g. ["PROJ-123","ENG-9"]).
caseIdstringrequiredInternal _id or human-readable ID like "TC-123".projectIdstringrequiredProject ID. Obtain from the health tool.updatesobjectrequiredFields to update: title (alias: name), description, preconditions, postconditions, status, steps (full replacement), priority, severity, type, layer, behavior, automationStatus, tags, flags, attachments {add, remove}, customFields, comments (array of strings to append), issues (array of ticket keys to link via Jira lookup).testidinomcp_update_release#Modify an existing release. Send only the fields you want to change inside the updates object. Requires write permission. Fields: name, description, note, type, startDate, endDate, isStarted, isCompleted, startedAt, completedAt, linkedIssues, branch, environment, buildTarget, testers, parentReleaseId.3 params
Modify an existing release. Send only the fields you want to change inside the updates object. Requires write permission. Fields: name, description, note, type, startDate, endDate, isStarted, isCompleted, startedAt, completedAt, linkedIssues, branch, environment, buildTarget, testers, parentReleaseId.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.releaseIdstringrequiredInternal _id or counter-style ID (e.g. MS-12).updatesobjectrequiredFields to update: name, description, note, type, startDate, endDate, isStarted, isCompleted, startedAt, completedAt, linkedIssues, branch, environment, buildTarget ({platform,version,buildNumber,source,deployUrl}), testers (User _ids, org members), parentReleaseId.testidinomcp_update_run_test_case#Update one test case inside a manual run. Two modes: (1) Quick verdict — pass updates.assigneeUserId and/or updates.result/status to assign and set a result. (2) Detailed result — additionally pass updates.comment, updates.linkedIssues, updates.attachments, or updates.stepResults to log a full result entry. NOTE: combining updates.assigneeUserId with any detailed-result field in one call is rejected — make two separate calls. Requires write permission. rtcRef accepts the caseKey ("TC-156"), the internal tcm_rtc_... RTC ID, or the underlying test case _id. Closed runs reject result writes.4 params
Update one test case inside a manual run. Two modes: (1) Quick verdict — pass updates.assigneeUserId and/or updates.result/status to assign and set a result. (2) Detailed result — additionally pass updates.comment, updates.linkedIssues, updates.attachments, or updates.stepResults to log a full result entry. NOTE: combining updates.assigneeUserId with any detailed-result field in one call is rejected — make two separate calls. Requires write permission. rtcRef accepts the caseKey ("TC-156"), the internal tcm_rtc_... RTC ID, or the underlying test case _id. Closed runs reject result writes.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.rtcRefstringrequiredPer-case record reference — tcm_rtc_... _id, caseKey ("TC-156"), or underlying test case _id.runIdstringrequiredInternal run _id or counter-style ID (e.g. "RUN-12").updatesobjectrequiredQuick verdict: assigneeUserId (email or _id), result/status (display or canonical), elapsed (seconds). Detailed result: comment (rich HTML), linkedIssues, attachments, stepResults ([{ order, status, comment }]).testidinomcp_update_session#Modify an existing exploratory session. Send only fields you want to change inside the updates object. Requires write permission. Allowed fields: name, mission, sessionType, config, environment, releaseId, assigneeUserId, state, estimate, tags, linkedIssues, attachments. Pass updates.status="closed" to close the session (same as the UI "Close session" button: freezes it, snaps state to the project's "Done" option). This is not reversible via MCP. IMPORTANT: updates.tags must be a JSON array of strings — e.g. ["exploratory","auth"] — NOT a comma-separated string.3 params
Modify an existing exploratory session. Send only fields you want to change inside the updates object. Requires write permission. Allowed fields: name, mission, sessionType, config, environment, releaseId, assigneeUserId, state, estimate, tags, linkedIssues, attachments. Pass updates.status="closed" to close the session (same as the UI "Close session" button: freezes it, snaps state to the project's "Done" option). This is not reversible via MCP. IMPORTANT: updates.tags must be a JSON array of strings — e.g. ["exploratory","auth"] — NOT a comma-separated string.
projectIdstringrequiredProject ID (e.g. project_<id>). Obtain from the health tool.sessionIdstringrequiredInternal _id or counter-style ID (e.g. "SES-12").updatesobjectrequiredFields to update: name, mission, sessionType, config, environment, releaseId, assigneeUserId, state, estimate, tags, linkedIssues, attachments. status="closed" closes the session.testidinomcp_verify_fix#Check whether a fix actually held for one test, against the run you saw when you proposed it. Splits the test's run history at that baseline and compares after against before, returning "fixed" (passing with no retries since), "not_fixed" (still failing with the same error), "changed_failure" (still failing, but a different error — a new investigation, and only when every failure since carried a comparable fingerprint), "still_failing" (still failing, but the errors cannot be compared, so neither same nor different can be claimed), "unstable" (passing only after retries, which is not fixed), "no_runs_since_baseline", or "baseline_not_found" (the run id is not one this test executed in). Call this after a new run lands. An unchanged error means the fix missed, not that the test is flaky. The baseline run must be one this test actually executed in — an id from another project or another test is rejected rather than answered.4 params
Check whether a fix actually held for one test, against the run you saw when you proposed it. Splits the test's run history at that baseline and compares after against before, returning "fixed" (passing with no retries since), "not_fixed" (still failing with the same error), "changed_failure" (still failing, but a different error — a new investigation, and only when every failure since carried a comparable fingerprint), "still_failing" (still failing, but the errors cannot be compared, so neither same nor different can be claimed), "unstable" (passing only after retries, which is not fixed), "no_runs_since_baseline", or "baseline_not_found" (the run id is not one this test executed in). Call this after a new run lands. An unchanged error means the fix missed, not that the test is flaky. The baseline run must be one this test actually executed in — an id from another project or another test is rejected rather than answered.
baseline_run_idstringrequiredThe run you saw the failure in when you proposed the fix.projectIdstringrequiredProject ID (e.g. project_<id>).testcase_namestringrequiredFull test title, same identifier debug_testcase takes.suite_file_pathstringoptionalSpec file path — only needed when the title is shared across files.