security

Security

Every MCP risk signal in one place — CVEs, tool safety, drift, naming, licenses. Heuristic: review signals, not verdicts. New here? The Risk tab gives an at-a-glance composite grade per server; the Code Analysis tab shows what the static scanner found in published source.

Static code-analysis findings — hidden prompt content in shipped skill files, committed secrets, dynamic-exec sinks, and suspicious call-home endpoints — across the analyzed catalogue. Heuristic, pure, no code executed; every row deep-links to its source. Click a kind to filter.

analysis coverage 58% of 26,365 analyzable servers
15407 analyzed
8150 re-analysis due
2806 not analyzable
2 not yet analyzed
3168 source gone
not analyzable
2,359 no source 447 too large

Running analyzer v28. The scanner changelog explains what each version detects and when it changed.

  1. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) expect(checkUrlSync("http://169.254.169.254/latest/meta-data/").blocked).toBe(true)
  2. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) expect(scanCode("python", "import urllib.request; urllib.request.urlopen('http://169.254.169.254/')").blocked).toBe(true)
  3. HIGH dynamic exec sergezuber/FABULA-LLM-5 indirect eval const res = await _page.evaluate((e: string) => { try { return JSON.stringify((0, eval)(e)) } catch (err: any) { return "eval error: " + err.message } }, args.eval)
  4. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) res.writeHead(302, { Location: "http://169.254.169.254/latest/meta-data/" }); res.end(); return
  5. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) await expectBlocked("web_fetch", { url: "http://169.254.169.254/latest/meta-data/" }, "ssrf")
  6. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) expect(out(await T.browser_navigate.execute({ url: "http://169.254.169.254/", description: "x" }))).toContain("BLOCKED")
  7. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 8.8.8.8 expect(checkUrlSync("https://8.8.8.8/").blocked).toBe(false)
  8. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) expect(checkUrlSync("http://169.254.169.254/latest/meta-data/").code).toBe("cloud_metadata")
  9. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) await expectBlocked("web_fetch", { url: "http://169.254.169.254/latest/meta-data/" }, "ssrf:cloud_metadata")
  10. LOW obfuscation sergezuber/FABULA-LLM-5 dynamic require()/import() const mod = await import(`../fabula-reliability?${tag}`)
  11. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) ["cloud metadata IP", "python", "import urllib.request\nurllib.request.urlopen('http://169.254.169.254/latest/meta-data/')", "cloud_metadata"],
  12. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 us.i.posthog.com (telemetry) const response = await fetch("https://us.i.posthog.com/i/v0/e/", {
  13. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 169.254.169.254 (cloud metadata) headers: { Location: "http://169.254.169.254/latest/meta-data/" },
  14. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 93.184.216.34 await expect(assertSafeUrl("http://93.184.216.34/")).resolves.toBeUndefined()
  15. MEDIUM suspicious endpoint sergezuber/FABULA-LLM-5 172.32.0.1 await expect(assertSafeUrl("http://172.32.0.1/")).resolves.toBeUndefined()