github analyzed 8e6e0a4

lazymac2x/mcpwatch

github

Audit MCP servers from inside Claude Code. 10 OWASP checks, A-F grade, live leaderboard.

maintainer
lazymac2x
license
first seen
2026-08-13
last seen
2026-08-13
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 4 tools
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

code evidence vHEAD · github-tarball
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();