loading…
Search for a command to run...
loading…
Connects AI coding assistants to Gaffer test history and coverage data to analyze project health, debug failures, and identify untested code areas. It enables t
Connects AI coding assistants to Gaffer test history and coverage data to analyze project health, debug failures, and identify untested code areas. It enables tools to track test stability, cluster failures by root cause, and monitor code coverage trends across projects.
MCP (Model Context Protocol) server for Gaffer - give your AI assistant memory of your tests.
This MCP server connects AI coding assistants like Claude Code and Cursor to your Gaffer test history and coverage data. It allows AI to:
The easiest way to add the Gaffer MCP server is via the Claude Code CLI:
claude mcp add gaffer -e GAFFER_API_KEY=gaf_your_api_key_here -- npx -y @gaffer-sh/mcp
Alternatively, add to your Claude Code settings (~/.claude.json or project .claude/settings.json):
{
"mcpServers": {
"gaffer": {
"command": "npx",
"args": ["-y", "@gaffer-sh/mcp"],
"env": {
"GAFFER_API_KEY": "gaf_your_api_key_here"
}
}
}
}
Add to .cursor/mcp.json in your project:
{
"mcpServers": {
"gaffer": {
"command": "npx",
"args": ["-y", "@gaffer-sh/mcp"],
"env": {
"GAFFER_API_KEY": "gaf_your_api_key_here"
}
}
}
}
| Tool | Description |
|---|---|
list_projects |
List all projects you have access to |
get_project_health |
Get health metrics (pass rate, flaky count, trends) |
list_test_runs |
List recent test runs with optional filtering |
get_test_run_details |
Get parsed test results for a specific test run |
get_report |
Get report file URLs for a test run |
get_report_browser_url |
Get a browser-navigable URL for viewing reports |
| Tool | Description |
|---|---|
get_test_history |
Get pass/fail history for a specific test |
get_flaky_tests |
Get tests with high flip rates (pass↔fail) |
get_slowest_tests |
Get slowest tests by P95 duration |
compare_test_metrics |
Compare test performance between commits |
get_failure_clusters |
Group failed tests by root cause (error similarity) |
| Tool | Description |
|---|---|
get_upload_status |
Check if CI results are uploaded and processed |
| Tool | Description |
|---|---|
get_coverage_summary |
Get overall coverage metrics and trends |
get_coverage_for_file |
Get coverage for specific files or paths |
get_untested_files |
Get files below a coverage threshold |
find_uncovered_failure_areas |
Find files with low coverage AND test failures |
list_projectsList all projects you have access to.
organizationId (optional), limit (optional, default: 50)get_project_healthGet the health metrics for a project.
projectId (required), days (optional, default: 30)get_test_historyGet the pass/fail history for a specific test.
projectId (required), testName or filePath (one required), limit (optional)get_flaky_testsGet the list of flaky tests in a project.
projectId (required), threshold (optional, default: 0.1), days (optional), limit (optional)list_test_runsList recent test runs with optional filtering.
projectId (required), commitSha (optional), branch (optional), status (optional), limit (optional)get_test_run_detailsGet parsed test results for a specific test run.
testRunId (required), projectId (required), status (optional filter), limit (optional)get_reportGet URLs for report files uploaded with a test run.
testRunId (required)get_report_browser_urlGet a browser-navigable URL for viewing a test report.
projectId (required), testRunId (required), filename (optional)get_slowest_testsGet the slowest tests in a project, sorted by P95 duration.
projectId (required), days (optional), limit (optional), framework (optional), branch (optional)compare_test_metricsCompare test metrics between two commits or test runs.
projectId (required), testName (required), beforeCommit/afterCommit OR beforeRunId/afterRunIdget_coverage_summaryGet the coverage metrics summary for a project.
projectId (required), days (optional, default: 30)get_coverage_for_fileGet coverage metrics for specific files or paths.
projectId (required), filePath (required - exact or partial match)get_untested_filesGet files with little or no test coverage.
projectId (required), maxCoverage (optional, default: 10%), limit (optional)find_uncovered_failure_areasFind code areas with both low coverage AND test failures (high risk).
projectId (required), days (optional), coverageThreshold (optional, default: 80%)get_failure_clustersGroup failed tests by root cause using error message similarity.
projectId (required), testRunId (required)get_upload_statusCheck if CI results have been uploaded and processed.
projectId (required), sessionId (optional), commitSha (optional), branch (optional)These workflows show how an AI agent can use Gaffer tools to diagnose CI failures, wait for results, and find coverage gaps.
list_test_runs(projectId, status="failed")
→ get_test_run_details(projectId, testRunId, status="failed")
→ get_failure_clusters(projectId, testRunId)
→ get_test_history(projectId, testName="...")
→ compare_test_metrics(projectId, testName, beforeCommit, afterCommit)
get_upload_status(projectId, commitSha="abc123")
→ poll until processingStatus="completed"
→ get_test_run_details(projectId, testRunId)
find_uncovered_failure_areas(projectId)
→ get_untested_files(projectId)
→ get_coverage_for_file(projectId, filePath="src/critical/")
| Agent Question | Tool |
|---|---|
| "What failed?" | get_test_run_details |
| "Same root cause?" | get_failure_clusters |
| "Is it flaky?" | get_flaky_tests |
| "Is this new?" | get_test_history |
| "Did my fix work?" | compare_test_metrics |
| "Are results ready?" | get_upload_status |
| "What's untested?" | find_uncovered_failure_areas |
| "What's slow?" | get_slowest_tests |
When using coverage tools to improve your test suite, combine coverage data with codebase exploration for best results:
Before targeting files purely by coverage percentage, explore which code is actually critical:
Low coverage alone doesn't indicate priority. Consider:
find_uncovered_failure_areas for thisThe get_untested_files tool may return many frontend components. For backend or specific areas:
# Query specific paths with get_coverage_for_file
get_coverage_for_file(filePath="server/services")
get_coverage_for_file(filePath="src/api")
get_coverage_for_file(filePath="lib/core")
get_coverage_summaryget_coverage_for_file on critical pathsUser API Keys (gaf_ prefix) provide read-only access to all projects across your organizations. Get your API Key from: Account Settings > API Keys
Project Upload Tokens (gfr_ prefix) are designed for uploading test results and only provide access to a single project. User API Keys are preferred for the MCP server.
| Variable | Required | Description |
|---|---|---|
GAFFER_API_KEY |
Yes | Your Gaffer API Key (starts with gaf_) |
GAFFER_API_URL |
No | API base URL (default: https://app.gaffer.sh) |
pnpm install
pnpm build
Test locally with Claude Code (use absolute path to built file):
{
"mcpServers": {
"gaffer": {
"command": "node",
"args": ["/absolute/path/to/dist/index.js"],
"env": {
"GAFFER_API_KEY": "gaf_..."
}
}
}
}
MIT
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"gaffer-mcp-server": {
"command": "npx",
"args": []
}
}
}