loading…
Search for a command to run...
loading…
A security filter that blocks dangerous code patterns by comparing normalized structural syntax trees against a blacklist of known threats using vector embeddin
A security filter that blocks dangerous code patterns by comparing normalized structural syntax trees against a blacklist of known threats using vector embeddings. It acts as a gatekeeper to prevent malicious code execution by identifying dangerous structures regardless of specific identifiers or literals.
PyPI Claude Desktop Tests Release Python 3.10+ License: MIT
Top Language Code Size Last Commit Repository Size
A structural similarity-based code security filter for MCP (Model Context Protocol). Blocks dangerous code patterns before they reach execution tools by comparing code structure against a blacklist of known-bad patterns.
flowchart LR
A[Code<br/>file/string] --> B[Parse & Normalize<br/>tree-sitter]
B --> C[Embed<br/>Ollama]
C --> D{Similarity Check<br/>vs Blacklist}
D -->|≥ threshold| E[🚫 BLOCKED]
D -->|< threshold| F[✅ ALLOWED]
F --> G[Execution Tools<br/>rlm_exec, etc.]
style E fill:#ff6b6b,color:#fff
style F fill:#51cf66,color:#fff
style D fill:#339af0,color:#fff
Code patterns like os.system("rm -rf /") and os.system("ls") have identical structure. By normalizing away the specific commands/identifiers, we can detect dangerous patterns regardless of the specific arguments used.
Security-sensitive identifiers are preserved during normalization (e.g., eval, exec, os, system, subprocess, Popen, shell) to ensure embeddings remain discriminative for dangerous patterns.
Option 1: PyPI (Recommended)
uvx code-firewall-mcp
# or
pip install code-firewall-mcp
Option 2: Claude Desktop One-Click
Download the .mcpb from Releases and double-click to install.
Option 3: From Source
git clone https://github.com/egoughnour/code-firewall-mcp.git
cd code-firewall-mcp
uv sync
Add to ~/.claude/.mcp.json (Claude Code) or claude_desktop_config.json (Claude Desktop):
{
"mcpServers": {
"code-firewall": {
"command": "uvx",
"args": ["code-firewall-mcp"],
"env": {
"FIREWALL_DATA_DIR": "~/.code-firewall",
"OLLAMA_URL": "http://localhost:11434"
}
}
}
}
Code Firewall can automatically install and configure Ollama on macOS with Apple Silicon. There are two installation methods:
# 1. Check system requirements
firewall_system_check()
# 2. Install via Homebrew
firewall_setup_ollama(install=True, start_service=True, pull_model=True)
What this does:
brew install ollama)# 1. Check system
firewall_system_check()
# 2. Install via direct download - no sudo, no Homebrew
firewall_setup_ollama_direct(install=True, start_service=True, pull_model=True)
What this does:
~/Applications/ (no admin needed)ollama serve# Install Ollama
brew install ollama
# or download from https://ollama.ai
# Start service
brew services start ollama
# or: ollama serve
# Pull embedding model
ollama pull nomic-embed-text
# Verify
firewall_ollama_status()
| Tool | Purpose |
|---|---|
firewall_system_check |
Check system requirements — verify macOS, Apple Silicon, RAM |
firewall_setup_ollama |
Install via Homebrew — managed service, auto-updates |
firewall_setup_ollama_direct |
Install via direct download — no sudo, fully headless |
firewall_ollama_status |
Check Ollama availability — verify embeddings are ready |
| Tool | Purpose |
|---|---|
firewall_check |
Check if a code file is safe to execute |
firewall_check_code |
Check code string directly (no file required) |
firewall_blacklist |
Add a dangerous pattern to the blacklist |
firewall_record_delta |
Record near-miss variants for classifier sharpening |
firewall_list_patterns |
List patterns in blacklist or delta collection |
firewall_remove_pattern |
Remove a pattern from blacklist or deltas |
firewall_status |
Get firewall status and statistics |
firewall_checkCheck if a code file is safe to pass to execution tools.
result = await firewall_check(file_path="/path/to/script.py")
# Returns: {allowed: bool, blocked: bool, similarity: float, ...}
firewall_check_codeCheck code string directly (no file required).
result = await firewall_check_code(
code="import os; os.system('rm -rf /')",
language="python"
)
firewall_blacklistAdd a dangerous pattern to the blacklist.
result = await firewall_blacklist(
code="os.system(arbitrary_command)",
reason="Arbitrary command execution",
severity="critical"
)
firewall_record_deltaRecord near-miss variants to sharpen the classifier.
result = await firewall_record_delta(
code="subprocess.run(['ls', '-la'])",
similar_to="abc123",
notes="Legitimate use case for file listing"
)
firewall_list_patternsList patterns in the blacklist or delta collection.
firewall_remove_patternRemove a pattern from blacklist or deltas.
firewall_statusGet firewall status and statistics.
Environment variables:
| Variable | Default | Description |
|---|---|---|
FIREWALL_DATA_DIR |
/tmp/code-firewall |
Data storage directory |
OLLAMA_URL |
http://localhost:11434 |
Ollama server URL |
EMBEDDING_MODEL |
nomic-embed-text |
Ollama embedding model |
SIMILARITY_THRESHOLD |
0.85 |
Block threshold (0-1) |
NEAR_MISS_THRESHOLD |
0.70 |
Near-miss recording threshold |
Use code-firewall-mcp as a gatekeeper before passing code to rlm_exec:
# 1. Check code safety
check = await firewall_check_code(user_code)
if check["blocked"]:
print(f"BLOCKED: {check['reason']}")
return
# 2. If allowed, proceed with execution
result = await rlm_exec(code=user_code, context_name="my-context")
Install massive-context-mcp with firewall integration:
pip install massive-context-mcp[firewall]
When enabled, rlm_exec automatically checks code against the firewall before execution.
The blacklist grows through use:
rlm_auto_analyze finds security issues, add patterns# After security audit finds issues
await firewall_blacklist(
code=dangerous_code,
reason="Command injection via subprocess",
severity="critical"
)
flowchart TD
subgraph Input
A1["os.system('rm -rf /')"]
A2["os.system('ls -la')"]
A3["os.system(user_cmd)"]
end
subgraph Normalization
B[Strip literals & identifiers<br/>Preserve security keywords]
end
subgraph Output
C["os.system('S')"]
end
A1 --> B
A2 --> B
A3 --> B
B --> C
style C fill:#ff922b,color:#fff
The normalizer strips:
my_var → _ (except security-sensitive ones)"hello" → "S"42 → NPreserved identifiers (for better pattern matching):
eval, exec, compile, __import__os, system, popen, subprocess, Popen, shellopen, read, write, socket, connectgetattr, setattr, __globals__, __builtins__Example:
# Original
subprocess.run(["curl", url, "-o", output_file])
# Normalized (preserves 'subprocess' and 'run')
subprocess.run(["S", _, "S", _])
Both subprocess.run(["curl", ...]) and subprocess.run(["wget", ...]) normalize to the same structure, so blacklisting one catches both.
MIT
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"code-firewall-mcp": {
"command": "npx",
"args": []
}
}
}PRs, issues, code search, CI status
Database, auth and storage
Reference / test server with prompts, resources, and tools.
Secure file operations with configurable access controls.