Statically audits MCP tool surfaces for token cost, schema quality, and design issues.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Static, design-level linting for MCP tool surfaces. Deterministic, offline, and it never calls an LLM.
This is a monorepo:
| Package | What it is |
|---|---|
packages/core | The linter β 19 rules, the scoring engine, and the mcplint CLI (mcp-surface-lint on npm). Publishable to npm. |
apps/web | The hosted playground: paste a tools/list dump or point it at a remote MCP URL, get a score and an audit. |
The web app runs with no cloud accounts configured: reports are held in memory, rate limiting is off,
and no analytics are sent. Copy apps/web/.env.example to .env.local to wire up the real services.
See DEPLOYMENT.md for the production account, migration, publishing, and smoke-test
checklist.
Production releases are semver Git tags (bare X.Y.Z, no v prefix β see .npmrc). From a clean
main branch:
That bumps the root version, runs preversion (npm run typecheck), then the version lifecycle
syncs mcp-surface-lint and @mcplint/web to the same semver, stages workspace package.json files and
package-lock.json, commits, and tags. postversion pushes the branch and tags to origin.
When only the web app or CLI changed, you may want a partial bump. The default version hook syncs
all workspaces to the root version, so partial bumps need --ignore-scripts and manual staging:
The release tag still follows the root version; deploy always runs, and npm/Registry publication is
skipped when packages/core was not bumped.
npm version has no --dry-run; inspect npm help version or run on a throwaway clone before
cutting a real release.
Full runbook: DEPLOYMENT.md.
See packages/core/README.md for the full CLI, config, and scoring model,
and packages/core/docs/rules.md for the rule catalogue.
The web app also serves a stateless Streamable HTTP MCP endpoint at /api/mcp. It exposes one
read-only tool, check_mcp_server, which accepts either a public HTTPS MCP URL (plus optional
headers) or an inline tools/list snapshot. The result includes structured composite/category
scores, footprint stats, and findings.
Each protocol request gets a fresh MCP server and transport. Tool inputs and captured schemas are
not written to the report store. See /install in the running web app for current Cursor, VS Code,
Claude, Windsurf, and generic client configurations.
apps/web/lib/ssrf.ts): https only, every
resolved address must be public unicast, the socket is pinned to the vetted IP so DNS rebinding
cannot move it, and redirects are re-validated at every hop.noindex, deleted after 30 days unless
the owner opts them public. Anyone with an unlisted URL can view it.GATE_FINDINGS flag and projectReport() exist so a paid tier could
withhold the audit while leaving the score free. It is off, and no billing exists.Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/mcplint)<a href="https://allmcps.com/mcp/mcplint"><img src="https://allmcps.com/api/badge/mcplint?style=directory" alt="Mcplint on AllMCPs" /></a>