DiffCI
Provides an observer GitHub Action and a workflow-verification MCP tool for GitHub Actions, reporting affected tests in pull request job summaries and checking that DiffCI CI jobs cannot affect other CI jobs.
Provides a GitLab CI/CD component for the change-impact observer workflow, showing which tests a change affects or why the full suite is required.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
DiffCI Core
Affected checks before push, for AI coding agents. DiffCI tells Claude Code, Codex, Cursor (or you) which tests and checks a change affects, so they run before the push instead of failing at the full CI gate afterwards. MIT licensed, runs locally, sends nothing by default, and falls back to the full suite whenever the evidence is incomplete.
npx "@diffci.com/diffci@latest" checkRun it in any Git checkout with Node.js 22.5+. What the output means.
On every pull request, add one job beside your existing CI. Its job summary shows which tests the change affects and why, or that the full suite is needed and why. It runs no tests and skips or changes nothing:
- uses: actions/checkout@v7
with:
fetch-depth: 0 # DiffCI needs the base commit
- uses: DiffCI/core@v0.3.35Full workflow · GitLab CI/CD component

Why
Coding agents pass the narrow check they picked and miss wider breakage, then rerun the whole suite when they are unsure. We measured this on our own agent-built production app (about 1,100 commits in two months, most of them co-authored by Claude):
104 pushes failed the full gates after push. Each passed whatever the agent ran locally.
Agents chose their own test files 928 times and ran the full suite 282 times, but asked a tool which tests were affected only 24 times.
When DiffCI could narrow the run, it selected 2.2% of test files, cutting test time by 93%. None of those commits had a failing test, so this shows speed, not regression catching.
DiffCI still fell back to the full suite on 58% of commits, mostly because a config file or
package.jsonchanged. Narrowing those safely is the main open problem, and a good place to contribute.
Related MCP server: diff-explainer
MCP server
This repository contains DiffCI's MCP server. It is implemented in
packages/diffci-cli/src/client/mcp.ts
and published as the diffci-mcp binary of @diffci.com/diffci: a local
stdio server speaking JSON-RPC 2.0 (initialize, tools/list, tools/call)
that runs against the checkout it is pointed at. It needs no account and sends
nothing by default.
npx -y -p @diffci.com/diffci@latest diffci-mcp{
"mcpServers": {
"diffci": { "command": "npx", "args": ["-y", "-p", "@diffci.com/diffci@latest", "diffci-mcp"] }
}
}Tool | What it does |
| Lists staged, unstaged and untracked changes; runs no tests |
| Returns the affected-test plan for the current changes, with fallback reasons; runs no tests |
| The same plan, for explaining why each test is in it |
| Verifies the current snapshot with the affected tests, or the full suite as a fallback |
| Verifies the exact working-tree snapshot; fails closed |
| Verifies a clean commit range and returns a receipt bound to HEAD |
| Compares full and selected test runs and reports paired runtime |
| Seeds agent instructions, MCP configs, the verify skill and a pre-push hook |
| Checks that a DiffCI GitHub Actions job cannot affect the rest of CI |
Use it from your coding agent
The public integrations/agent-plugin package
packages the MCP server above as a checkout-aware local plugin for agent
marketplaces: marketplace metadata, skills, and a launcher pinned to the
published diffci-mcp binary. It does not include product services or private
source. The
cross-agent installation guide covers Codex,
Claude Code, Cursor, Grok, Meta Muse Code, and generic MCP hosts.
# Codex
codex plugin marketplace add DiffCI/core
codex plugin add diffci@diffci-local
# Claude Code
claude plugin marketplace add DiffCI/core
claude plugin install diffci@diffci-marketplaceCursor Marketplace reads .cursor-plugin/marketplace.json
from this repository. Meta Muse Code reads the native root
marketplace.json. Before a public listing is approved,
use the local MCP configuration in the agent-plugin package or visit
https://diffci.com/mcp-server.
Installing the plugin does not make an agent use it. Paste the
short agent-instructions snippet
into CLAUDE.md or AGENTS.md so it runs DiffCI before pushing.
GitHub Action
The public action.yml ("DiffCI change impact") shows, in the
job summary of every pull request, which tests the change affects and why, or
that the full suite is needed and why. It is observation only: it runs the
pinned published DiffCI CLI outside the observed checkout, retains existing CI
jobs, skips nothing, and uploads the report as an artifact. See the
observer Action guide and
workflow example.
Set comment: "true" (with pull-requests: write) to also keep one comment on
the pull request up to date with the answer, where reviewers see it. Outputs
such as full-suite-required and affected-tests let a workflow act on the
answer; see outputs.
The v0.3.10 corresponding source
remains publicly available at tagged Core commit 4c76be14 (cli-v0.3.10-source)
while distribution migrates to the Core-native CLI package.
diffci check compares full and selected runtime when safe to measure, writes reports outside the checkout, and sends nothing by default. Test commands can generate files; keep required CI authoritative.
Measured example: one controlled Cal.com sandbox replay measured 44.2% net reduction in install + pretest + test runtime including analysis overhead. This is a job-equivalent comparison, not production savings or a forecast for your repository. Method and limitations.
Star Core · Volunteer a pilot repository · Find a first contribution. Watch → Custom → Releases and Discussions for benchmark results and support updates. Public roadmap.
This is the standalone Core engine. It analyzes local JavaScript/TypeScript repositories, supported Vue components, root Go modules, conventional Maven reactors and Python projects tested with pytest, traces dependency impact, infers GitHub Actions structure and proposes test selections with evidence and full-run fallbacks. It works without a DiffCI account, hosted service or API key. See the release boundary for support limits.
Want to try DiffCI in an existing repository? Use the published CLI: npx @diffci.com/diffci@latest check. See the CLI quickstart for a no-execution analysis option, prerequisites, and result interpretation. The commands below build the standalone engine from source.
Run locally
Requires Git and Node.js 22.5 or later.
git clone https://github.com/DiffCI/core.git
cd core
npm ci
npm run build
npm test
node dist/cli.js plan --repo /path/to/clean-checkout --base HEAD~1 --head HEADThe target must be a clean Git repository root checked out at --head. Fetch the base commit beforehand if using a shallow clone. JSON goes to stdout; analysis errors exit nonzero and recommend full CI. Core does not execute repository scripts, contact a DiffCI backend or send telemetry. Installation requires the npm registry.
To evaluate the same command on pull requests without changing required jobs, copy the advisory GitHub Actions example.
Plans are advisory. This release does not execute, skip or cancel CI jobs. SKIP_CANDIDATE is a candidate, not permission to bypass a check. Keep full CI authoritative while evaluating Core. Missing command synthesis, unsupported configuration and incomplete evidence must not be treated as an empty test suite. Static analysis is not proof that a test can safely be omitted.
For Maven jobs whose CI runs a lifecycle goal or profiles other than test, declare them in diffci.json (or the diffci key in package.json):
{ "maven": { "goal": "verify", "profiles": ["run-its"] } }This changes the proposed command, such as mvn -pl tools -am verify -P run-its; Core still does not run it. Confirm the command against the repository's CI workflow before using it for execution.
What is included
Declared pnpm workspaces with a single Vitest test phase can receive package-local command plans. Each selected path must belong to a discovered test in a declared package. Runtime selections are batched to keep commands below Windows limits; packages declaring --typecheck retain a separate full type-test phase. Packages with compound scripts, lifecycle hooks, overlapping ownership or discovery blind spots refuse selective execution. Commands remain advisory and must be executed separately; CLI automatic timing of multiple commands requires additional integration.
Area | Implementation |
Changes and dependencies | Git deltas, repository inventory, JS/TS dependency graph, impact traversal |
Safety and planning | Risk signals, conservative fallback, always-run policy, test selection and command synthesis |
CI analysis | GitHub Actions evidence, job/reference graphs, conditions and matrix inference |
Reproducible evaluation | Synthetic benchmark and portable regression tests |
Measurement | Current-process wall time, CPU time and ending RSS; explicit-input cost/energy/carbon estimates |
The library entry point exports analyzeCheckout, buildDependencyGraph, ImpactAnalyzer, DefaultCIPlanner, collectEvidence, inferPipeline, measure and estimateImpact. Lower-level modules are available as package subpaths. This repository is the engine source, and the published @diffci.com/diffci CLI is released from it. The corresponding source for the previously published v0.3.10 package is retained in the source archive at tagged commit 4c76be14.
npm run typecheck
npm run audit:boundary
npm run benchmarkThe benchmark constructs one temporary synthetic repository containing 100 chained modules and 100 importing test files. In one Node.js process it builds that same dependency graph three times, sequentially, and removes the fixture afterward. Install dependencies first with npm ci, then run npm run benchmark under Node.js 22.5 or later. Record the emitted node and platform alongside the machine CPU, memory, operating system, and competing workload when comparing runs. The three builds share process, operating-system, and compiler warmup effects; they are not independent repetitions with controlled cold caches.
Each entry in runs has these fields:
Field | Interpretation |
| The process counters were observed rather than estimated. |
| Only the benchmark's Node.js process is covered, not the whole host, container, or CI job. |
| Elapsed wall-clock time around one |
| User plus system CPU time consumed by the current process during that call; it can differ from wall time. |
| Resident-set size sampled after the call. It is neither peak memory nor the memory allocated by that call alone. |
| Graph size. The current fixture should produce 200 nodes and 199 dependency edges. |
| Dependency-graph confidence for this synthetic fixture. |
For example, wallSeconds: 0.79, cpuSeconds: 0.84, and rssBytesAtEnd: 327868416 mean that one graph build elapsed for about 0.79 seconds, consumed about 0.84 current-process CPU seconds, and ended with roughly 328 MB RSS. They do not mean that CI became 0.79 seconds faster or saved 328 MB. The script does not execute tests, installation, builds, or a full-versus-selected comparison, so its timings must not be reported as CI savings.
The separate estimateImpact API can calculate estimatedUsd, estimatedKwh, and estimatedKgCo2e only from caller-supplied computeSeconds, price, power, and grid-intensity assumptions. Those values have basis: "estimated"; they are modeled scenarios, not benchmark output, physical measurements, billing records, or verified avoided emissions.
Sponsors
DiffCI Core is supported by its GitHub Sponsors. Sponsorship funds maintenance, broader language and CI support, and reproducible benchmarks.
Partners
No Partner sponsors yet. Become the first.
Team Sponsors
No Team Sponsors yet. Team Sponsor logos also appear on diffci.com/sponsors.
Backers
No Backers yet. Backers at $25/month or above are listed here.
Sponsors' bug reports are labelled sponsor and triaged first.
Core and Cloud
Component | Availability | License |
This Core repository | Public source | MIT |
DiffCI Cloud: hosting, billing, organization management, dashboard, managed services | Private source | Proprietary; not included here |
Optional enterprise modules | Not released here | A separate source-available license would apply if offered |
Only the explicitly extracted Core files and standalone tooling are in this repository. There is no private monorepo history, customer data, deployment configuration or Cloud implementation here. Core is usable independently; it is not a promise that the private product has already migrated to consume this package.
DiffCI Cloud's team features are free for public open-source repositories: an organization whose connected repositories are all public on GitHub gets them at no cost.
What stays in Core, and never moves to Cloud, is set out in STEWARDSHIP.md. The plan DiffCI writes for each change is an open format other tools can produce or consume: the change plan. Report vulnerabilities privately as described in SECURITY.md.
Contributing
Most open work is teaching DiffCI to narrow changes it currently treats as "run everything": config files, package.json edits and lockfiles. Each case is small and comes with a synthetic fixture, so you don't need to learn the whole engine. Python and Rust support are next and split into one-PR steps: see the Python and Rust tracking issues. Pick a good first issue and see CONTRIBUTING.md; a dev container is included.
Contributors
Thank you to everyone who has improved DiffCI:
Emmanuel Mawulolo Tagbor:
diffci check-planfor comparing a saved plan with full-suite JUnit results (#74), Yarn Classic lockfile narrowing (#63), and follow-ups (#67, #70).@FredApps: five safety fixes for runtime module dependencies, Maven module resources, runner suites, deleted assets and Go runtime inputs (#32–#36).
@bfs2021:
bun.lockandnpm-shrinkwrap.jsonrecognition in the lockfile signal (#64).Varshith Sai Pasupuleti: tests for transitive Vue selection and full fallback (#16).
Every merged contribution is credited in the release notes, here, and next to the feature in the docs.
License
See LICENSE, NOTICE and CONTRIBUTING.md. Releases before the MIT switch were published under AGPL-3.0-only and are now also available under MIT; see LICENSE-HISTORY.md. Grant eligibility depends on the particular grant agreement. No eligibility or legal separation is guaranteed by this repository layout.
See the release boundary for scope and current limitations.
Useful? Star the engine and share a reproducible pilot result.
Available Tools
9 toolsdiffci_changed_filesARead-onlyInspect
List staged, unstaged and non-ignored untracked changed paths relative to HEAD, with a snapshot identity. Builds no dependency graph and runs no tests.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Absolute repository path; defaults to server working directory. Always pass the edited repository when using a plugin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is established. The description usefully adds scope details beyond that (relative to HEAD, includes non-ignored untracked files, snapshot identity, no graph build, no tests), but says nothing about the shape of the returned data or how snapshot identity is used.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The scope statement is front-loaded and the exclusion clause follows immediately as supporting contrast.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no output schema, the definition covers what is enumerated and confirms the absence of side effects. It stops short of telling the agent what the return value looks like (path list format, snapshot identity field), which would be the remaining useful detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, including precise guidance about passing the edited repository when using a plugin. The prose adds nothing about the repo argument, so the schema carries the full burden and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('List') with a precisely scoped resource ('staged, unstaged and non-ignored untracked changed paths relative to HEAD') and adds a snapshot identity. The closing clause ('Builds no dependency graph and runs no tests') implicitly separates it from siblings like diffci_check and diffci_select_tests, so an agent can pick it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when this is the right tool: the agent needs changed paths only, not a graph or a test run. The explicit exclusions act as when-not guidance, but no sibling is named as the alternative for those other needs, so routing between diffci_check and diffci_select_tests is still left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_checkBInspect
Analyze the repository, run inferred full and selected test commands when available, and report paired runtime. No report is uploaded. Optional aggregate telemetry follows the user's saved consent; DIFFCI_NO_SEND=1 overrides it.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Optional base commit SHA. | |
| head | No | Optional head commit SHA. | |
| json | No | Print the full JSON observation report. | |
| repo | No | Repository path. Defaults to the MCP server working directory. | |
| quiet | No | Suppress the human summary. | |
| redactPaths | No | Replace paths with stable digests in the report. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden, and it does disclose meaningful behavior: no report is uploaded, telemetry is aggregate and consent-gated, and DIFFCI_NO_SEND=1 overrides it. It is silent on the operational side effects of executing test commands (working-tree writes, runtime cost, failure handling), which matters for a tool that runs commands.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences that front-load the action and follow with privacy constraints; nothing is padded. The privacy sentences are dense but each carries distinct information (no upload, consent-gated telemetry, env override).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter tool with no annotations and no output schema, the description covers purpose and privacy but omits what the 'paired runtime' report contains and how command execution failures surface. The agent has enough to call it, but not enough to predict its output or side effects confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (base, head, json, quiet, redactPaths, repo) are already documented in the schema. The description adds no additional meaning about defaults or interactions between them, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb chain (analyze repo, run inferred full and selected test commands, report paired runtime), which is specific enough for an agent to know what it produces. It does not, however, distinguish itself from siblings like diffci_run_affected_tests or diffci_verify, which plausibly also run tests.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no mention of the sibling tools it competes with. 'When available' hints at a fallback behavior for test command inference, but nothing tells the agent why to pick this over diffci_run_affected_tests or diffci_verify.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_explain_selectionARead-onlyInspect
Inspect current staged, unstaged and non-ignored untracked changes and return a snapshot-bound affected-test plan and fallback reasons. Runs no tests; a plan is not a passing receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Absolute repository path; defaults to server working directory. Always pass the edited repository when using a plugin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds useful behavioral context beyond that: it inspects staged, unstaged, and non-ignored untracked changes, returns a snapshot-bound plan and fallback reasons, runs no tests, and clarifies that a plan is not a passing receipt. It does not describe how the plan is computed or how fallback reasons are generated, so it stops short of a full behavioral account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences with no wasted wording. The core scope is front-loaded, and the second sentence adds an important boundary condition without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, single-optional-parameter, read-only tool with no output schema, the description covers what is inspected, what is returned, and the key limitation that no tests are run. It is nearly complete, though the exact shape of the affected-test plan and fallback reasons remains somewhat open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the sole optional repo parameter is fully documented in the schema. The description adds no additional meaning about the repo parameter, so the schema does the heavy lifting and the baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: inspect staged, unstaged, and non-ignored untracked changes and return an affected-test plan with fallback reasons. It distinguishes itself from test-running siblings by saying it runs no tests, though it does not explicitly name nearby tools like diffci_select_tests or diffci_changed_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this to obtain an affected-test plan and fallback reasons without executing tests. However, the description does not explicitly say when to choose it over diffci_select_tests, diffci_changed_files, or diffci_check, nor does it state exclusions beyond 'runs no tests'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_initBInspect
Seed a repository with DiffCI agent instruction files, MCP server configs, the diffci-verify skill and the pre-push hook.
| Name | Required | Description | Default |
|---|---|---|---|
| mcp | No | Register the DiffCI MCP server in .mcp.json and .cursor/mcp.json (default true). | |
| hook | No | Install the Git pre-push hook that verifies the commits being pushed (default true). | |
| repo | No | Repository path. Defaults to the MCP server working directory. | |
| force | No | Overwrite existing instruction files. | |
| skill | No | Add the diffci-verify skill to .claude/skills (default true). | |
| workflow | No | Also add the non-blocking GitHub Actions observer workflow. | |
| verificationWorkflow | No | Also add the blocking GitHub Actions verification workflow. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the concrete artifacts written, which signals a mutating scaffolding operation. However, it says nothing about idempotency, what happens to pre-existing files on re-run (that semantics lives only in the 'force' schema field), whether it touches Git state, or what it returns on success/partial failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the action verb, enumerating only the artifacts created. No filler, no restatement of the tool name, nothing that could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a seven-parameter mutating tool with zero annotation coverage and no output schema, the description covers only what is produced, not prerequisites, re-run safety, or observable results. It is adequate to understand the tool's intent but leaves enough behavioral gaps that an agent could misuse it in an already-initialized repo.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven flags are already documented with defaults and target paths in the schema. The description adds no mapping between its enumerated artifacts and the corresponding switches (mcp, hook, skill, workflow, verificationWorkflow), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Seed') and an enumerated resource set: agent instruction files, MCP server configs, the diffci-verify skill, and the pre-push hook. This clearly separates it from all siblings, which are verify/check/select/run tools. It falls short of a 5 only because it never states the scope framing ('first-time setup of a repo') that would make the distinction explicit rather than inferred.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Seed a repository' hints at initialization, but there is no explicit when-to-use statement, no prerequisite (e.g. must be a Git repo), no guidance on re-running in an already-seeded repo, and no reference to the diffci_verify/diffci_check siblings it presumably precedes. An agent must infer the entire usage context from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_run_affected_testsCInspect
Reanalyze and verify the current working-tree snapshot with affected tests or conservative full fallback. Required CI remains authoritative.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Absolute repository path; defaults to server working directory. Always pass the edited repository when using a plugin. | |
| timeoutMs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=false, so the agent already knows this is a non-read-only, closed-world operation, and the description is consistent with that. Beyond the annotations, the description usefully discloses the result-authority caveat versus CI and the possibility of an expensive conservative full-suite fallback. It does not say what state is written, how long a full run may take, or how the timeout interacts with that fallback.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and the fallback behavior, with no filler. The main clause is slightly dense and could be split, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain what a run produces, yet it never says whether the result is a pass/fail, a selected-test list, or a report path. For a tool that may execute a full test suite, the omission of return shape and cost/blocking characteristics leaves an agent unable to predict the outcome of invoking it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Two parameters with only 50% schema description coverage: repo is documented in the schema, but timeoutMs has no description anywhere. The tool description adds nothing about either parameter, not even that timeoutMs bounds the potentially long fallback run, so it does not compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and target: reanalyze and verify the current working-tree snapshot using affected tests, with a full-suite fallback. That is concrete enough for an agent to know what the tool does, but it draws no line between itself and near-identical siblings such as diffci_verify_changed, diffci_verify, or diffci_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only usage signal is the trailing clause that required CI remains authoritative, which hints this is a local pre-flight rather than a replacement for CI. There is no explicit when-to-use, no when-not-to-use, and no mention of any of the nine sibling tools despite obvious overlap with the other diffci_verify_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_select_testsARead-onlyInspect
Inspect current staged, unstaged and non-ignored untracked changes and return a snapshot-bound affected-test plan and fallback reasons. Runs no tests; a plan is not a passing receipt.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Absolute repository path; defaults to server working directory. Always pass the edited repository when using a plugin. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the plan is snapshot-bound, it includes fallback reasons, and crucially the output is advisory rather than a passing result. It does not describe failure modes or what triggers fallback reasons.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences with zero filler; the positive capability is front-loaded and the critical caveat follows immediately. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one optional parameter, no output schema, and read-only annotations, the description covers the essentials and explicitly characterizes the return value. Minor gaps remain around how the plan is scoped (affected tests relative to what baseline) and behavior on a clean working tree.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single repo parameter is already documented in the schema, including its default. The description adds no additional meaning about how repo affects the diff scope, so the schema is doing the heavy lifting and the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Inspect") against a specific resource (staged, unstaged, and non-ignored untracked changes) and names the concrete return artifact: a snapshot-bound affected-test plan plus fallback reasons. It is clearly differentiable from the sibling diffci_run_affected_tests via "Runs no tests," though it never names that sibling outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Runs no tests; a plan is not a passing receipt" gives a clear when-not boundary, steering the agent toward a run/verify tool when actual test execution is required. It stops short of explicitly naming the alternative tool or stating preconditions (e.g., behavior when there are no changes), so it is not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_verifyAInspect
Verify a clean commit range and return a receipt bound to the checked-out head commit. Resolves the CI event range automatically when base and head are omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| base | No | Optional base commit SHA. Must be paired with head. | |
| head | No | Optional head commit SHA. Must be paired with base and match checked-out HEAD. | |
| repo | No | Repository path. Defaults to the MCP server working directory. | |
| timeoutMs | No | Maximum verification-command runtime in milliseconds. | |
| redactPaths | No | Replace paths with stable digests in analysis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It discloses two real behaviors: the result is a receipt tied to the checked-out HEAD, and the range is auto-derived from CI context when base/head are absent. It omits whether verification commands are executed (implied only by timeoutMs), what a failed verification means, and whether any state is written, which matters for a tool with a timeout and command-runtime implication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the outcome and the default-range behavior front-loaded. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Placeholder.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including the base/head pairing constraint. The description adds only the omitted-parameter behavior (automatic CI range resolution); it says nothing extra about timeoutMs semantics or redactPaths effects beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Verify') and resource ('a clean commit range') plus the artifact returned ('a receipt bound to the checked-out head commit'). It does not differentiate itself from near-name siblings like diffci_verify_changed or diffci_verify_workflow, so an agent cannot tell from the description alone which verify variant applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence gives one useful usage rule: omit base and head to auto-resolve the CI event range. There is no guidance on when to pick this over diffci_verify_changed, diffci_check, or diffci_verify_workflow, which is the main ambiguity an agent faces given the sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_verify_changedBInspect
Verify the current staged, unstaged, and non-ignored untracked changes. Fails closed unless the exact working-tree snapshot passes selected or full fallback verification.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Repository path. Defaults to the MCP server working directory. | |
| timeoutMs | No | Maximum verification-command runtime in milliseconds. | |
| redactPaths | No | Replace paths with stable digests in analysis. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden. It does disclose a fail-closed policy and that the snapshot must match exactly, which is genuinely useful. However, it never says that this executes verification commands, what those commands are derived from, what permissions or repo state are required, or how failure is surfaced — all critical for a tool whose timeoutMs parameter reveals it runs arbitrary-length processes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the scope stated first and the fail-closed guarantee second; nothing is redundant. Some phrasing ('exact working-tree snapshot', 'selected or full fallback verification') is dense jargon that would benefit from one clarifying clause, but the size is appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description is the only source of behavior. It omits what a verification result looks like (pass/fail, per-test detail, diagnostics), what 'selected vs fallback' means operationally, and whether it mutates the working tree. For a fail-closed verification gate, these omissions leave real gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so repo, timeoutMs, and redactPaths are already documented in the schema. The description adds no parameter-level meaning beyond implying working-tree scoping. Baseline 3 applies since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Verify') and a precise resource scope: staged, unstaged, and non-ignored untracked changes. That scope implicitly separates it from siblings like diffci_changed_files or diffci_verify, but the description never names an alternative, so an agent must infer the distinction from sibling names alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'working-tree snapshot' framing implies this is the tool for pre-commit / uncommitted-change verification rather than committed-diff verification, but there is no explicit when-to-use or when-not-to-use guidance relative to diffci_verify, diffci_check, or diffci_verify_workflow. The mention of 'selected or full fallback verification' hints at selection behavior without telling the agent how to control it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffci_verify_workflowCInspect
Check that a DiffCI GitHub Actions job cannot affect the rest of CI.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Repository path. Defaults to the MCP server working directory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It implies a read-only check but never says whether it mutates state, what a failing verification means, whether it exits with an error or returns a result, or what the agent should do with a negative outcome.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though its brevity is part of why coverage is thin elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a verification tool with no output schema and no annotations, the description should at minimum explain what a pass/fail looks like and what is examined. As written, an agent cannot tell what the tool returns or what 'cannot affect the rest of CI' concretely checks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'repo' parameter has a full schema description including its default, so the schema does the work here. The description adds no meaning beyond it (e.g., whether the repo must contain DiffCI config or a workflow file).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a verb ('Check') and a resource ('a DiffCI GitHub Actions job'), plus a goal ('cannot affect the rest of CI'), so the general intent is inferable. However, 'cannot affect the rest of CI' is ambiguous — it never states what is actually being validated (workflow isolation, path filtering, permissions) and gives no clue how it differs from the closely named siblings diffci_verify and diffci_verify_changed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus diffci_verify, diffci_verify_changed, or diffci_check, and no stated preconditions. The agent must guess based on name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.3.35- First observed
diffci_changed_files - First observed
diffci_check - First observed
diffci_explain_selection - First observed
diffci_init - First observed
diffci_run_affected_tests - First observed
diffci_select_tests - First observed
diffci_verify - First observed
diffci_verify_changed - First observed
diffci_verify_workflow
TDQS
Scored across 9 tools
diffci_select_tests and diffci_explain_selection have essentially identical descriptions (both return a snapshot-bound affected-test plan with fallback reasons and run no tests), giving an agent no basis to choose between them. Additionally, diffci_check, diffci_run_affected_tests and diffci_verify_changed all operate on the working tree with subtly different semantics (paired runtime vs. snapshot verification vs. fail-closed receipt) that are easy to conflate.
All names use a consistent diffci_ prefix and snake_case, so the surface reads predictably. Minor deviations exist: diffci_changed_files is a noun phrase rather than a verb, and the same selection behavior is named with two unrelated verbs (select_tests vs. explain_selection), but the overall form is uniform.
Nine tools is comfortably within a well-scoped range for a diff-based test-selection and verification server. The count would be ideal if the duplicated selection tool were merged, but nothing feels bloated.
The lifecycle is well covered: change discovery, plan/selection, affected-test execution, commit-range verification, working-tree verification, CI workflow validation and repo seeding. Minor gaps exist around configuring or inspecting the test-mapping/coverage model and uninstall/reset operations, but core agent workflows have no dead ends.
Maintenance
Related MCP Connectors
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceLocal MCP server providing project cognition capabilities for AI coding agents, including context packs, impact analysis, and git diff review through stdio communication.103MIT
- AlicenseNot gradedqualityDmaintenanceAI-powered git diff analysis with human-readable explanations, risk flags, and review checklists. Enables to explain any diff text or currently staged git changes through an MCP server.MIT
- AlicenseNot gradedqualityBmaintenanceLocal-first code intelligence and safety layer for AI coding agents. MCP server exposes dependency graph, impact analysis, and AST-compressed repo context, backed by typed local memory, patch-scope safety gates, and git-independent transaction rollback.1MIT
- AlicenseNot gradedqualityDmaintenanceZero-dependency stdio MCP server for token-aware prompt version diffs. Compare prompts or files and get machine-readable token delta reports with confidence labels.MIT