Firewalla Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Firewalla Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A read-only Model Context Protocol (MCP) server that connects to your Firewalla Gold via its local API — no MSP subscription required.
Built for AI-powered network security monitoring. Connect it to Claude Code, Claude Desktop, or any MCP-compatible client and query your firewall's alarms, devices, traffic flows, and network stats using natural language.
| Tool | Description |
|---|---|
get_devices | List all network devices (name, IP, MAC, manufacturer, last active) |
get_top_talkers | Devices ranked by bandwidth usage (download, upload, total bytes) |
get_clients_by_network | Devices grouped by network segment/VLAN |
get_offline_devices | Devices that recently went offline (configurable lookback window) |
get_device_flows | Recent network flows for a specific device (by MAC address) |
search_flows | Search individual flow records with filters (domain, IP, port, category, time range) |
get_dns_queries | DNS query logs — every domain a device resolved (more complete than flow data) |
| Tool | Description |
|---|---|
get_alarms | Security alarms with filtering by severity, type, and device |
get_audit_logs | Blocked/allowed traffic decisions — see what your firewall rules caught |
get_rules | Firewall rules/policies with filtering by action/target, summary counts, disabled rule toggle |
get_target_lists | Block/allow target lists (custom domain lists, IP lists, and associated rules) |
get_features | Enabled/disabled features, global + per-network policy overrides, DoH status, vulnerability scan results |
| Tool | Description |
|---|---|
get_network_status | Ping/health check — is the Firewalla box alive? |
get_network_stats | Monthly bandwidth, speed test results, network monitor data |
get_network_performance | WAN latency, packet loss, DNS response times, connection quality |
get_wan_usage | Per-WAN bandwidth breakdown (download/upload per interface) |
get_vlans | Network segments, VLANs, WAN config, and network groups (sensitive data redacted) |
get_system_info | Firmware version, model, uptime, public IP, CPU/memory usage |
get_vpn_status | VPN connections — WireGuard, OpenVPN, mesh profiles and connected clients |
git clone https://github.com/scott-pallas/firewalla-mcp.git
cd firewalla-mcp
npm install
npm run buildBefore the MCP server can talk to your Firewalla, you need to generate an authentication keypair (ETP token). This is the same pairing mechanism the Firewalla mobile app uses — think of it as registering a new "device" with your Firewalla box.
This step uses a separate utility called firewalla-tools. It is not a dependency of this project — you only need it once to generate your .pem key files. After pairing is complete, you can delete it.
git clone https://github.com/lesleyxyz/firewalla-tools.git
cd firewalla-tools
npm installIn the Firewalla app on your phone:
The pairing tool needs the JSON data encoded in the QR code. To get it:
{"gid":"...","seed":"...","license":"...","ek":"...","ipaddress":"..."}From the firewalla-tools directory:
cd create-etp-token
node index.jsThe tool will prompt you for:
[email protected]), used for display in the Firewalla app10.0.1.1 — this is usually your default gateway)This generates etp.public.pem and etp.private.pem in the current directory.
Tip: To find your Firewalla's IP, run netstat -rn | grep default — the gateway IP is your Firewalla.Move the .pem files somewhere secure:
mkdir -p ~/.firewalla
mv etp.public.pem etp.private.pem ~/.firewalla/
chmod 600 ~/.firewalla/*.pemKeep these files safe — they are your authentication credentials.
You no longer need firewalla-tools — feel free to delete it:
cd ../..
rm -rf firewalla-toolsAdd the server to your global config (~/.claude.json) under mcpServers:
{
"mcpServers": {
"firewalla": {
"type": "stdio",
"command": "node",
"args": ["/path/to/firewalla-mcp/dist/index.js"],
"env": {
"FIREWALLA_IP": "10.0.1.1",
"FIREWALLA_PUBLIC_KEY_PATH": "/Users/yourname/.firewalla/etp.public.pem",
"FIREWALLA_PRIVATE_KEY_PATH": "/Users/yourname/.firewalla/etp.private.pem"
}
}
}
}Then restart Claude Code. The Firewalla tools will be available in all sessions.
Add to your claude_desktop_config.json:
{
"mcpServers": {
"firewalla": {
"command": "node",
"args": ["/path/to/firewalla-mcp/dist/index.js"],
"env": {
"FIREWALLA_IP": "10.0.1.1",
"FIREWALLA_PUBLIC_KEY_PATH": "/Users/yourname/.firewalla/etp.public.pem",
"FIREWALLA_PRIVATE_KEY_PATH": "/Users/yourname/.firewalla/etp.private.pem"
}
}
}
}FIREWALLA_IP=10.0.1.1 \
FIREWALLA_PUBLIC_KEY_PATH=~/.firewalla/etp.public.pem \
FIREWALLA_PRIVATE_KEY_PATH=~/.firewalla/etp.private.pem \
npx @modelcontextprotocol/inspector node dist/index.js| Variable | Required | Default | Description |
|---|---|---|---|
FIREWALLA_PUBLIC_KEY_PATH | Yes | — | Path to etp.public.pem |
FIREWALLA_PRIVATE_KEY_PATH | Yes | — | Path to etp.private.pem |
FIREWALLA_IP | No | 10.0.1.1 | Your Firewalla's IP address |
Once connected to an MCP client, try:
firewalla-mcp/
├── src/
│ ├── index.ts # MCP server entry (stdio transport)
│ ├── firewalla-client.ts # Firewalla local API wrapper
│ └── tools/
│ ├── alarms.ts # get_alarms
│ ├── devices.ts # get_devices, get_top_talkers, get_clients_by_network, get_offline_devices
│ ├── dns.ts # get_dns_queries
│ ├── flows.ts # get_device_flows, search_flows, get_audit_logs
│ ├── network.ts # get_network_status, get_network_stats, get_network_performance, get_wan_usage
│ ├── rules.ts # get_rules, get_features, get_target_lists
│ ├── system.ts # get_system_info
│ ├── vlans.ts # get_vlans
│ └── vpn.ts # get_vpn_status
├── dist/ # Compiled JS (after build)
├── package.json
├── tsconfig.json
└── CLAUDE.md # AI agent project speccount parameters are clamped to a max of 5000 to prevent excessive data retrievalMIT — see LICENSE
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.