QA MCP for QA20-server field guide

Category 2 of 5 · Servers 06–10

Test & bug management

The highest-value and highest-risk category. Value, because writing up 40 test cases from an acceptance-criteria doc is exactly the work that should have been automated a decade ago. Risk, because every write tool here mutates state your whole organisation can see — and there's no undo button on a mangled test cycle.

Blast-radius rules for this entire category
  1. Dedicated service account. Not your token. The audit trail should say svc-qa-agent, and revoking it should be one click that affects nobody's day job.
  2. Sandbox project first. Do the first two weeks against a throwaway project. Every one of these servers will do something surprising in week one.
  3. Read tools by default; enable writes per task. Where the server supports scoping or read-only mode, use it.
  4. Confirm the target before every write. Make the agent echo project key, cycle, and issue count before it creates or updates anything. Bulk operations are where damage scales.
06

TestRail MCP

Projects, suites, sections, cases, runs and results — through conversation instead of the TestRail UI.

Community · several packages API key auth Writes shared state

Why a tester should care

TestRail's UI is fine for reading and miserable for bulk authoring. Creating 40 cases from a requirements document means 40 round trips through a modal, and copying a case between sections is a right-click adventure. This is the exact shape of work an agent does well: structured, repetitive, schema-constrained.

The subtler win is coverage analysis. Ask "which sections have no cases tagged for the payments epic" and you get an answer in seconds; doing it by hand means exporting to CSV and pivoting.

Which package

There is no vendor-official TestRail MCP server. Several community implementations exist with overlapping names and different coverage — @bun913/mcp-testrail (case-focused, actively published), @uarlouski/testrail-mcp-server (projects, cases, runs, results, attachments), mcp-testrail, and others. Choose on three criteria, in this order:

  1. Recent commits. A TestRail server abandoned six months ago will break on the next API change and nobody will fix it.
  2. Explicit tool list in the README. If you can't see which write tools exist before installing, don't install.
  3. Whether it exposes delete. Prefer one that doesn't, or that lets you disable it.

Tool surface

GroupTypical toolsRisk
ReadgetProjects, getSuites, getSections, getCases, getCase, getCaseFields, getRunsSafe — start here
AuthoraddCase, updateCase, updateCases, addBddMedium — updateCases is bulk, treat with care
OrganisecopyToSection, moveToSection, addSectionMedium — moves are hard to reverse at scale
ExecuteaddRun, addResult, addResultsForCases, closeRunMedium — closing a run is final
DestructivedeleteCase, deleteSection, deleteRunHigh — disable if you can

Wire it up

mcp config — shape is consistent across packages
{
  "mcpServers": {
    "testrail": {
      "command": "npx",
      "args": ["-y", "<chosen-testrail-mcp-package>"],
      "env": {
        "TESTRAIL_URL": "https://yourorg.testrail.io",
        "TESTRAIL_USERNAME": "svc-qa-agent@yourorg.com",
        "TESTRAIL_API_KEY": "${TESTRAIL_API_KEY}"
      }
    }
  }
}

Generate the API key under the service account's profile settings, not your own. In TestRail the key inherits that user's project permissions — so scope the service account to the projects the agent is allowed to touch and nothing else. That is a far stronger control than any prompt instruction, because it survives the agent misunderstanding you.

Workflows

1 · Requirements → cases

Read the acceptance criteria in docs/PRD-payments.md. Draft TestRail cases for the "Refunds" section of project 7: title, preconditions, steps, expected result, priority. Show me the full list as a table first — do not create anything yet.
Approved, with two edits: drop case 4, and change case 9's priority to High. Create them in section 112 and report the new case IDs.

The two-phase pattern — draft, review, then commit — is not optional here. It is the difference between an agent that saves you two hours and one that leaves 40 malformed cases someone has to delete by hand.

2 · Coverage gap analysis

List every case in project 7 with no automation type set, grouped by section, and tell me which sections have the worst automation coverage.

3 · Results ingestion after a CI run

Here's the JUnit XML from build 4821 at artifacts/junit.xml. Create a run in project 7 named "Regression — build 4821" against the Smoke suite, map results by the C#### case id in each test name, and post them. List any tests whose case id didn't resolve rather than guessing.

"Rather than guessing" is load-bearing. An agent that fuzzy-matches test names to case titles will cheerfully mark the wrong case as passed.

Gotchas

  • Custom fields break naive tools. Most TestRail instances have mandatory custom fields. Have the agent call getCaseFields first and build against the real schema.
  • Rate limits. TestRail Cloud throttles. Bulk creation of 200 cases one call at a time will hit it; prefer bulk endpoints where the server exposes them.
  • Case IDs are not stable across projects. Agents confuse case id, run id, test id, and result id constantly. Ask for explicit ids in output and verify one by hand.
  • No undo. TestRail has no trash can for deleted cases.
Verdict

Genuinely useful for case authoring and results ingestion. Community-maintained, so evaluate the specific package rather than the category. Sandbox project for the first two weeks, always.

07

Xray MCP (Jira)

Tests, Test Executions, Test Sets and Test Plans as native Jira issues, driven through Xray's GraphQL API.

Community Client ID + secret Writes to Jira Core stack

Why a tester should care

Xray's design decision is that a Test is a Jira issue. That gives you traceability for free — a Test links to a Story, an Execution links to a Version, a failed Test links to a Bug, and Jira's native reporting sees all of it. The cost is that the Jira + Xray UI is genuinely slow to work in. Creating an execution, adding tests, and recording results is a lot of clicking through two products that don't quite share a design language.

An MCP server collapses that. It also does something the UI is bad at: bulk import of automation results with correct linkage back to the right test issues, without a CI plugin.

Tool surface

GroupTypical toolsNotes
Readget_test, get_tests, get_test_executions, get_test_plans, get_test_runsJQL-flavoured filtering; safe
Authorcreate_test, update_test, add_test_steps, update_test_typeManual, Cucumber, and Generic test types behave differently
Organisecreate_test_set, add_tests_to_set, create_test_plan, add_tests_to_planSets are static groupings; plans track across versions
Executecreate_test_execution, update_test_run_status, import_execution_resultsThe highest-value tools in the whole category
Destructivedelete_test, remove_tests_from_setDeletes a Jira issue. Treat accordingly.

Wire it up

Credentials come from Xray, not Jira. In Jira, go to Xray → Global Settings → API Keys and create a key for a dedicated service user; for Xray Cloud you can also manage keys at xray.cloud.getxray.app/api-keys. You get a client ID and client secret, which the server exchanges for a token against the GraphQL endpoint https://xray.cloud.getxray.app/api/v2/graphql.

mcp config
{
  "mcpServers": {
    "xray": {
      "command": "npx",
      "args": ["-y", "<chosen-xray-mcp-package>"],
      "env": {
        "XRAY_CLIENT_ID": "${XRAY_CLIENT_ID}",
        "XRAY_CLIENT_SECRET": "${XRAY_CLIENT_SECRET}",
        "XRAY_BASE_URL": "https://xray.cloud.getxray.app"
      }
    }
  }
}
Server DC vs Cloud

Xray Server/Data Center uses a different authentication model and a REST API rather than the Cloud GraphQL endpoint. Most community MCP servers target Cloud. Check this before you spend an afternoon debugging 401s.

Workflows

1 · Story → tests, linked

Read PROJ-1842 and its acceptance criteria. Draft Xray Test issues covering each criterion plus the obvious negative cases. Show me titles and steps as a table. On my approval, create them in PROJ, link each to PROJ-1842 with "tests", and add them to a new Test Set named "PROJ-1842 coverage".

2 · Automation results import

Import artifacts/junit.xml as a new Test Execution in PROJ, summary "Nightly regression — 2026-08-13", environment "staging", fix version 4.2.0. Then list the failed tests with their linked stories.

That second sentence is what Xray is for. "Which stories are at risk because their tests failed last night" is a question no other tool in this guide can answer in one hop.

3 · Release-readiness check

For fix version 4.2.0: how many tests in the release Test Plan have never been executed, how many are failing, and which stories have no linked tests at all?

4 · Defect creation with evidence

Test run PROJ-2210 failed. Create a Bug in PROJ linked to it, using the Playwright trace at artifacts/trace.zip and the console errors from the run as the description. Set priority from the linked story's priority. Show me the draft before creating.

Gotchas

  • Write tools mutate shared state and there is no dry-run. A malformed bulk import creates real Jira issues that real people get notified about. Always draft first.
  • GraphQL error messages are unhelpful. Expect vague failures on schema mismatches; the agent may retry with slightly different bad input rather than stopping.
  • Test type matters. Steps behave differently for Manual vs Cucumber vs Generic. An agent that picks the wrong type produces tests that look right and can't be executed.
  • Xray rate-limits the GraphQL API. Bulk operations need pacing.
  • Community-maintained. Multiple implementations of varying quality exist. Read the source of the one you pick — it holds credentials that can write to your Jira.
Verdict

The strongest traceability story of any server in this guide, and worth the setup cost if you're already on Xray. Just don't let it write to a real project on day one. See the Xray vs Zephyr comparison if you're choosing.

08

Zephyr Scale MCP

Test cases, cycles, executions and folder organisation for the Zephyr Scale Jira plugin.

Community API token Writes to Jira

Why a tester should care

Zephyr Scale takes the opposite architectural bet to Xray: test cases live in Zephyr's own data model with a folder tree, linked to Jira issues rather than being Jira issues. If you came from TestRail or qTest, the folder-and-cycle mental model will feel immediately familiar, and the hierarchy is genuinely nicer to organise thousands of cases in.

The MCP server matters most for the same reason as TestRail's: bulk authoring and folder surgery are tedious in the UI and trivial to describe in a sentence.

Tool surface

GroupTypical toolsNotes
Casesget_test_cases, get_test_case, create_test_case, update_test_case, get_test_case_stepsSteps are a separate call — agents forget this and create empty cases
Foldersget_folders, create_folderFolder ids, not paths. Resolve the tree first.
Cyclesget_test_cycles, create_test_cycle, add_test_cases_to_cycleThe unit of planned execution
Executionsget_test_executions, create_test_execution, update_execution_statusRecords the actual result

Wire it up

Generate an API access token from Zephyr Scale's own settings (not a Jira API token — they are different credentials, and mixing them up is the most common setup failure). The Cloud API base is https://api.zephyrscale.smartbear.com/v2.

mcp config
{
  "mcpServers": {
    "zephyr-scale": {
      "command": "npx",
      "args": ["-y", "@bun913/mcp-zephyr-scale"],
      "env": {
        "ZEPHYR_SCALE_API_TOKEN": "${ZEPHYR_SCALE_API_TOKEN}",
        "ZEPHYR_SCALE_BASE_URL": "https://api.zephyrscale.smartbear.com/v2",
        "ZEPHYR_SCALE_PROJECT_KEY": "PROJ"
      }
    }
  }
}
Pin the project key

Setting ZEPHYR_SCALE_PROJECT_KEY in the environment is a cheap guardrail: the agent cannot wander into another team's project even if it wants to. Do the equivalent wherever a server offers it.

Workflows

1 · Structured bulk authoring

Create a folder "Payments / Refunds" under the PROJ test case tree, then create cases for each scenario in docs/refund-scenarios.md with steps, expected results, and a link to PROJ-1842. Draft the full list for approval first.

2 · Cycle planning for a release

Create a test cycle "Release 4.2 — Regression" for PROJ, add every case in the Payments and Checkout folders with priority High or Critical, and tell me the total case count and estimated duration from the cases' own estimates.

3 · Execution status reporting

For cycle "Release 4.2 — Regression": pass rate by folder, list of blocked executions with their reasons, and which cases haven't been run. Format as markdown I can paste into the release channel.

4 · Housekeeping

Find cases in PROJ not executed in any cycle for the last 6 months, grouped by folder. Don't change anything — I want to review candidates for archival.

Gotchas

  • Zephyr Scale ≠ Zephyr Squad. Different products, different APIs. A server built for one will not work with the other.
  • Steps are a separate resource. The most common agent error is creating a case and never populating its steps. Verify the first few by hand.
  • Folder ids, not paths. Have the agent resolve the folder tree before creating anything, or cases land at the root and you're moving them by hand.
  • Community-maintained, thinner ecosystem than Xray. Fewer implementations to choose from and less battle-testing.
Verdict

Solid if you're already on Zephyr Scale. Don't switch TMS to get a better MCP server — the migration cost dwarfs the benefit, and both categories are community-maintained anyway.

09

Jira MCP (Atlassian)

Official Atlassian remote MCP server: Jira issues, JQL search, and Confluence pages, over OAuth.

Official · Atlassian Remote · OAuth Everyone sees the output Core stack

Why a tester should care

This is the spine. Xray and Zephyr handle the test artifacts; Jira holds the requirement the test exists to verify, and the defect the failure produces. With the official server you also get Confluence, which is where the acceptance criteria that nobody put in the ticket actually live.

The single best QA use is not creating bugs — it is requirement interrogation. Feed an agent a story plus its Confluence spec and ask what's ambiguous, untestable, or missing an error case. That's a static-analysis pass on requirements, and it catches defects before a line of code exists, which is the cheapest possible place to catch them.

Tool surface

GroupTypical toolsRisk
SearchJQL search, get issue, get comments, get transitionsSafe
WriteCreate issue, edit issue, add comment, transition issueHigh — notifies watchers instantly
ConfluenceSearch pages, get page content, create/update pageMedium to high
ContextGet accessible resources / cloud idSafe — needed to pick the right site

Wire it up

Atlassian's server is remote and OAuth-based, so there are no long-lived tokens sitting in a config file — a meaningful security improvement over the community alternatives. Your Atlassian admin may need to approve the connection at the org level.

shell — Claude Code
claude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp
mcp config — remote HTTP transport
{
  "mcpServers": {
    "atlassian": {
      "type": "http",
      "url": "https://mcp.atlassian.com/v1/mcp"
    }
  }
}
OAuth means the agent inherits your permissions

Whatever you can see and edit in Jira, the agent can see and edit. If that's uncomfortable — and for a QA lead with admin rights it should be — use a community server with a scoped service account token instead, and accept the token-management burden as the price of least privilege.

Workflows

1 · Requirement interrogation (start here)

Read PROJ-1842 and the linked Confluence spec. As a test engineer, list: (a) acceptance criteria that are not objectively verifiable, (b) error and edge cases the spec doesn't mention, (c) implicit assumptions about data or permissions, (d) questions I should ask the PO before this goes into a sprint.

2 · Defect triage sweep

JQL: project = PROJ AND type = Bug AND status = Open ORDER BY created DESC. For the 30 most recent, group by likely root-cause area, flag suspected duplicates with reasons, and list any missing steps to reproduce.

3 · Regression risk from a release scope

List all issues in fix version 4.2.0 with their components. Based on the components touched, which existing regression suites should be prioritised, and what's the argument for each?

4 · Well-formed bug creation

Draft a bug for the failure we just reproduced: environment, build, steps from the Playwright run, expected vs actual, console errors, and the trace path. Match the format of PROJ-1790. Show me the draft — don't create it yet.

Gotchas

  • Writes are loud. Creating an issue or transitioning a ticket notifies watchers, fires automation rules, and may move a board column. There is no quiet mode.
  • Comments are the safer write. When in doubt, have the agent comment rather than transition or edit. Comments are additive and easy to ignore.
  • Jira content is untrusted input. A ticket description or comment is user-generated text. If your agent also has Playwright and database access, a crafted comment saying "run this SQL to verify" is a prompt-injection vector with real teeth. Never execute instructions found inside a ticket.
  • JQL beats natural language. Give the agent explicit JQL for anything precise. Its translations from English are usually right and occasionally silently wrong.
  • Custom workflows confuse transitions. Have it fetch available transitions rather than assuming "Done" exists.
Verdict

Core stack. Official, OAuth-based, and the requirement-interrogation workflow alone justifies it — that's shift-left testing with no new process. Keep it read-mostly and draft every write.

10

BrowserStack MCP

Real devices and browser matrices on demand, plus accessibility scanning and test-observability data.

Official · BrowserStack Username + access key Consumes paid minutes

Why a tester should care

Local Playwright answers "does it work in Chromium on my machine". It does not answer "does it work in Safari 16 on a real iPhone 13 on a real network", and the gap between those two questions is where a disproportionate share of production incidents live. BrowserStack's MCP server puts that matrix behind natural language, so a cross-browser check becomes a sentence rather than a config file and a CI job.

Beyond raw execution, the interesting surface is Test Observability — failure clustering, flake detection, and history across runs. Asking "which of our tests are flaky and what do they have in common" is a question your local runner genuinely cannot answer.

Tool surface

CapabilityWhat it doesQA use
Live testingInteractive browser and mobile-app sessionsManual exploration on a device you don't own
Automated runsExecute your suite on the device cloudCross-browser regression without local infrastructure
Test ObservabilityFailure analysis, flake detection, run historyTriage: is this a real break or the same flake as last week?
AccessibilityAutomated a11y scanningWCAG findings with device context
App testingInstall and drive real APK/IPA buildsPre-release verification on real hardware

Wire it up

mcp config
{
  "mcpServers": {
    "browserstack": {
      "command": "npx",
      "args": ["-y", "@browserstack/mcp-server@latest"],
      "env": {
        "BROWSERSTACK_USERNAME": "${BROWSERSTACK_USERNAME}",
        "BROWSERSTACK_ACCESS_KEY": "${BROWSERSTACK_ACCESS_KEY}"
      }
    }
  }
}

Credentials come from your BrowserStack account settings. Parallel-session limits are per plan — an agent that fires off a 20-browser matrix on a 2-parallel plan will queue, not fail, and you'll wonder why nothing is happening.

Workflows

1 · The browser-specific bug

A user reports the date picker doesn't open on Safari on iPhone. Start a live session on iPhone 14, Safari, iOS 17, reproduce it on staging, and capture what you see. Then check whether it also happens on iPad and on desktop Safari.

2 · Release matrix run

Run the smoke suite against Chrome/Windows 11, Safari/macOS Sonoma, Edge/Windows 11, and Samsung Galaxy S23. Report only the browser-specific failures — skip anything that fails everywhere, that's a real bug not a compat bug.

That filter is the whole trick: separating "broken" from "broken here" is the only reason to run a matrix at all.

3 · Flake investigation

Using Test Observability, list our top 10 flakiest tests over the last 30 days with flake rate and failure pattern. Group them by suspected cause — timing, network, or test isolation.

4 · Accessibility scan with device context

Run an accessibility scan on the checkout flow across desktop Chrome and mobile Safari. List violations by WCAG criterion, flag any that appear on only one platform, and rank by user impact.

Gotchas

  • Minutes cost money. An agent that decides to "check all major browsers" can burn a month's quota in an afternoon. Specify the matrix explicitly, every time.
  • Local testing needs a tunnel. Staging behind a VPN requires BrowserStack Local; the agent won't set that up for you and the failure looks like a generic timeout.
  • Real devices are slower. Sessions queue and start slowly. Don't put an agent-driven matrix run in a tight feedback loop — this is a nightly or pre-release activity.
  • Not a replacement for local Playwright. Iterate locally, verify on the matrix. Doing everything on the cloud is slow and expensive.
Verdict

Worth it if you already pay for BrowserStack — the observability and live-session workflows are the strongest part, more than the raw execution. Just bound the matrix in your prompts.

Choosing between the test-management servers

TestRailXrayZephyr Scale
Data modelStandalone TMSTests are Jira issuesOwn model, linked to Jira
TraceabilityVia integrationNative, strongestVia issue links
OrganisationSuites + sectionsTest Sets / PlansFolder tree, nicest at scale
AuthAPI keyClient ID + secretAPI token
MCP maturitySeveral community pkgsSeveral community pkgsFewer options
Best whenTMS is separate from Jira by choiceEverything lives in JiraComing from TestRail/qTest into Jira

Full head-to-head, including which one to pick for a Jira-based team, is in the playbooks.