Repository navigation
Description
Problem
The everything MCP interface diff (.github/workflows/everything-mcp-diff.yml, scripts/interface-diff.mjs, #4860) runs, and posts its sticky "everything: MCP interface diff" comment, on PRs that do not touch the everything server at all.
The workflow already has a paths filter, but besides src/everything/** it lists the root package.json, package-lock.json and tsconfig.json. Almost every TypeScript PR changes the root lockfile, so the filter rarely excludes anything. Two examples from today:
- fix(filesystem): move minimatch to ^11.0.4 for GHSA-g3hv-75wg-m249 #5426 (filesystem minimatch bump) changed
.changeset/…,package-lock.jsonandsrc/filesystem/package.json. Nothing ineverythingchanged, but the diff ran. - fix(deps): v2.3.0 release audit, raise the qs override to >=6.16.1 #5427 (release audit) changed only the root
package.jsonandpackage-lock.json, and the diff ran.
Also, only everything gets an interface diff. The other six servers have none, so a tool, prompt, resource or capability change in them gets no reviewer-facing report.
Expected behavior
- Each server's interface diff runs only when that PR changes that server. "Changes that server" means
src/<server>/**, plus a change to the dependency tree the server actually resolves. A root lockfile edit counts only when it changes a package<server>resolves, not just because the file changed. The diff tooling itself (scripts/interface-diff.mjs, its helpers and the workflow) still triggers every server's diff. - Every server gets an interface diff. That covers the four TypeScript servers (
everything,filesystem,memory,sequentialthinking) and the three Python servers (fetch,git,time), each with its own sticky PR comment (one marker per server) and its own report artifact.
Notes for the implementation
pathsis per workflow, not per server, and it cannot express "the lockfile changed in a way that affects server X". Achangesjob that computes the affected servers and fans out through a matrix will probably work better than seven copies of the workflow. The same job could also handle the lockfile check, for example by comparingnpm ls --workspace src/<server> --allbetween base and head, or by checking whetheruv.lockchanged for the Python servers.scripts/interface-diff.mjsis hard-wired toeverything. It needs a--server <name>argument, and for the Python servers it has to build or run the base withuv(uv run --frozen mcp-server-<name>from the exported base tree) rather thannode dist/…. Some servers need arguments to boot (for example,filesystemneeds an allowed directory, andgitmay need a repository), so each server needs its own start command.local:gate: theinterface-diffstage runs on every gate today. It should follow the same rule and diff only the servers changed since the merge-base withorigin/v2/main.scripts/lib/workflow-gate.test.mjsrequires CI and the gate to run the same npm script, so both should share the server-selection logic.- Keep the existing security split (untrusted build in a read-only
diffjob, comment posted by a separate job that runs no PR code), thereleaseandworkflow_dispatchtriggers, and the fork-PR fallback to the job summary and artifact. - Update
docs/quality-gate.md, theAGENTS.mdtree entry and the gate description that name theeverything-only diff.
Related: #4860 (where the diff was adopted), #5173 (version PRs), and #5218 (an outside proposal for per-server contract diffs).
Activity