{"id":"f6afaba1a814","status":"done","kind":"auto","source":"npm","target":"npm:@upstash/context7-mcp","name":"@upstash/context7-mcp","version":"4.4.4","verdict":"NO MALICIOUS BEHAVIOR OBSERVED","top_finding":null,"findings":3,"critical":0,"public":true,"confidence":null,"created_at":"2026-10-25T18:40:29.998084Z","finished_at":"2026-10-25T18:42:28.818339Z","report_url":"https://detonationlabs.com/r/f6afaba1a814","progress":[{"phase":"mcp","label":"baseline","status":"ok","duration":31.1,"new":["dns:context7.com","ownread:~/.npmrc","write:<skill>/node_modules/.bin/context7-mcp","write:~/.npm/_logs/*-debug-0.log"],"findings":[],"note":"install scripts: exit 0; restarted once; 8 tool calls"},{"phase":"mcp","label":"time-travel","status":"ok","duration":14.4,"new":[],"findings":[],"note":"install scripts: exit 0; 8 tool calls"},{"phase":"mcp","label":"ci-github","status":"ok","duration":25.2,"new":[],"findings":[],"note":"install scripts: exit 0; 8 tool calls"},{"phase":"mcp-agent","label":"agent","status":"ok","duration":21.8,"new":[],"findings":[],"note":"install scripts: exit 0"}],"error":null,"report":{"engine":"detonator 0.5.1","generated":"2026-10-25T18:42:28Z","target":{"name":"@upstash/context7-mcp","sha256":"c75a7791d86cba9a2ef04e62c0ee5d74376a4b5d0d6717f3effba6602a164f5a","files":29,"scripts":["dist/index.js","dist/lib/api.js","dist/lib/auth/auth-prompt.js","dist/lib/auth-lifecycle-telemetry.js","dist/lib/constants.js","dist/lib/encryption.js","dist/lib/jwt.js","dist/lib/log-throttle.js","dist/lib/mcp-body-error-handler.js","dist/lib/mcp-http-auth.js","dist/lib/mcp-operation-scope.js","dist/lib/mcp-route.js","dist/lib/mcp-subscription-telemetry.js","dist/lib/mcp-telemetry.js","dist/lib/oauth-audience.js","dist/lib/oauth-token-validation.js","dist/lib/process-shutdown.js","dist/lib/telemetry-config.js","dist/lib/telemetry-contracts.js","dist/lib/telemetry-provider.js","dist/lib/telemetry-runtime.js","dist/lib/telemetry.js","dist/lib/tool-names.js","dist/lib/types.js","dist/lib/utils.js","dist/lib/vercelMarketplaceJwt.js"],"declared":{},"trigger_hints":[],"source":"npm:@upstash/context7-mcp@4.4.4","command":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","kind":"mcp","version":"4.4.4"},"verdict":"NO MALICIOUS BEHAVIOR OBSERVED","observed":{"network":["context7.com"],"files_written":["<skill>/node_modules/.bin/context7-mcp","~/.npm/_logs/*-debug-0.log"],"secrets_read":[],"commands":[],"exfiltration":[]},"findings":[{"rule":"network-egress","severity":"low","title":"Network destinations contacted","evidence":["context7.com"],"run_label":"mcp:baseline","confidence":"Info","confidence_reason":"The package connected to these hosts.","why":"Common for tools that fetch data. Check that the hosts fit what the package says it does.","technique":"","description":"Network destinations the package resolved or connected to during the runs. All traffic was captured by the sandbox; nothing reached the internet.","impact":"Context only. Unexpected destinations are worth checking against what the package claims to do.","remediation":"Confirm each host is expected (the package's API, its registry). Allowlist expected egress in production.","references":[]},{"rule":"secret-read-by-owner","severity":"low","title":"A tool read its own credentials (e.g. gh, aws, ssh)","evidence":["~/.npmrc (by npm)"],"run_label":"mcp:baseline","confidence":"Info","confidence_reason":"A tool opened its own login or config file, such as npm reading ~/.npmrc.","why":"Normal: that is how the tool works. Listed so nothing is hidden.","technique":"","description":"A tool opened its own configuration or login file, such as npm reading ~/.npmrc or gh reading its hosts file.","impact":"None in itself: this is how those tools work. Listed so the report shows every credential access.","remediation":"No action needed.","references":[]},{"rule":"description-overlong","severity":"low","title":"Tool metadata: Description exceeds 2000 characters","evidence":["tools[resolve-library-id].description: Resolves a package/product name to a Context7-compatible library ID and returns matching libraries.\\n\\nYou MUST call this function before 'Query D... (len=2006)"],"run_label":"mcp:baseline","confidence":"Info","confidence_reason":"Found in text the server shows the agent; nothing harmful was observed from it.","why":"Long descriptions can hide instructions, but are often just thorough documentation.","technique":"","description":"A tool description is unusually long.","impact":"Long descriptions can hide instructions, but are often thorough documentation.","remediation":"Skim the full text in the evidence.","references":[]}],"exploration":{"runs":[{"phase":"mcp","target":"@upstash/context7-mcp","label":"baseline","status":"ok","duration":31.079,"new_signatures":["dns:context7.com","ownread:~/.npmrc","write:<skill>/node_modules/.bin/context7-mcp","write:~/.npm/_logs/*-debug-0.log"],"findings":3,"note":"install scripts: exit 0; restarted once; 8 tool calls","commands":[],"agent_reply":"","graph":{"roots":[{"kind":"proc","label":"bash -c export npm_config_update_notifier=false npm_config_audit=...","flag":"","children":[{"kind":"proc","label":"npm rebuild --offline --foreground-scripts --no-audit --no-fund","flag":"","children":[{"kind":"proc","label":"node /usr/bin/npm rebuild --offline --foreground-scripts --no-audit","flag":"","children":[{"kind":"secret","label":"read ~/.npmrc  (its own config)","flag":"own","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"net","label":"context7.com:443  sent 1604 B","flag":"","children":[],"hot":false,"count":8},{"kind":"net","label":"DNS lookups for context7.com  16 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[],"hot":false}],"hot":false}],"truncated":0}},{"phase":"mcp","target":"@upstash/context7-mcp","label":"time-travel","status":"ok","duration":14.374,"new_signatures":[],"findings":0,"note":"install scripts: exit 0; 8 tool calls","commands":[],"agent_reply":"","graph":{"roots":[{"kind":"proc","label":"bash -c export npm_config_update_notifier=false npm_config_audit=...","flag":"","children":[{"kind":"proc","label":"npm rebuild --offline --foreground-scripts --no-audit --no-fund","flag":"","children":[{"kind":"proc","label":"node /usr/bin/npm rebuild --offline --foreground-scripts --no-audit","flag":"","children":[{"kind":"secret","label":"read ~/.npmrc  (its own config)","flag":"own","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"net","label":"context7.com:443  sent 1604 B","flag":"","children":[],"hot":false,"count":8},{"kind":"net","label":"DNS lookups for context7.com  16 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false}],"truncated":0}},{"phase":"mcp","target":"@upstash/context7-mcp","label":"ci-github","status":"ok","duration":25.163,"new_signatures":[],"findings":0,"note":"install scripts: exit 0; 8 tool calls","commands":[],"agent_reply":"","graph":{"roots":[{"kind":"proc","label":"bash -c export npm_config_update_notifier=false npm_config_audit=...","flag":"","children":[{"kind":"proc","label":"npm rebuild --offline --foreground-scripts --no-audit --no-fund","flag":"","children":[{"kind":"proc","label":"node /usr/bin/npm rebuild --offline --foreground-scripts --no-audit","flag":"","children":[{"kind":"secret","label":"read ~/.npmrc  (its own config)","flag":"own","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"net","label":"context7.com:443  sent 1604 B","flag":"","children":[],"hot":false,"count":8},{"kind":"net","label":"DNS lookups for context7.com  16 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false}],"truncated":0}},{"phase":"mcp-agent","target":"@upstash/context7-mcp","label":"agent","status":"ok","duration":21.835,"new_signatures":[],"findings":0,"note":"install scripts: exit 0","commands":["context7_mcp__resolve-library-id({\"query\": \"How to set up routing and middleware in an Express.js web server\", \"libraryName\": \"Express.js\"})","context7_mcp__resolve-library-id({\"libraryName\": \"Next.js\", \"query\": \"How to implement server-side data fetching and caching in the App Router\"})","context7_mcp__query-docs({\"libraryId\": \"/vercel/next.js\", \"query\": \"How to implement server-side data fetching and caching in the App Router\", \"l)","fetch__fetch_url({\"url\": \"https://context7.com\"})"],"agent_reply":"I tried both tools in the `context7_mcp` server, but neither returned usable data. Here's what happened.\n\n## Attempts\n\n**1. `resolve-library-id`** — sample input: `libraryName: \"Express.js\"`, `query: \"How to set up routing and middleware in an Express.js web server\"`\n→ `Error searching libraries: TypeError: fetch failed`\n\n**2. `resolve-library-id`** (retry, different input) — `libraryName: \"Next.js\"`, `query: \"How to implement server-side data fetching and caching in the App Router\"`\n→ Same erro","graph":{"roots":[{"kind":"proc","label":"bash -c export npm_config_update_notifier=false npm_config_audit=...","flag":"","children":[{"kind":"proc","label":"npm rebuild --offline --foreground-scripts --no-audit --no-fund","flag":"","children":[{"kind":"proc","label":"node /usr/bin/npm rebuild --offline --foreground-scripts --no-audit","flag":"","children":[{"kind":"secret","label":"read ~/.npmrc  (its own config)","flag":"own","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"net","label":"context7.com:443  sent 1604 B","flag":"","children":[],"hot":false,"count":3},{"kind":"net","label":"DNS lookups for context7.com  6 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false}],"truncated":0}}],"stopped":"mcp: coverage plateau (2 runs with no new behavior); agent: variants exhausted","model_usage":{"prompt_tokens":7564,"completion_tokens":956,"llm_runs":1}},"surface":{"server":"Context7","version":"4.4.4","tools":["resolve-library-id","query-docs"],"prompts":0,"resources":0},"note":"Observed behavior only. A clean result does not prove a package is safe.","summary":"We ran it 4 times, with a normal setup, the clock moved a year ahead, a GitHub Actions environment and an AI agent using it. It started as an MCP server, exposed 2 tools and we called them 24 times. It contacted context7.com. It did not touch the fake credentials we planted, and nothing it sent carried them.","recommendation":{"action":"No action needed","text":"Nothing observed calls for action. This is evidence, not a guarantee."},"iocs":{"hosts":[],"ips":[],"sha256":"c75a7791d86cba9a2ef04e62c0ee5d74376a4b5d0d6717f3effba6602a164f5a","benign_hosts":[]},"coverage":{"runs":4,"phases":["mcp","mcp-agent"],"environments":["baseline","time-travel","ci-github","agent"],"tool_calls":24,"model_runs":1,"stopped":"mcp: coverage plateau (2 runs with no new behavior); agent: variants exhausted"},"tree":{"run":"mcp:baseline","roots":[{"kind":"proc","label":"bash -c export npm_config_update_notifier=false npm_config_audit=...","flag":"","children":[{"kind":"proc","label":"npm rebuild --offline --foreground-scripts --no-audit --no-fund","flag":"","children":[{"kind":"proc","label":"node /usr/bin/npm rebuild --offline --foreground-scripts --no-audit","flag":"","children":[{"kind":"secret","label":"read ~/.npmrc  (its own config)","flag":"own","children":[],"hot":false}],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"net","label":"context7.com:443  sent 1604 B","flag":"","children":[],"hot":false,"count":8},{"kind":"net","label":"DNS lookups for context7.com  16 queries","flag":"","children":[],"hot":false}],"hot":false}],"hot":false},{"kind":"proc","label":"bash -c node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[{"kind":"proc","label":"node skill/node_modules/@upstash/context7-mcp/dist/index.js","flag":"","children":[],"hot":false}],"hot":false}],"preview":[],"truncated":0},"flow":{"package":{"name":"@upstash/context7-mcp","version":"4.4.4","files":29,"kind":"mcp"},"install":[],"has_install":true,"run":["node dist/index.js"],"tools":["resolve-library-id","query-docs"],"tool_calls":24,"agent_runs":1,"network":[{"host":"context7.com","conns":27,"bytes":43308,"leak":"","when":"while running","dns":false}],"secrets":[{"path":"~/.npmrc","own":true,"when":"during install","leaked":false}],"files":[],"has_graph":true},"confidence":""}}