Blast-radius rules for this entire category
- 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.
- Sandbox project first. Do the first two weeks against a throwaway project.
Every one of these servers will do something surprising in week one.
- Read tools by default; enable writes per task. Where the server supports scoping
or read-only mode, use it.
- 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.
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:
- Recent commits. A TestRail server abandoned six months ago will break on the
next API change and nobody will fix it.
- Explicit tool list in the README. If you can't see which write tools exist before
installing, don't install.
- Whether it exposes delete. Prefer one that doesn't, or that lets you disable it.
| Group | Typical tools | Risk |
| Read | getProjects, getSuites, getSections, getCases, getCase, getCaseFields, getRuns | Safe — start here |
| Author | addCase, updateCase, updateCases, addBdd | Medium — updateCases is bulk, treat with care |
| Organise | copyToSection, moveToSection, addSection | Medium — moves are hard to reverse at scale |
| Execute | addRun, addResult, addResultsForCases, closeRun | Medium — closing a run is final |
| Destructive | deleteCase, deleteSection, deleteRun | High — 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.
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.
| Group | Typical tools | Notes |
| Read | get_test, get_tests, get_test_executions, get_test_plans, get_test_runs | JQL-flavoured filtering; safe |
| Author | create_test, update_test, add_test_steps, update_test_type | Manual, Cucumber, and Generic test types behave differently |
| Organise | create_test_set, add_tests_to_set, create_test_plan, add_tests_to_plan | Sets are static groupings; plans track across versions |
| Execute | create_test_execution, update_test_run_status, import_execution_results | The highest-value tools in the whole category |
| Destructive | delete_test, remove_tests_from_set | Deletes 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.
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.
| Group | Typical tools | Notes |
| Cases | get_test_cases, get_test_case, create_test_case, update_test_case, get_test_case_steps | Steps are a separate call — agents forget this and create empty cases |
| Folders | get_folders, create_folder | Folder ids, not paths. Resolve the tree first. |
| Cycles | get_test_cycles, create_test_cycle, add_test_cases_to_cycle | The unit of planned execution |
| Executions | get_test_executions, create_test_execution, update_execution_status | Records 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.
| Group | Typical tools | Risk |
| Search | JQL search, get issue, get comments, get transitions | Safe |
| Write | Create issue, edit issue, add comment, transition issue | High — notifies watchers instantly |
| Confluence | Search pages, get page content, create/update page | Medium to high |
| Context | Get accessible resources / cloud id | Safe — 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.
| Capability | What it does | QA use |
| Live testing | Interactive browser and mobile-app sessions | Manual exploration on a device you don't own |
| Automated runs | Execute your suite on the device cloud | Cross-browser regression without local infrastructure |
| Test Observability | Failure analysis, flake detection, run history | Triage: is this a real break or the same flake as last week? |
| Accessibility | Automated a11y scanning | WCAG findings with device context |
| App testing | Install and drive real APK/IPA builds | Pre-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
| TestRail | Xray | Zephyr Scale |
| Data model | Standalone TMS | Tests are Jira issues | Own model, linked to Jira |
| Traceability | Via integration | Native, strongest | Via issue links |
| Organisation | Suites + sections | Test Sets / Plans | Folder tree, nicest at scale |
| Auth | API key | Client ID + secret | API token |
| MCP maturity | Several community pkgs | Several community pkgs | Fewer options |
| Best when | TMS is separate from Jira by choice | Everything lives in Jira | Coming from TestRail/qTest into Jira |
Full head-to-head, including which one to pick for a Jira-based team, is in the
playbooks.