Hi, I built RepoXray (https://github.com/Ra9mirez11/repoxray) to audit repositories before running npm install or attaching AI coding agents.
Why I built it:
- AI slopsquatting: LLMs regularly hallucinate plausible package names. If a package returns 404 on npm today, an attacker can register it tomorrow. RepoXray checks live registry existence, package age (<21 days), OSV.dev advisories (resolving exact package-lock.json versions), and risky postinstall shell/network hooks.
- MCP & .env exposure: Many repos now include .mcp.json or claude_desktop_config.json with plaintext tokens or unpinned
npx -yremote execution, plus .env files readable by coding agents without .aiignore. - Privacy & footprint: The web scanner runs 100% in browser RAM via File System Access / Drag-and-Drop APIs (0 bytes uploaded to any server). The CLI (
npx rxray .) is a 19 KB bundle with 0 runtime dependencies.
It also calculates active LLM context bloat and compiles tailored .aiignore + AGENTS.md guardrails and a remediation prompt. Would appreciate technical feedback on false positives or missing detection rules.
Top comments (7)
Nice scope. Three rules from running a similar check over 10,659 public MCP configs this weekend, in case they help:
0.0.1-securitymeans npm removed a malicious package under that name. Configs still callmcp-server-fetch,-git,-notion,-postgresand-redisthroughnpx; all five had malware advisories this year (MAL-2026-5476 and others). Worth flagging separately from a normal 404 or a vuln.uvx. The npm-style guesses (.../server-fetchunder the official scope) were the most common missing names we saw.@anthropic-ai, while@anthropicbelongs to someone else, and configs still reference@anthropic/...names.One parser note: some configs write
commandas an array instead of a string, which crashed our first pass.Gold-tier field data—thank you for sharing the takeaways from that 10,659-config scan.
Just shipped all four in
rxray@0.2.0(and live on repoxray.pages.dev), with credit to you in the changelog:SC-NPM-SECURITY-TOMBSTONE: Explicitly flags0.0.1-security/*-security/"security holding package"tombstones (mcp-server-fetch,-git, etc.) as Critical malware-takedown artifacts rather than letting HTTP 200 pass or lumping them into generic vulns.SC-MCP-WRONG-REGISTRY: Flags npm references (@modelcontextprotocol/server-*and unscopedmcp-server-*) for the Python-onlyuvxreference servers (fetch,git,sqlite,time,sentry) and points directly touvx mcp-server-<name>.SC-SCOPE-IMPERSONATION-RISKvsSC-HALLUCINATED-VENDOR-PKG: Separates 404s inside verified vendor-owned org scopes from open/unverified 404s, and explicitly flags lookalike non-vendor scopes like@anthropic/*(vs@anthropic-ai/*) and@mcp/*(vs@modelcontextprotocol/*).mcpParser.ts) to normalizecommandas both string and string array (["npx", "-y", ...]) and feed extracted MCPnpx/bunx/uvxpackages straight into the live registry check.If you spot any other edge cases from your dataset, I'd love to add them.
Quick turnaround, thanks for the credit. Two more from the same data. Git installs:
npx github:owner/repooruvx --from git+https://...with no commit SHA are unpinned too, and a registry check skips them because there is no registry entry. And keys sitting in theenvblock of the config itself, which is where most of the likely-real tokens we found were. Do you flag env values today, or only files like .env?On the
envblock question: yes, we already inspect structured"env": { ... }entries inside MCP configs viaSEC-MCP-PLAINTEXT-ENV(allowing dynamic references like${VAR},${env:VAR}, andop://...while redacting literal values). Prompted by your question, I just tightened that pass inrxray@0.3.2to also catch Docker-style-e KEY=VALargs, covermcp_config.json/cline_mcp_settings.json/roo_mcp_settings.json/.zed/settings.json, add prefixes for Notion (ntn_), Linear (lin_api_), Tavily (tvly-), Firecrawl (fc-), Perplexity (pplx-), Figma (figd_), and GitLab (glpat-), and filter out non-secret config keys (NODE_ENV, paths,MAX_TOKENS, public base URLs).Also shipped
SC-MCP-UNPINNED-GIT(andSC-UNPINNED-GIT-SPECfor manifests) in0.3.2:npx github:owner/repo, barenpx owner/reposhorthand,npx git+https://..., anduvx --from git+https://...unless pinned to a full 40/64-hex commit SHA (#<sha>for npm/npx,@<sha>for uvx/pip) — flagging both floatingHEADand mutable branch/tag refs like@main.github:owner/repoor truncatinggit+https://...at+).Appreciate you sharing these — updated your credit note in the changelog and web UI as well.
That was quick. Ours only checks one pasted config at a time, so a repo-wide scan running the same rules covers what we don't. If we find more patterns on the next rescan, we will post them here.
Makes total sense — single-config inspection and repo-wide/pre-commit scanning complement each other nicely.
Whenever your next rescan surfaces new patterns, drop them here or on GitHub (I added a dedicated Detection Rule issue template at github.com/Ra9mirez11/repoxray/iss...). Also, if you have a public URL or write-up for your single-config checker/research, let me know and I will link it directly from your @X1Y1 contributor card on RepoXray.
Thanks. The checker is at x1y1.co/mcp-config-check and the write-up with the numbers is x1y1.co/journal/public-mcp-configs-checked/. I'll use the issue template when the next rescan turns up something new.