Product priority (2026-09-04): P0 adoption blocker. The documented first-contact detector tells a user to stop on MCP repositories the installed CLI already supports. Preserve the bounded stdlib implementation and adversarial fixtures below; #497 owns continuing parity. Do not make #484's new Python extraction a prerequisite for repairing this already-supported TypeScript/Go route.
The zero-install detector does not read MCP registration sites, so it still reports vendor MCP servers as non-agent projects
Summary
#431 taught the installed CLI to read an MCP server's tool names out of TypeScript
or Go registration sites (tool_sources[].type: mcp_server_source). The
zero-install detector, tools/shipgate-detect.py, did not gain that detection —
so the two now disagree on the one question the script exists to answer:
| workspace |
agents-shipgate detect |
tools/shipgate-detect.py |
mongodb-js/mongodb-mcp-server |
is_agent_project: true, 61 tools |
false — "Stop" |
grafana/mcp-grafana |
is_agent_project: true, 114 tools |
false — "Stop" |
github/github-mcp-server |
is_agent_project: true, 110 tools |
false — "Stop" |
This matters more than an ordinary gap because the script is the documented
front door for a repository that has not adopted Shipgate — which is 100% of
the population #431 is about. An agent that curls the detector onto a vendor MCP
server gets the exact "Stop" that issue was filed to end.
Why it was not done in #431
Porting means a second implementation of the load-bearing matcher — the
masking lexer and the five idioms — into a stdlib-only single file. That is the
recurring "second implementation" bug class in this repository, and it deserves
its own increment with a drift guard rather than being appended to an already
large change.
The parity test (test_script_verdict_matches_cli) could not see the
divergence: it compares the two on samples/, and no sample contains a
TypeScript or Go MCP server. #431 therefore added
test_framework_vocabulary_names_every_cli_omission, which pins the CLI's
framework vocabulary against the script's and fails on any new omission, and
named this one in the script's own "Intentional simplifications" list.
Scope
- Port
agents_shipgate.inputs.mcp_idioms's reader (masking lexer, five
idioms, is_scannable_path) and the dependency gate into
tools/shipgate-detect.py, stdlib-only.
- A shared conformance corpus. The positive samples and the adversarial
sweep in tests/test_mcp_idioms.py should be driven through both
implementations by one parametrised test, so the two cannot drift on any case
either of them has ever been asked about. This is the part that makes the
duplication acceptable.
- Add a
samples/ fixture with a TypeScript or Go MCP server so the existing
parity test covers the route too, and remove mcp_server_source from
known_omissions.
Acceptance
The zero-install detector does not read MCP registration sites, so it still reports vendor MCP servers as non-agent projects
Summary
#431 taught the installed CLI to read an MCP server's tool names out of TypeScript
or Go registration sites (
tool_sources[].type: mcp_server_source). Thezero-install detector,
tools/shipgate-detect.py, did not gain that detection —so the two now disagree on the one question the script exists to answer:
agents-shipgate detecttools/shipgate-detect.pymongodb-js/mongodb-mcp-serveris_agent_project: true, 61 toolsfalse— "Stop"grafana/mcp-grafanais_agent_project: true, 114 toolsfalse— "Stop"github/github-mcp-serveris_agent_project: true, 110 toolsfalse— "Stop"This matters more than an ordinary gap because the script is the documented
front door for a repository that has not adopted Shipgate — which is 100% of
the population #431 is about. An agent that curls the detector onto a vendor MCP
server gets the exact "Stop" that issue was filed to end.
Why it was not done in #431
Porting means a second implementation of the load-bearing matcher — the
masking lexer and the five idioms — into a stdlib-only single file. That is the
recurring "second implementation" bug class in this repository, and it deserves
its own increment with a drift guard rather than being appended to an already
large change.
The parity test (
test_script_verdict_matches_cli) could not see thedivergence: it compares the two on
samples/, and no sample contains aTypeScript or Go MCP server. #431 therefore added
test_framework_vocabulary_names_every_cli_omission, which pins the CLI'sframework vocabulary against the script's and fails on any new omission, and
named this one in the script's own "Intentional simplifications" list.
Scope
agents_shipgate.inputs.mcp_idioms's reader (masking lexer, fiveidioms,
is_scannable_path) and the dependency gate intotools/shipgate-detect.py, stdlib-only.sweep in
tests/test_mcp_idioms.pyshould be driven through bothimplementations by one parametrised test, so the two cannot drift on any case
either of them has ever been asked about. This is the part that makes the
duplication acceptable.
samples/fixture with a TypeScript or Go MCP server so the existingparity test covers the route too, and remove
mcp_server_sourcefromknown_omissions.Acceptance
python3 tools/shipgate-detect.py --workspace <mongodb checkout> --jsonreturns
is_agent_project: truewith the samesuggested_sourcesas the CLI.both implementations.
test_framework_vocabulary_names_every_cli_omissionpasses with an emptyknown_omissions.