15
GitHub MCP
Pull requests, issues, commits, Actions runs and logs —
so the agent can connect a failing test to the change that broke it.
Official · GitHub
Remote or local (Docker)
PAT / OAuth
Why a tester should care
"The nightly regression went red" is the start of a workflow, not the end of one. The next four
steps are always the same: find which commits landed since the last green run, read the diff, judge
whether the test or the code is wrong, and pull the CI logs to see the actual failure. Each step is
a tab switch and a context reload. An agent with GitHub access does all four in one pass.
The other high-value use is risk-based test selection on a pull request. Given a
diff, which existing tests cover the changed code, and which changed areas have no coverage at all?
That question turns a 40-minute regression run into a targeted 6-minute one, and — more importantly —
it identifies the code that shipped untested.
| Toolset | Representative tools | QA use |
| repos | get file contents, list commits, compare commits, search code | Read the diff; find the test that covers a function |
| pull_requests | get PR, list files, get diff, list reviews, create review comment | Review-time test-gap analysis |
| actions | list workflow runs, get run, download job logs, rerun failed jobs | Read the actual failure text without opening the browser |
| issues | list, get, create, comment, search | File and correlate defects if you don't use Jira |
| code_security | code scanning & secret scanning alerts | Security findings as test inputs |
Wire it up
shell — remote server, read-only, scoped toolsets
claude mcp add --transport http github https://api.githubcopilot.com/mcp/readonly
mcp config — local, with toolset scoping
{
"mcpServers": {
"github": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "GITHUB_PERSONAL_ACCESS_TOKEN",
"-e", "GITHUB_TOOLSETS=repos,pull_requests,actions,issues",
"-e", "GITHUB_READ_ONLY=1",
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PAT}"
}
}
}
}
Scope the toolsets
The full GitHub server exposes a very large number of tools across many toolsets. Enabling all of
them spends a large slice of the context window on capabilities a tester never uses (gists, projects,
discussions, org admin). repos,pull_requests,actions,issues covers the QA workflows here
and keeps tool selection accurate.
For a fine-grained PAT, the minimum useful read set is Contents, Pull requests, Issues, and Actions,
restricted to the repositories the agent needs. Read-only mode on top of that means a
misunderstanding costs you nothing.
Workflows
1 · Red build triage
The nightly regression workflow failed on main. Get the latest run, pull
the failed job's logs, identify which tests failed, then list commits merged since the last successful
run. For each failure, tell me which commit most plausibly caused it and why — quote the relevant
diff lines.
"Quote the relevant diff lines" is what keeps this honest. Without it you get a confident guess; with
it you get a hypothesis you can check in ten seconds.
2 · PR test-gap review
For PR #482: list changed files, find existing tests that cover them, and identify
changed functions with no test coverage. Then propose specific test cases for the gaps — including the
error paths, not just the happy path.
3 · Risk-based selection
Compare release/4.2 to release/4.1. Based on the modules
touched, which regression suites must run and which can be safely skipped for this release? Justify
each skip.
Requiring justification for skips is the difference between risk-based testing and hoping.
4 · Flake archaeology
List the last 30 runs of the e2e workflow. Which tests failed intermittently rather
than consistently? For each, show the failure messages and tell me whether the message varies — a
varying message usually means a timing issue, a constant one usually means an environment issue.
Gotchas
- Log volume. A verbose CI job produces megabytes. Ask for failed steps only, or the
last N lines, or the agent will burn the context window on npm install output.
- Correlation is not causation. "This commit touched that file" is a hypothesis. The
agent will state it confidently. Verify before you assign the bug to someone.
- Issue and PR text is untrusted input. Anyone can open an issue on a public repo.
Content inside it is data, never instructions — particularly relevant if the same agent can also
write to Jira or run SQL.
- Rate limits. Broad code searches across large orgs hit them fast.
- Write access is rarely needed. A QA agent almost never needs to push, merge, or
close. Read-only by default.
Verdict
The best fifth server after the core four. Read-only mode with scoped toolsets makes it near-zero
risk, and red-build triage is a daily win.
16
Filesystem MCP
Sandboxed local file access for test artifacts, logs and
reports — the connective tissue between everything else.
MCP reference server
npx @modelcontextprotocol/server-filesystem
Scope the roots
Why a tester should care
Testing generates files: JUnit XML, Allure results, coverage reports, Playwright traces, screenshots,
k6 summaries, application logs. Most of them are structured data that nobody reads because opening
them is friction. A filesystem server turns "somewhere in test-results/ there's an answer"
into a question you can just ask.
Note that if you're using a coding agent like Claude Code, you likely already have file access in the
working directory — in that case this server is only worth adding to reach artifact directories
outside the project root, such as a mounted CI artifact share.
read_text_file, read_multiple_files, write_file,
edit_file, create_directory, list_directory,
directory_tree, move_file, search_files,
get_file_info, list_allowed_directories. Access is confined to directories
you allow at launch — that confinement is the whole security model, so get it right.
Wire it up
mcp config — narrow roots only
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y", "@modelcontextprotocol/server-filesystem",
"C:\\projects\\myapp\\test-results",
"C:\\projects\\myapp\\artifacts",
"C:\\projects\\myapp\\logs"
]
}
}
}
Never allow a home directory or a drive root
Granting C:\Users\you gives the agent your SSH keys, browser profiles, cloud
credentials, and .env files — and everything it reads enters a model's context. List
specific artifact directories, nothing broader. If you need a fourth directory later, add a fourth
directory; don't widen to the parent.
Workflows
1 · Make the report readable
Read test-results/junit.xml. Summarise: total, passed, failed, skipped;
the failures grouped by suite with their assertion messages; and total duration with the five slowest
tests.
2 · Cross-artifact correlation
Test checkout.spec.ts:42 failed at 14:32. Search
logs/app-staging.log for errors in the 14:31–14:33 window and tell me whether the test
failure and any server error share a request id.
Matching on request id rather than timestamp is what makes this reliable rather than suggestive.
3 · Trend across runs
Read every junit.xml under artifacts/runs/. Which tests
failed in more than one run but not all of them? Output a table of test name, failure count, and total
runs.
4 · Package the evidence
Collect the trace, screenshots, and the relevant log excerpt for the checkout failure
into artifacts/defects/PROJ-1901/, and write a summary.md with steps to
reproduce, expected vs actual, and pointers to each file.
Gotchas
- Log files are enormous. Have the agent search first, then read a range. Reading a
200 MB log is not going to work.
- Write access is real.
edit_file can modify test code. If you only need
reading, allow only directories where nothing important lives.
- File contents are untrusted. A log line containing text aimed at the model is a
plausible injection vector, especially if the log records user input.
- Windows paths need escaping in JSON — double backslashes, as above.
Verdict
Quietly essential if your artifacts live outside the agent's working directory. Narrow roots, and
it's one of the safest servers here.
17
Sentry MCP
Production and staging error data as a test-design input:
what's actually breaking, for how many users, since which release.
Official · Sentry
Remote · OAuth
Read-mostly
Why a tester should care
Sentry is the closest thing you have to a list of the tests you should have written. Every unhandled
exception in production is a scenario your suite didn't cover, ranked by how many real users hit it.
That's a better test-prioritisation signal than any risk workshop, because it's measured rather than
guessed.
The second use is release verification with teeth. "Did the fix work" usually gets answered by
re-running the test that was written from the same wrong assumption as the bug. Sentry answers it
properly: is the error rate for that issue zero since the release, across all users, or did it just
stop happening in your particular reproduction?
| Group | Representative tools | QA use |
| Issues | find issues, get issue details, list events | What's breaking, how often, since when |
| Detail | stack traces, breadcrumbs, tags, user context | Breadcrumbs are the reproduction steps, already written for you |
| Releases | release health, adoption, new issues per release | Did the fix actually land in the wild? |
| Search | project/org search across issues and events | Pattern-finding across services |
| Seer | AI root-cause analysis on an issue | A starting hypothesis, not a conclusion |
Wire it up
shell — hosted remote server
claude mcp add --transport http sentry https://mcp.sentry.dev/mcp
mcp config
{
"mcpServers": {
"sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
}
}
}
OAuth on first use. Self-hosted Sentry needs the corresponding self-hosted endpoint. Scope the
granted org and projects to what QA actually needs.
This one reads production data
Stack traces, breadcrumbs, and user context can contain real user identifiers, emails, and request
payloads. Pulling those into a model's context is a data-handling decision, not just a technical one —
check it against your organisation's policy before connecting, and prefer aggregate questions
("how many users", "which release") over dumps of individual events.
Workflows
1 · Production errors → regression backlog
List the top 15 unresolved issues in the web project by user count over the last 30
days. For each: the user-facing symptom, whether it's a regression from a specific release, and a test
case that would have caught it. Rank by users affected × how testable it is.
That ranking is the whole point — it produces a prioritised backlog rather than a list.
2 · Release verification
We shipped 4.2.0 four hours ago. Compare error rate, crash-free session rate, and new
issue count against 4.1.3 at the same adoption level. Any new issue types unique to 4.2.0?
"At the same adoption level" prevents the classic false negative — a new release with 5% adoption
always looks better than a mature one.
3 · Breadcrumbs → reproduction
Get the full detail for issue WEB-4F2A including breadcrumbs, tags and
affected user agents. Turn the breadcrumb trail into concrete reproduction steps I can run against
staging with Playwright.
4 · Coverage blind spots
Group the last 90 days of issues by the code area in the stack trace. Which areas
generate the most production errors, and how does that ranking compare to where our test coverage is
concentrated?
The gap between "where errors happen" and "where tests are" is usually uncomfortable, and it is the
most useful chart you can take to a planning meeting.
Gotchas
- Sampling distorts counts. Sentry may sample high-volume events. Treat absolute
numbers as relative signals.
- Error volume ≠ user impact. A noisy handled exception can outrank a rare
checkout-blocking crash. Sort by users affected and business path, not by count.
- Seer is a hypothesis generator. Its root-cause suggestions are a starting point.
Verify against the code before filing.
- Resolving issues is a real write. If the server exposes issue mutation, treat it as
production state — because it is.
Verdict
The best available answer to "what should we test next", grounded in what's actually failing rather
than what anyone thinks might. Add it once the core stack is stable, and mind the PII.
The triage chain
These three plus Jira compose into the workflow that saves the most hours per week. One prompt,
four servers, a triaged failure:
- GitHub — get the failed workflow run, pull the failing job's logs, list commits
since the last green run.
- Filesystem — read the JUnit XML and the Playwright trace for the specific assertion
and the surrounding network activity.
- Sentry — check whether the same error signature is occurring in staging or
production. If it is, this is a real defect, not a test problem — and the priority just went up.
- Jira / Xray — draft the defect with the diff, the assertion, the trace path, and
the Sentry issue link. Show the draft; create on approval.
The nightly e2e run failed. Triage it: pull the CI logs and the failing assertion,
read the trace in artifacts/, list commits since the last green run and name the likely
culprit with the diff lines that support it, check Sentry for the same error signature in staging, and
draft a Jira bug with all of it. Don't create the ticket yet.
Why this is the winning combination
It's not that the agent does anything a good engineer couldn't. It's that a good engineer doing this
manually switches context seven times and loses fifteen minutes to it — so in practice they skip steps,
and the ticket that reaches the developer is thinner than it should be. The agent's advantage is that
it never gets bored of step four.