Getting Started
Pick your use case — each takes under 5 minutes.
A. Scan MCP servers for vulnerabilities (munio scan)
Section titled “A. Scan MCP servers for vulnerabilities (munio scan)”pipx install munioScan a server by command
Section titled “Scan a server by command”munio scan --server "npx -y @modelcontextprotocol/server-filesystem /tmp"8 scan layers (L1 schema, L2 heuristic, L2.5/L2.6 ML classifiers, L3 static, L4 Z3 formal, L5 compositional, L7 source) detect prompt injection, path traversal, SSRF, command injection, and cross-tool data flows.
Scan from a config file
Section titled “Scan from a config file”munio scan --config ~/.cursor/mcp.jsonAuto-discover configs
Section titled “Auto-discover configs”munio scan # Discovers configs from Claude Desktop, Cursor, Windsurf, VS CodeMachine-readable output
Section titled “Machine-readable output”# JSONmunio scan --server "..." --format json
# SARIF 2.1.0 (GitHub Code Scanning, VS Code SARIF Viewer)munio scan --server "..." --format sarif -O report.sarifDetailed findings
Section titled “Detailed findings”munio scan --server "..." --details # Tool names, fixes, Z3 counterexamplesB. Scan configs for supply chain risks (munio config-scan)
Section titled “B. Scan configs for supply chain risks (munio config-scan)”Static analysis of MCP config files — no server connections needed.
munio config-scanAuto-discovers configs from known client locations. Or scan a specific file:
munio config-scan --config ~/.cursor/mcp.jsonWhat it finds
Section titled “What it finds”10 checks (SC_001 through SC_010):
| Check | Risk |
|---|---|
| SC_001 | Unpinned npm/bunx packages (dependency hijack) |
| SC_002 | Dangerous environment variables |
| SC_003 | Typosquatting of known MCP packages |
| SC_004 | Unscoped npm packages (higher hijack risk) |
| SC_005 | Shell metacharacters in command arguments |
| SC_006 | Absolute path binaries in command |
| SC_007 | Unencrypted HTTP URLs |
| SC_008 | Docker images without digest pinning |
| SC_009 | Hardcoded credentials in env values |
| SC_010 | Insecure file permissions |
munio config-scan --details # Fix suggestions per servermunio config-scan --trust-project # Include project-level configsmunio config-scan --format sarif -O config-report.sarif # SARIF outputC. Analyze cross-server attack chains (munio compose)
Section titled “C. Analyze cross-server attack chains (munio compose)”Detect multi-hop attack chains that span MCP server boundaries.
# From pre-fetched schemasmunio compose --schemas-dir ./schemas
# From a config file (connects to servers)munio compose --config ~/.cursor/mcp.jsonOutput formats
Section titled “Output formats”munio compose --schemas-dir ./schemas --format markdown # For PRs/issuesmunio compose --schemas-dir ./schemas --format json -O chains.jsonSignal quality
Section titled “Signal quality”Findings include signal quality: high (confirmed dangerous data flow), medium (plausible chain), low (theoretical). Use --details to see chain details and capability classifications.
D. Protect at runtime (munio gate)
Section titled “D. Protect at runtime (munio gate)”Add a verification proxy between your MCP client and any MCP server. Zero code changes.
Auto-wrap with munio init
Section titled “Auto-wrap with munio init”# See current MCP server statusmunio status
# Auto-wrap all discovered serversmunio init
# Undo changesmunio restoremunio init edits MCP client configs (Claude Desktop, Cursor, etc.) to route server commands through the munio gate proxy.
Manual wrapping
Section titled “Manual wrapping”Prefix the server command with munio gate -- in your MCP client config:
{ "mcpServers": { "filesystem": { "command": "munio", "args": [ "gate", "--", "npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp" ] } }}Every tools/call is verified against YAML constraints. Dangerous calls are blocked. Safe calls pass through with sub-millisecond overhead.
Gate options
Section titled “Gate options”munio gate --packs generic,filesystem -- npx @server # Specific constraint packsmunio gate --mode shadow -- npx @server # Log only, do not blockmunio gate --log /tmp/munio.jsonl -- npx @server # JSON audit logmunio stats # Runtime statisticsE. Embed in code (Guard API)
Section titled “E. Embed in code (Guard API)”Python API
Section titled “Python API”from munio import Guard
guard = Guard(constraints="generic")
result = guard.check(tool="http_request", args={"url": "https://evil.com/steal"})result.allowed # Falseresult.violations # [Violation(message="URL contains blocked domain", ...)]Framework adapters
Section titled “Framework adapters”Wrappers for LangChain, CrewAI, OpenAI Agents SDK, and MCP:
from munio.adapters import langchain_tool_wrapper, crewai_tool_wrapper
safe_tool = langchain_tool_wrapper(my_tool, guard)CLI single-check
Section titled “CLI single-check”munio check '{"tool": "exec", "args": {"command": "rm -rf /"}}' -c genericHTTP API
Section titled “HTTP API”munio serve --host 0.0.0.0 --port 8000# POST /verify with {"tool": "exec", "arguments": {"command": "rm -rf /"}}F. Constraint format
Section titled “F. Constraint format”All verification uses the same YAML constraint format:
name: block-dangerous-urlscategory: ASI02action: http_requestcheck: type: denylist field: url values: ["evil.com", "169.254.169.254", "metadata.google.internal"] match: containson_violation: blockseverity: criticalCheck types
Section titled “Check types”| Type | Description |
|---|---|
denylist | Block if field matches any value |
allowlist | Block if field does NOT match any value |
threshold | Block if numeric field exceeds bounds |
regex_deny | Block if field matches regex pattern |
regex_allow | Block if field does NOT match regex |
composite | Multi-variable arithmetic expression |
rate_limit | Block if call rate exceeds limit in time window |
sequence_deny | Block if tool call sequence matches banned pattern |
See Constraint Authoring for the full guide.
Next steps
Section titled “Next steps”- Scan Layers — how the 8-layer analysis works
- Gate Guide — all gate CLI and YAML options
- Architecture — verification pipeline design
- Constraint Authoring — write your own rules
- Security Model — threat model and hardening
- CLI Reference — all commands and flags