Armor
About
Drop-in Rust sidecar for MCP servers — scans tool calls for prompt injection, validates Ed25519 manifest signatures, blocks marketplace-poisoning vectors. <5ms p99 overhead. Defense against OX Security MCP advisory (10+ CVEs, April 2026).
Details
- Author
- studiomeyer-io
- GitHub stars
- 1
- Downloads
- 202
- Categories
- Other
Jump to
- off — disabled
- Dynamic linker: LD_PRELOAD, LD_LIBRARY_PATH, DYLD_INSERT_LIBRARIES, DYLD_LIBRARY_PATH
- Language runtime: NODE_OPTIONS, PYTHONPATH, JAVA_TOOL_OPTIONS
- mcp-armor (this one) — runtime defense sidecar: scans tool calls, verifies signed manifests, blocks known-bad CVEs
- mcp-herald — static migration linter for the MCP 2026-07-28 spec
The README includes setup instructions such as mcp-armor wrap -- npx -y @modelcontextprotocol/server-filesystem /tmp.
mcp-armor
Drop-in Rust sidecar that wraps any MCP server. Scans tool calls for prompt injection, validates Ed25519 manifest signatures (with TOFU keystore + Sigstore Rekor bridge since v0.2), exports OTLP gRPC telemetry (on opentelemetry 0.30 since v0.4 — closes the shutdown-hang class), blocks marketplace-poisoning vectors, strips loader-class env keys from spawned children (LD_PRELOAD, NODE_OPTIONS, … — new in v0.3), folds Unicode confusables to detect homoglyph evasion (Cyrillic іgnоrе ≈ ignore — new in v0.3), strips ANSI/terminal escape sequences and flags tool-name homoglyph collisions on tools/call (both new in v0.7), and — new in v0.8 — scans every tools/list catalog for tool-description / full-schema poisoning (model-directed instructions hidden in a tool's description or its parameter schema — the first-sight poisoning Layer 7 drift can't see) plus a directory-traversal argument pattern. Single signed binary, p99 budget under 5 ms (enforced in CI).
> Anthropic has classified the underlying MCP-design issues (auto-invoke, marketplace tool-list trust, no manifest signing) as out-of-scope for the spec. mcp-armor implements the runtime defenses they declined to spec.
mcp-armor sits between an MCP client (Claude Desktop, Windsurf, Cursor) and an upstream server. JSON-RPC traffic flows through a four-stage scanner (Aho-Corasick prefilter → regex stage → NFKC + zero-width + Bidi + tag-unicode strip → re-scan → UTS-39 confusable skeleton fold → re-scan). Block decisions are recorded to an in-memory ring buffer, and the read-only control-plane MCP server surfaces the audit history back to the client. On wrap, loader-class env keys (LD_PRELOAD, NODE_OPTIONS, PYTHONPATH, …) are stripped from the child process before spawn().
Sister project: studiomeyer-io/ai-shield — TypeScript policy engine that mcp-armor's evasion patterns are ported from (Round 4 zero-width + tag-unicode work).
A note from us
We have been building tools and systems for ourselves for the past two years. The fact that this repo is small and has few stars is not because it is new. It is because we only just decided to share what we have built. It is not a fresh experiment, it is a long story with a recent commit.
We love building things and sharing them. We do not love social media tactics, growth hacks, or chasing stars and followers. So this repo is small. The code is real, it gets used, issues get answered. Judge for yourself.
If it helps you, sharing, testing, and feedback help us. If it could be better, an issue is more useful. If you build something with it, tell us at hello@studiomeyer.io. That genuinely makes our day.
From a small studio in Palma de Mallorca.
Install
Pre-built binaries (signed via cosign):
gh release download --repo studiomeyer-io/mcp-armor --pattern 'mcp-armor--x86_64-unknown-linux-musl.tar.gz'
tar xf mcp-armor--x86_64-unknown-linux-musl.tar.gz
sudo install mcp-armor /usr/local/bin/
Or from source:
```sh
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.



