Audit MCP servers from inside Claude Code. 10 OWASP checks, A-F grade, live leaderboard.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio · http
verified
reported
listed in the official MCP registry counts 4 tools · 0 res
· 0 prompts
permission surface via README inference
tools
-
explain_check
Get a detailed explanation of any OWASP MCP Top 10 check by ID
-
get_public_score
Fetch the live grade for any public MCP server by owner/repo slug
-
list_leaderboard
Return the top/bottom N servers from the public leaderboard
-
scan_mcp_server
Scan a local MCP server by path — returns grade + per-check findings
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 20
filesystem 4
- fs lazymac2x-mcpwatch-8e6e0a4/packages/mcp-server/src/server.ts :23
import { readFile, readdir, stat } from "node:fs/promises"; - fs lazymac2x-mcpwatch-8e6e0a4/packages/scanner/src/cli.ts :2
import { readFile, readdir, stat, writeFile } from "node:fs/promises"; - fs (weak) lazymac2x-mcpwatch-8e6e0a4/packages/scanner/test/fixtures/vulnerable/server.ts :3
import { readFile } from "fs/promises"; - fs (weak) lazymac2x-mcpwatch-8e6e0a4/scripts/gen-pro-report.js :3
const fs = require("fs");
shell / exec 3
- shell lazymac2x-mcpwatch-8e6e0a4/packages/scanner/src/checks/command-injection.ts :5
{ re: /exec\s*\(\s*[`"'][^`"']*\$\{/, msg: "Template literal passed directly into exec()" }, - shell (weak) lazymac2x-mcpwatch-8e6e0a4/packages/scanner/test/fixtures/vulnerable/server.ts :2
import { execSync } from "child_process"; - shell (weak) lazymac2x-mcpwatch-8e6e0a4/scripts/gen-pro-report.js :64
lines.push("```ts\nimport { execFile } from 'child_process';\nimport { promisify } from 'util';\nconst exec = promisify(execFile);\n// ❌ WRONG: exec(`bash -lc ${userInput}`)\n// ✅ RIGHT:\nawait exec('
network 4
- net lazymac2x-mcpwatch-8e6e0a4/packages/mcp-server/src/server.ts :176
const res = await fetch(url); - net (weak) lazymac2x-mcpwatch-8e6e0a4/packages/scanner/test/fixtures/vulnerable/server.ts :4
import fetch from "node-fetch"; - net (weak) lazymac2x-mcpwatch-8e6e0a4/scripts/gen-pro-report.js :7
const lb = await (await fetch("https://api.lazy-mac.com/mcpwatch/leaderboard")).json(); - net lazymac2x-mcpwatch-8e6e0a4/workers/crawler/src/index.ts :36
const res = await fetch(url, {
secrets 1
- secrets (weak) lazymac2x-mcpwatch-8e6e0a4/scripts/gen-pro-report.js :73
lines.push("```ts\nserver.tool('deploy', { inputSchema: z.object({ token: z.string() }) }, async ({ token }) => {\n if (token !== process.env.MCP_DEPLOY_TOKEN) throw new Error('unauthorized');\n //
perm:untrusted 1
- untrusted (weak) lazymac2x-mcpwatch-8e6e0a4/scripts/gen-pro-report.js :7
const lb = await (await fetch("https://api.lazy-mac.com/mcpwatch/leaderboard")).json();