From f4f32cc7420ce72a51b23dcaa9649dcfcf7a7e7c Mon Sep 17 00:00:00 2001 From: David McHale <35319750+dmchaledev@users.noreply.github.com> Date: Tue, 19 May 2026 12:13:21 -0600 Subject: [PATCH] docs: add dev.to launch post for mcp-security-scanner --- dev-to/launch-post.md | 73 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 dev-to/launch-post.md diff --git a/dev-to/launch-post.md b/dev-to/launch-post.md new file mode 100644 index 0000000..b173bee --- /dev/null +++ b/dev-to/launch-post.md @@ -0,0 +1,73 @@ +--- +title: "Your MCP Server Is Probably Overprivileged — Here's a Scanner For It" +published: false +description: MCP servers expose tools to LLMs, but most configs grant tools broader permissions than they need, ship without auth, and leak prompt-injection surface in tool descriptions. This scanner finds it before your model does. +tags: ai, security, llm, javascript +cover_image: +canonical_url: https://github.com/hailbytes/mcp-security-scanner +published_at: 2026-05-20 13:00 +0000 +--- + + + +Most MCP servers I've audited in the last few months had the same three issues: + +1. A `shell` or `fs` tool was scoped to the entire filesystem when the use case needed exactly one directory. +2. The transport ran without auth because the local-dev SSE config got promoted to prod. +3. Tool descriptions echoed verbatim into prompts with no sanitization — a perfect injection surface. + +[`@hailbytes/mcp-security-scanner`](https://www.npmjs.com/package/@hailbytes/mcp-security-scanner) is what I wish I'd had on day one of building MCP servers. It's a static + dynamic scanner for MCP configs and live endpoints that flags these patterns. + +## CLI + +```bash +# Scan a local config +npx @hailbytes/mcp-security-scanner ./mcp-config.json + +# Scan a live endpoint +npx @hailbytes/mcp-security-scanner https://my-mcp-server.example.com + +# SARIF output + fail the build +npx @hailbytes/mcp-security-scanner ./config.json --output=sarif --exit-code +``` + +## Programmatic + +```ts +import { scan } from "@hailbytes/mcp-security-scanner"; + +const report = await scan({ configPath: "./mcp-config.json" }); + +if (!report.passed) { + console.error(report.findings); + process.exit(1); +} +``` + +## What it checks + +- **Overprivileged tools** — broader permissions than the declared function needs (filesystem scope, shell access, network egress) +- **Missing or weak authentication** — unauthenticated transports, missing token validation, plaintext secrets in config +- **Prompt injection surface** — tool descriptions and output paths that pass through to model context without sanitization +- **Unsafe defaults** — insecure transport defaults, verbose error exposure, CORS wildcards + +The SARIF output drops straight into GitHub Code Scanning, so findings show up as alerts on PRs — same place your SAST results live. + +```bash +npm install -g @hailbytes/mcp-security-scanner +``` + +Source: [github.com/hailbytes/mcp-security-scanner](https://github.com/hailbytes/mcp-security-scanner) — MIT licensed. Pairs nicely with [`@hailbytes/mcp-server-template`](https://github.com/hailbytes/mcp-server-template) if you want a scaffold that comes up secure by default.