Skip to main content

MCP Firewall Proxy — policy-based tool access control using NAIL effects

Project description

mcp-fw

MCP servers can read your files, run processes, and access the network — all without asking.

mcp-fw is a firewall proxy that sits between Claude Desktop and MCP servers. It uses NAIL effect labels to control exactly what each server can do.

Claude Desktop  ←→  mcp-fw (proxy)  ←→  MCP Server
                     ↑
                  policy.yaml
                  allow: [FS, IO]
                  deny:  [NET]

Why

MCP servers are powerful — but there's no built-in permission model. A filesystem server could silently make network calls. An "everything" server could spawn processes.

mcp-fw enforces boundaries:

Effect What it controls Example
FS File read/write Read a file, list directory
IO General I/O stdin/stdout, echo
NET Network access HTTP requests, DNS
PROC Process execution Spawn subprocess, exec
TIME Time/clock access Get current time
RAND Randomness Generate random numbers

Quick Start

pip install mcp-fw

1. Write a policy

# policy.yaml
servers:
  filesystem:
    command: npx
    args: ["@modelcontextprotocol/server-filesystem", "/tmp"]
    allow: [FS, IO]
    deny: [NET]

This lets the filesystem server read/write files (FS, IO) but blocks all network access (NET).

2. Point Claude Desktop to the proxy

In claude_desktop_config.json:

{
  "mcpServers": {
    "filesystem-fw": {
      "command": "mcp-fw",
      "args": ["--config", "/path/to/policy.yaml", "--server", "filesystem"]
    }
  }
}

That's it. Claude Desktop now talks to mcp-fw, which filters tools before forwarding to the real server.

3. See what happened

$ mcp-fw --config policy.yaml --server filesystem --verbose
2025-01-15 10:00:01 [INFO] Filtered 5 → 3 tools (allowed effects: ['FS', 'IO'])
2025-01-15 10:00:05 [WARNING] Blocked tool call: fetch_url

Menubar App (macOS)

For a GUI experience:

pip install "mcp-fw[menubar]"
mcp-fw-menubar --config policy.yaml

A [FW] icon appears in your menubar:

[FW]
├── mcp-fw v0.1.0
├── ────────
├── ● filesystem
│   ├── Status: Running
│   ├── ────────
│   ├── [x] FS
│   ├── [x] IO
│   ├── [ ] NET          ← toggle effects live
│   ├── [ ] PROC
│   └── ...
├── ○ everything
├── ────────
├── Edit Policy YAML
├── View Logs...
├── ────────
├── Sync to Claude Desktop
└── Quit
  • Toggle effects with checkboxes — changes are written to policy.yaml instantly
  • Sync to Claude Desktop generates claude_desktop_config.json entries automatically
  • View Logs opens a live log viewer
  • Process monitor shows ● running / ○ stopped status per server

How It Works

1. Claude calls list_tools()
   → mcp-fw forwards to the real server
   → NAIL annotates each tool with effect labels
   → mcp-fw filters out tools that violate the policy
   → Claude only sees allowed tools

2. Claude calls a tool
   → mcp-fw checks if it's in the allowed set
   → Allowed: forward to server
   → Blocked: return error

The key insight: tools aren't just allowed or denied by name — they're classified by what they do (filesystem, network, process, etc.) using NAIL's effect system. This means mcp-fw can enforce policies on servers it has never seen before.

Policy Reference

servers:
  my-server:
    command: npx                    # server command
    args: ["@org/server", "/tmp"]   # command arguments
    allow: [FS, IO]                 # permitted effects (empty = all)
    deny: [NET]                     # blocked effects (overrides allow)
    tool_overrides:                 # per-tool effect corrections
      safe_fetch: [IO]             # override NAIL's auto-detection

Rules:

  • allow: [] (empty) = all effects permitted, then deny subtracts
  • allow: [FS, IO] = only these effects, then deny subtracts
  • deny always wins over allow
  • tool_overrides lets you correct NAIL's automatic effect detection for specific tools

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mcp_fw-0.1.0.tar.gz (14.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mcp_fw-0.1.0-py3-none-any.whl (16.7 kB view details)

Uploaded Python 3

File details

Details for the file mcp_fw-0.1.0.tar.gz.

File metadata

  • Download URL: mcp_fw-0.1.0.tar.gz
  • Upload date:
  • Size: 14.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for mcp_fw-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3a38d9caf2d3cad93ed97956e8c94d264b4514f90d4a3220000b7447104745f0
MD5 ddd7c38a96417316d5401ce356bc17e9
BLAKE2b-256 e817f1140bf7cfa8b902bb196ca7726c857edfafd7904f39c418c004090d408e

See more details on using hashes here.

File details

Details for the file mcp_fw-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mcp_fw-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 16.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for mcp_fw-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f70834f238da8408d8d6c2e4bce4e1d6f0c0be69e8986745468b2b1450e4e3e8
MD5 a8690bfec0f8f0b063d219e4b0230a6f
BLAKE2b-256 177e8a9fc78bf3866acc83b2541531975ad0d39763170e7f9168a53bce021e5c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page