code-graph@0.193.0
CAUTION· startup onlyPublisher claims: "MCP server that indexes codebases into an AST knowledge graph with semantic search, call graph traversal, and HTTP route tracing" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Startup only; authenticated tool behavior not tested.- Tested
- server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
- Not tested
- the tool list (the server exited before answering) · what the tools do when called with real credentials
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the codeAlso claude.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- the tool list (the server exited before answering) · what the tools do when called with real credentials
Connect it under the guard. Startup only; authenticated tool behavior not tested. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-13 and scored it 66/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Auto-update or dynamic fetch configuration; Auto-update or dynamic fetch configuration; Privileged sudo command. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 20 s · 2 scenariosStatic findings
* Auto-update writes the plugin cache + installed_plugins.json directly andFix: Pin versions and sources; vendor anything fetched at install time.// The updater's main trigger is `launchBackgroundAutoUpdate` in session-init.js:Fix: Pin versions and sources; vendor anything fetched at install time.// hooks from cache/<mp>/<plugin>/<ver>/hooks/hooks.json. PreToolUse, PostToolUse,Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// 3. Common no-sudo user prefixFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// unparseable case and left the unreadable one behind — a `chmod 000`Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* Why a just-run `auto-update.js check` can have done nothing, in the updater'sFix: Pin versions and sources; vendor anything fetched at install time.// auto-update installs a newer version, those old scripts would seeFix: Pin versions and sources; vendor anything fetched at install time.` chmod +x "${binary}"\n`Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// `auto-update.js check` has NO non-zero exit path: dev mode, the opt-out,Fix: Pin versions and sources; vendor anything fetched at install time.// --- npx cache (very last resort — may be outdated) ---Fix: Pin versions and sources; vendor anything fetched at install time.// chmod BEFORE reading the version. readBinaryVersion executes the binaryFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// umask can only have cleared bits the original had, so chmod is what makesFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// Same hoisted-or-nested question as the global prefix — an npx tree isFix: Pin versions and sources; vendor anything fetched at install time.// durable backup — one `chmod 000` (a stray sudo, a restrictive umask) and theFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.`[code-graph] Auto-update to v${latest.version} suspended after ${attempts} failed attempts on this machine. ` +Fix: Pin versions and sources; vendor anything fetched at install time.// auto-update. Deferring this one edge to call time is the only thing thatFix: Pin versions and sources; vendor anything fetched at install time.return `auto-update is SUSPENDED after ${state.updateAttempts} failed attempts on v${state.latestVersion} `Fix: Pin versions and sources; vendor anything fetched at install time.} catch { /* no npx cache */ }Fix: Pin versions and sources; vendor anything fetched at install time.* `auto-update.clearCache()`) is exactly when the chain is longest and everyFix: Pin versions and sources; vendor anything fetched at install time.// `update-*` staging dirs from an interrupted auto-update are the onlyFix: Pin versions and sources; vendor anything fetched at install time.process.stderr.write(`Fix: chmod +x "${binary}"\n`);Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.console.log(`\n \u2705 Fixed permissions: chmod +x ${binary}`);Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.// the former is the healthy-hook-answers-nothing case NEW-08 traded a killFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell./** Auto-update bookkeeping: available version, attempt counters, last error. */Fix: Pin versions and sources; vendor anything fetched at install time.function autoUpdateNoOpReason(state = readUpdateState(), env = process.env) {Fix: Pin versions and sources; vendor anything fetched at install time.// kill switch this design's TTL exists to prevent, in bounded form, and it isFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// an auto-update, on the hook path (JS-23 / pre-ship review 2026-09-07).Fix: Pin versions and sources; vendor anything fetched at install time.* was gone — re-opening the 41 MB auto-update race the tombstone closes, sinceFix: Pin versions and sources; vendor anything fetched at install time.// `launchBackgroundAutoUpdate`. SessionStart is still the racing surface,Fix: Pin versions and sources; vendor anything fetched at install time.…kups, MAX_CORRUPT_BACKUPS, // auto-update.js repoints installed_plugins.json and owes the same preserve-then-proceed route migrateOldPluginIds, …Fix: Pin versions and sources; vendor anything fetched at install time.* (issue #40); the auto-update treadmill fixed alongside it made that perFix: Pin versions and sources; vendor anything fetched at install time.// skipped. Without this arm a chmod on ~/.claude was diagnosed asFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.* Why: candidates below the auto-update cache had no version check at all, soFix: Pin versions and sources; vendor anything fetched at install time.lines.push(' `npx -y @sdsrs/code-graph unadopt` in the project:');Fix: Pin versions and sources; vendor anything fetched at install time.// within 60 s still lands in the cooldown `observe` branch above. A killFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* cargo install → PATH → npx cacheFix: Pin versions and sources; vendor anything fetched at install time.// self-heals through the background auto-update (decision D5).Fix: Pin versions and sources; vendor anything fetched at install time.autoUpdateLaunched, indexFreshness, mapInjected, binaryCheck, consistencyIssues,Fix: Pin versions and sources; vendor anything fetched at install time.* binary. The TTL is what keeps this from becoming a permanent kill switch —Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.// .claude/ detail 文件)。/plugin install 本身已构成知情同意;npm / npx / 裸 checkoutFix: Pin versions and sources; vendor anything fetched at install time.// silently ignores plugin-cache hooks.json for PreToolUse/PostToolUse/Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.// settings.json the user had put at 0600 came back 0644 on the firstFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.env: { ...env, CODE_GRAPH_AUTO_UPDATE_SILENT: '1' },Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`Auto-update skipped: missing required tools: ${missingTools.join(', ')}. Install them to enable auto-updates.`)}`);Fix: Pin versions and sources; vendor anything fetched at install time.// bypasses auto-update.js, so re-sync state.installedVersion every call.Fix: Pin versions and sources; vendor anything fetched at install time.// hook used to write there — "CLAUDE.md was modified", "hooks look dark",Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.' Refusing rather than guessing: both verbs write to your CLAUDE.md.\n');Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.npx -y -p @sdsrs/[email protected] code-graph-mcp snapshot create --out "code-graph-snapshot-${GITHUB_SHA:0:7}.db.zst"Fix: Pin versions and sources; vendor anything fetched at install time.// `followLink` is opt-in, and ONLY the CLAUDE.md read-modify-write passes it.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.`Fix: chmod +x "${binary}"` +Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# name belongs to an unrelated publisher on npm, and `npx -y` would install andFix: Pin versions and sources; vendor anything fetched at install time.* they write `<cwd>/CLAUDE.md`, `<cwd>/.claude/` and `~/.cache/code-graph`, andFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.# inside it). Do NOT shorten this to `npx -y code-graph-mcp` — that unscopedFix: Pin versions and sources; vendor anything fetched at install time.# its checksum beside it as `<name>.db.zst.blake3`. Upload both: installFix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.else lines.push('[code-graph] CLAUDE.md block already up-to-date — no write');Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.'Edit CLAUDE.md manually to opt in.';Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for @sdsrs/code-graph@0.193.0 as of 30 h ago. This is the package itself, not its dependencies.
What would make this Verified
14 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim sdsrs: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- Auto-update or dynamic fetch configuration≈ +4 on the totalPin versions and sources; vendor anything fetched at install time.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.