MCP security firewall: vet tool definitions before they reach the model.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
π Synced from a monorepo β but with a live history.
wardenmirrors the canonical AI-Factory monorepo. History here is append-only (no force-push). Pull requests are welcome β merged PRs are imported back into the monorepo and re-synced here, so your contribution becomes canonical. π¬ Issues Β· Pull requests both welcome.
π English Β· Π ΡΡΡΠΊΠΈΠΉ Β· EspaΓ±ol Β· FranΓ§ais Β· δΈζ Β· Glossary
One MCP server. Security firewall for advertised tool definitions. Library included.
Transport: stdio (npx -y @aimarket/warden / node dist/mcp-server.js). Compatible hosts:
Claude Desktop, Cursor, Glama, and any MCP client that speaks stdio. No API keys.
| Item | Location |
|---|---|
| MCP entrypoint (stdio) | warden-mcp β src/mcp-server.ts |
| Tools | vet_mcp_server, static_scan_tools, classify_sensitive_tools, check_egress_url, canonicalize_json, list_scan_rules |
| Library | import { Warden } from "@aimarket/warden" |
| Glama / Docker (stdio) | Dockerfile, glama.json |
| Official MCP Registry | server.json β io.github.alexar76/warden |
| Smithery | smithery.yaml |
An MCP server tells your agent what its tools do. The agent believes it β that sentence is the
attack surface. A tool description is prompt text delivered by a third party straight into your
model's context, and a schema field named api_key is a request for your secrets phrased as an API.
WARDEN vets a server before any of its tools reach the model, and returns a verdict you can record: allow/block, a 0..1 score, the findings that produced it, a per-tool partition, and the exact rule table that was in force.
Zero npm runtime dependencies. The library's only import is node:crypto. The stdio MCP
server adds other node: builtins (fs, path, process) and still pulls in no packages. It is
the firewall out of ARGUS, extracted so you can put it in front
of your own MCP host without adopting an agent.
Claude Desktop / Cursor (mcpServers entry):
The process never starts, proxies, or sandboxes another MCP server β you pass a tools/list dump
in, you get a verdict out.
| Tool | When to use |
|---|---|
vet_mcp_server | Full gate chain on a server identity + advertised tools |
static_scan_tools | Injection / exfil scan only (no origin / pinning / threat feed) |
classify_sensitive_tools | Operator glob split β not an injection scan |
check_egress_url | Hostname allowlist (empty list denies every host) |
canonicalize_json | RFC 8785 bytes for feeds and pins |
list_scan_rules | Published rule table + digest |
Glama TDQS: MCP annotations (readOnly / destructive / idempotent / openWorld), when-to-use /
when-not naming siblings, every inputSchema property described, outputSchema on every tool.
Listing: glama.ai/mcp/servers/alexar76/warden Β· quality score: glama.ai/mcp/servers/alexar76/warden/score
Same pattern as ARGUS and
aimarket-mcp: repo-root glama.json +
Dockerfile + node dist/mcp-server.js. Admin form values: docs/GLAMA.md.
vet() performs no network I/O. The only request WARDEN ever makes is the threat-feed fetch you
asked for by passing a URL to load().
| Gate | What it decides | Network | Fatal? |
|---|---|---|---|
| static-scan | Injection, exfiltration, credential requests and hidden-Unicode/base64 tells in the tool name, its description and its inputSchema β 25 rules, v4, of which 15 can block and 10 are advisory-only, 17 also cover the name, and 12 carry a context guard | none | no |
| threat-feed | Known-bad server identity or tool, from 11 built-in records plus an optional signed feed | only the feed fetch | yes, for a server-scoped critical |
| origin | Whether the operator declared this server or it arrived from a remote catalog | none | yes, under allowUnknownServers: false |
| pinning | Whether the tool defs still match what the user approved | none | yes, under pinToolDefs: true |
The composite score is the product of gate contributions, so one bad gate drags the whole server
down rather than being averaged away. Severity and blocking are separate axes: an advisory finding
is reported and never blocks and never costs a tool, at any blockAtSeverity β because "how much
attention does this deserve" and "is this a defect at all" are different questions, and encoding the
second as a low severity made it blocking again for anyone who tightened the threshold.
rulesets is not decoration. The same server scores differently under a later rule table, and
without the version and a digest over the rules there is no way to tell that apart from the server
having changed. A stored scan without them is not reproducible.
WARDEN will not read an unsigned remote feed. The contract is deliberately boring:
Three properties are checked, and any failure keeps the built-in floor rather than degrading to no protection:
feedPublicKey);maxAgeMs (24 h by default), so whoever
serves the URL cannot replay a months-old snapshot and silently erase every record added since.
A signature says who wrote a document, never when you were handed it;No reviews yet β be the first to share how this listing worked for you.
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/warden-mcp-security-firewall)<a href="https://allmcps.com/mcp/warden-mcp-security-firewall"><img src="https://allmcps.com/api/badge/warden-mcp-security-firewall?style=directory" alt="WARDEN β MCP Security Firewall on AllMCPs" /></a>