Add plugin trace-mcp - #54
nikolai-vysotskyi wants to merge 5 commits into
Conversation
hetaoBackend
left a comment
There was a problem hiding this comment.
Request changes for exact current head bf93ee43e5ac3ebbeb2c4cec288726bbd8d6529a.
The package shape and MIT licensing validate, but this PR currently delegates a broad local-code capability to an unverifiable external executable without adequate disclosure or runtime evidence:
- The MCP executable is unpinned and PATH-selected.
mcp.json:3-7runs baretrace-mcp, whileplugin.jsondeclares 3.28.0 andREADME.md:15-18tells users to install unversioned latest. The actual high-privilege program can therefore be another version or any same-named PATH entry. At minimum pin the supported package/version in installation instructions, document that the host cannot verify its identity, and provide a provenance/integrity mechanism or a controlled bundled server. - Network/data disclosure is incomplete.
README.md:22-26says source never leaves the machine and there is no other network access, but upstream 3.28.0 sends an opt-out daily Google Analytics usage ping with a persistent local UUID/system/tool counters, and supports opt-in remote AI providers plus Langfuse/OTLP observability. List the endpoint, fields and opt-outs, and limit “source stays local” to the default configuration; disclose when optional remote features can transmit code/context. - The plugin includes mutating tools without a complete safety contract.
skills/trace-mcp-codemod/SKILL.md:64-70enables non-dry-run codemods andskills/trace-mcp-refactoring/SKILL.md:54-66invokes repository-wide rename operations. README should disclose bulk writes and confirmation/rollback behavior, with executable negative tests for default no-write/dry-run, large-change confirmation, path/symlink rejection, and partial-failure cleanup. - There is no real executable evidence. The only GitHub check is skipped
[code]smith; repository validation exercises manifests, nottrace-mcpinitialize/tools/list/tool calls, telemetry opt-out, or mutation boundaries. Add exact-version MCP handshake and safety smoke tests, including Windows if Windows remains claimed.
No embedded secret, native binary, direct SSRF field, or license incompatibility was found in the submitted files. The blockers are the external executable/supply-chain boundary and the undisclosed runtime behavior. [code]smith is skipped and was not used as evidence.
|
Thanks for the detailed review — all four points hold up against the 3.28.0 tree, checked this morning.
Pushing the fixes for 1–3 to this branch today, 4 to follow; will re-request review once all four are in. |
Addresses review points 1-3 on PR MiniMax-AI#54: version-pinned install with PATH caveat and provenance check, GA4 endpoint/fields/opt-outs with default-config scope, bulk-write disclosure for apply_rename/apply_codemod.
|
Status on the four points. Fixes for 1-3 are in this branch (89ae973). For point 4 I ran the pinned build instead of describing it, and the runs turned up two upstream write-boundary gaps, so I am holding the re-request until those are fixed and re-tested. Setup: What passed, all against the pinned build with zero writes outside the intended assertions:
What did not pass: the codemod file pattern is not confined to the project root, and writes addressed through in-root symlinks land outside it. Both reproduced on current latest (3.31.2), so moving the pin would not close it. I have logged this with the trace-mcp maintainers (that is us) and the fix goes in there first. I am keeping exploit detail out of this thread; the next update here is a pinned fixed version plus passing boundary tests, and only then a re-request. Two adjacent observations from the runs, relevant to point 1. The pinned install self-updates by default (my 3.28.0 session started fetching 3.31.2 mid-run; |
hetaoBackend
left a comment
There was a problem hiding this comment.
Request changes for exact current head 89ae9733713627bdbc6cde6cc8dc5d46577bd6c7.
The telemetry/remote-provider/mutation disclosures are materially better, but the executable and safety contract is still not verifiable:
mcp.jsonstill launches baretrace-mcpfromPATH. The README pins an install command, but the plugin cannot enforce the resolved executable, version, source or npm integrity;plugin.jsonversion metadata does not constrain the process that answers that name. Add a controlled/version-checked launcher or an equivalent fail-closed runtime provenance/version check.- The README says two tools modify the checkout, but the bundled refactoring skill also invokes
extract_function; the mutation surface is incomplete. Document every mutating tool and its preview/confirmation/file-range/rollback semantics. - There is still no exact-version external MCP smoke for real
initialize,tools/list,tools/call, telemetry opt-out, wrong/stale PATH detection, or mutation boundaries. Add an isolated-home/PATH smoke against the supported package and verifydry_run, >20-file confirmation, rename/extract mutation and partial-failure behavior. - The only exact-head visible check is
[code]smith = SKIPPED; repository manifest validation does not prove this third-party executable works.
The npm package has positive integrity/signature/provenance metadata, but that does not close the host PATH binding or executable behavior gap. Do not merge until the exact executable contract and real MCP smoke are present.
…ill param fix - mcp.json runs npx -y trace-mcp@3.28.0 instead of a bare PATH binary, so the pinned registry version answers every launch and a stale global install or same-named PATH entry is never consulted. - README Writes section lists all six mutating tools with their exact gates (dry_run default, confirm_large past 20 files on rename and codemod only), states the two limits plainly (no automatic rollback, project-root confinement without symlink resolution), and notes the dev-preset requirement for the bundled skills. - Refactoring skill: extract_function example uses the schema's function_name (was new_name, which the tool rejects).
|
Round 2 addressed in
|
|
Both write-boundary gaps from my last comment are fixed upstream, and I re-ran the two probes against a build from master (commit Same setup as before: clean build from that commit, stdio session, daemon auto-spawn off, auto-update off, isolated home, scratch fixture with a canary file outside the project root.
Raw transcript of the four calls: {"test":"handshake.initialize","serverVersion":"3.31.3"}
{"test":"probe.codemod_escape_dryrun","success":false,"error":"file_pattern escapes project root: ../outside/secret.js. file_pattern must only match files inside the project root.","outside_unchanged":true}
{"test":"probe.codemod_escape_apply","success":false,"error":"file_pattern escapes project root: ../outside/secret.js. file_pattern must only match files inside the project root.","files_modified":[],"outside_changed":false,"outside_unchanged":true}
{"test":"probe.symlink_extract_dryrun","success":true}
{"test":"probe.symlink_extract_apply","success":false,"error":"Refusing to write through symlink: /tmp/.../proj/link-out.js","files_modified":[],"outside_changed":false,"outside_unchanged":true}Upstream also added 11 regression tests mirroring both probes; all pass on this tree. What this means for this PR: nothing in this branch changes yet. |
|
Pinned to the fixed release and re-verified — ready for another look. Pin bump (41cac18): Re-run against the published pin —
Upstream regression suite for both probes ( |
hetaoBackend
left a comment
There was a problem hiding this comment.
Request changes for exact current head 41cac1848e0ee1348df0d300b63f2966d1b71a97.
The npx -y trace-mcp@3.31.5 pin and npm integrity/signature/provenance metadata are improvements, but blockers remain:
- The pinned launcher does not guarantee the code that answers MCP.
mcp.json:6-7does not set the shipped runtime’s daemon/update controls (TRACE_MCP_NO_DAEMON,TRACE_MCP_NO_AUTO_UPDATE), while the package can proxy to a daemon on its default port. The README claim that the exact validated version runs on every launch is therefore too strong. Force a daemonless/non-updating exact runtime, or validate/document the actual backend version and provenance. - Mutation disclosure is still materially incomplete.
README.md:31says six tools modify the checkout and everything else is read-only, but the shipped 3.31.5 registry also exposes additional source/config/state/startup writes, includinggenerate_docs, decision/ranking writes,trace_state_*, and startup recommendation apply/rollback tools. Distinguish source edits from other persistent mutations and disclose all write surfaces and confirmation/rollback semantics. - The branch still contains no reproducible exact-pin MCP smoke for initialize, default/dev tools/list, a read call, dry-run/confirm_large, traversal/symlink rejection, telemetry opt-out, actual mutation behavior, and daemon/backend version reporting. Independent bounded runtime probes did not return JSON-RPC, so these claims remain unverified.
- Exact-head CI and CodeQL are
action_required; the only visible check is[code]smith = SKIPPED. Manifest validation alone does not prove the external runtime contract.
Do not merge until the actual executing backend is provenance-bound and repeatable MCP/security smoke evidence exists.
…act-pin smoke mcp.json ships the shipped runtime's own controls as env: no daemon auto-spawn, no self-update, no usage ping, and the daemon-health poll redirected to a port this plugin never binds, so a foreign daemon (e.g. the desktop app's on 3741) is never adopted as the executing backend. README corrects the version claim to what initialize actually reports, documents daemon verification via /health, and discloses all write surfaces grouped by checkout edits, user tool-config, home-state stores, and in-band content. smoke/exact-pin-smoke.mjs reproduces the executable contract (14 assertions) with last-run.jsonl as the passing transcript.
|
Round 3 addressed in
Re-requesting review on this head. |
What changes
Adds
plugins/nikolai-vysotskyi/trace-mcp: a portable Agent Plugins 1.0 package for trace-mcp, a local code-intelligence MCP server. Upstream: https://github.com/nikolai-vysotskyi/trace-mcpContents:
plugin.json,mcp.json(one stdio server, baretrace-mcpcommand),README.md, MITLICENSE, and four skills (trace-mcp,trace-mcp-refactoring,trace-mcp-codemod,trace-mcp-pre-commit).User value
A MiniMax Code user can ask who calls a function and what breaks if its signature changes, and get the answer from the index instead of the agent reading files one by one.
Example prompt:
Expected result: the agent calls the trace-mcp search and impact tools and answers with the call sites plus the blast radius, without opening each file. On an unindexed project the agent runs
trace initonce first.Plugin submission checklist
plugins/<github-owner>/<plugin-name>.plugin.jsonname matches the Plugin directory.README.mdincludes a real example prompt and expected result.LICENSEandplugin.jsondeclare an open-source license (MIT in both, same as upstream).trace-mcponPATHvianpm install -g trace-mcp, macOS/Linux/Windows; no account, no paid service, no key).TODOhas been replaced (noTODOstring in the package; verified by search).npm run checkpasses (left to CI; see Evidence).Evidence
I read
scripts/lib/validation.mjsand checked this package against it without executing repo code: owner and plugin names match the required patterns,plugin.jsonname equals the directory, all manifest fields are in the allowed set,mcp.jsonholds one stdio server with a bare command, 4 skill directories (limit 64) each with frontmatternameequal to the directory and a non-empty body, non-emptyREADME.mdandLICENSE, zero symlinks. The shippedplugin.json,mcp.json, and skill files are byte-identical to the ones at the upstream repo root and in itsskills/directory, where other runtimes already consume them; the only new file is the hostedREADME.md.Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.