Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Structural similarity-based code filter. Stops malicious code pattern reaching execution tools.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
FIREWALL_DATA_DIR, OLLAMA_URL, EMBEDDING_MODEL, SIMILARITY_THRESHOLD你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
链接指向作者自己的文件;我们不托管也不重新打包它。打开文件后,Claude Desktop 会进行安装。
在终端中运行这条命令
claude mcp add code-firewall --env FIREWALL_DATA_DIR=your-value --env OLLAMA_URL=your-value --env EMBEDDING_MODEL=your-value --env SIMILARITY_THRESHOLD=your-value -- uvx code-firewall-mcp运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"code-firewall": {
"command": "uvx",
"args": [
"code-firewall-mcp"
],
"env": {
"FIREWALL_DATA_DIR": "your-value",
"OLLAMA_URL": "your-value",
"EMBEDDING_MODEL": "your-value",
"SIMILARITY_THRESHOLD": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"code-firewall": {
"type": "stdio",
"command": "uvx",
"args": [
"code-firewall-mcp"
],
"env": {
"FIREWALL_DATA_DIR": "your-value",
"OLLAMA_URL": "your-value",
"EMBEDDING_MODEL": "your-value",
"SIMILARITY_THRESHOLD": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
FIREWALL_DATA_DIR envOLLAMA_URL envEMBEDDING_MODEL envSIMILARITY_THRESHOLD env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日
注册名称已通过 GitHub 账户 egoughnour 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(0.7.0)于10个月前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv), MCPB。
同一分类中有:Spec Driven Development, Remote Desktop Commander, FlyDocs
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Spec-driven development workflow: your agent works issues, sessions and the status lifecycle.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
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 file/string] --> B[Parse & Normalize tree-sitter] B --> C[Embed Ollama] C --> D{Similarity Check vs Blacklist} D -->|≥ threshold| E[🚫 BLOCKED] D -->|< threshold| F[✅ ALLOWED] F --> G[Execution Tools 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
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()
firewall_setup_ollama(install=True, start_service=True, pull_model=True)
What this does:
brew install ollama)# 1. Check system
firewall_system_check()
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
brew services start ollama
ollama pull nomic-embed-text
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")
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
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 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])
subprocess.run(["S", _, "S", _])
Both subprocess.run(["curl", ...]) and subprocess.run(["wget", ...]) normalize to the same structure, so blacklisting one catches both.
MIT