FirewallaSAFE
Firewalla MCP Server - Claude integration for network security monitoring and firewall management
Overview
Firewalla MCP Server - Claude integration for network security monitoring and firewall management
ebfb0b4d2238OBSERVED · 2026-10-08Connect
Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.
claude mcp add firewalla-mcp-server --env FIREWALLA_MSP_TOKEN=${FIREWALLA_MSP_TOKEN} -- npx -y [email protected]{
"mcpServers": {
"firewalla-mcp-server": {
"command": "npx",
"args": [
"-y",
"[email protected]"
],
"env": {
"FIREWALLA_MSP_TOKEN": "${FIREWALLA_MSP_TOKEN}"
}
}
}
}Exposed tools (41)
30 read · 8 write · 3 destructive. Blast radius: 3 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.
| Tool | Risk | Description |
|---|---|---|
archive_alarm | read | Archive an alarm (MSP 2.11.0 or later): it leaves the active alarms. It creates no silence exception, so future matching traffic can still raise new alarms (mute_alarm silences them). Alarm IDs are per box: pass gid (the alarm |
bandwidth_analysis | read | Top bandwidth consumers and usage patterns |
create_rule | write | Create a new firewall rule (block or allow) on one box (POST /v2/rules), with optional device/group/network scope and cron schedule. Each call adds another rule; delete_rule removes one. Uses gid, else FIREWALLA_BOX_ID or FIREWALLA_DEFAULT_BOX_ID, else the account |
create_target_list | write | Create a new target list (POST /v2/target-lists); each call creates another list. owner global makes it shareable across all boxes, a box GID ties it to that box. ${USER_REQUEST_ONLY} |
delete_alarm | destructive | Delete an alarm permanently (DELETE /v2/alarms/{gid}/{aid}); it cannot be undone. archive_alarm keeps the alarm instead, among the archived alarms (status:2); the API has no unarchive. The alarm is read first, and an alarm that is not there sends no DELETE. Alarm IDs are per box: pass gid (the alarm |
delete_rule | destructive | Permanently delete a firewall rule (DELETE /v2/rules/{id}; cannot be undone; MSP 2.11.0+). Checks the rule exists first and sends nothing for an unknown ID. Use pause_rule for a temporary disable. ${USER_REQUEST_ONLY} |
delete_target_list | destructive | Permanently delete a target list (DELETE /v2/target-lists/{id}); cannot be undone. The tool does not check whether a rule still targets the list. ${USER_REQUEST_ONLY} |
device_id | read | Device ID (MAC) to investigate |
device_investigation | read | Investigate a specific device: flows, alarms, behavior |
get_access_point_channels | read | Get active frequency channels and DFS radar states for an Access Point across 2.4G, 5G, and 6G bands (GET /v2/boxes/{gid}/wifi/access-points/{ap_id}/channels). Uses box, else FIREWALLA_BOX_ID or FIREWALLA_DEFAULT_BOX_ID, else the account |
get_bandwidth_usage | write | Top devices by upload plus download over the period, summed client-side from up to 10 times limit (1,000 at most) of the period |
get_boxes | read | List the Firewalla boxes this MSP token can see (GET /v2/boxes, optionally one box group), with online status, model and version. Not limited by FIREWALLA_BOX_ID. |
get_device_status | read | Check online/offline status of devices on the Firewalla network. Reads the device list from GET /v2/devices (box, else FIREWALLA_BOX_ID, else every box; group limits it to a box group) and returns up to limit devices, sorted by name. |
get_flow_insights | read | Get category-based flow analysis for a period: top content categories and their domains, top devices by bandwidth, and optionally blocked traffic. Ideal for answering questions like |
get_network_rules | read | Retrieve firewall rules and conditions (GET /v2/rules). The API returns every matching rule; the tool returns the first limit. Scoped to FIREWALLA_BOX_ID when set, otherwise every box. |
get_network_rules_summary | read | Get overview counts of network rules by action, direction, status and target type (convenience wrapper): reads the rules from GET /v2/rules and counts them locally. Scoped to FIREWALLA_BOX_ID when set, otherwise every box. |
get_offline_devices | read | List offline devices from the full device list (GET /v2/devices), most recently seen first by default, up to limit; total_offline_devices counts all of them. Scoped to box, else FIREWALLA_BOX_ID, else every box. |
get_recent_flow_activity | read | Get a snapshot of the 50 most recent network flows (one GET /v2/flows request) with protocol, region and blocked/allowed counts; the minutes they span depend on how busy the network is. Use this for: |
get_simple_statistics | read | Get account-wide counts from GET /v2/stats/simple: online boxes, offline boxes, alarms and rules, optionally for one box group. Not limited by FIREWALLA_BOX_ID. |
get_specific_alarm | read | Get detailed information for one Firewalla alarm (GET /v2/alarms/{gid}/{aid}). Alarm IDs are per box: pass gid on a multi-box account, or each box is checked, one request per box, until one has the alarm. |
get_specific_target_list | read | Retrieve one target list by ID, including its targets (GET /v2/target-lists/{id}). |
get_statistics_by_box | read | Top boxes by blocked flows (the default) or by Security Activity alarms, from GET /v2/stats/{type}, with each box |
get_statistics_by_region | read | Top regions by blocked flows, from GET /v2/stats/topRegionsByBlockedFlows, optionally for one box group; the API returned no more than 5 regions. Not limited by FIREWALLA_BOX_ID. |
get_target_lists | read | Retrieve target lists (GET /v2/target-lists). Without owner the API returns the MSP |
get_wifi_networks | read | List configured Wi-Fi SSIDs, encryption standards (WPA2/WPA3), and broadcast frequency bands (GET /v2/boxes/{gid}/wifi/networks). Uses box, else FIREWALLA_BOX_ID or FIREWALLA_DEFAULT_BOX_ID, else the account |
get_wifi_settings | read | Get Firewalla Wi-Fi Controller settings including client auto-steering and controller version (GET /v2/boxes/{gid}/wifi/settings). Uses box, else FIREWALLA_BOX_ID or FIREWALLA_DEFAULT_BOX_ID, else the account |
lookback_hours | read | Hours of history to inspect (default 24) |
mute_alarm | write | Mute an alarm (MSP 2.11.0 or later): the API archives it and has the box create a lasting silence exception, so future alarms matching the target within the scope are no longer raised. target_type alarmType silences every future alarm of this alarm |
network_health_check | read | Overall network health: summary, devices, metrics, topology, rules |
pause_rule | write | Pause an active firewall rule on the box until resume_rule reactivates it (POST /v2/rules/{id}/pause, no body). The MSP API takes no duration, so the pause does not expire on its own. Checks the rule |
period | read | Report period: |
rename_device | write | Rename a network device (PATCH /v2/boxes/{gid}/devices/{id}; the only device field the MSP API allows changing; 32 characters max). Uses gid, else FIREWALLA_BOX_ID or FIREWALLA_DEFAULT_BOX_ID, else the account |
resume_rule | write | Resume a paused firewall rule on the box, restoring it to active (POST /v2/rules/{id}/resume, no body). Checks the rule |
search_devices | read | Search devices by name, IP, MAC or status (convenience wrapper with client-side filtering): reads the device list from GET /v2/devices (box, else FIREWALLA_BOX_ID, else every box) and filters it locally. |
search_flows | read | Search network flows with advanced query filters. Use this for: historical analysis, specific time ranges, complex filtering, or when you need more than 50 flows. Supports pagination, time-based queries (e.g., |
search_rules | read | Search firewall rules by target, action or status; the MSP API applies the query (GET /v2/rules). Supports all rule fields. Scoped to FIREWALLA_BOX_ID when set, otherwise every box. |
search_target_lists | read | Search target lists (convenience wrapper with client-side filtering): reads GET /v2/target-lists, sending owner if given (without it, the global and Firewalla-managed lists), and applies the query locally. |
security_report | read | Comprehensive security report for a time period |
threat_analysis | read | Deep analysis of recent threats and blocked attempts |
threshold_mb | read | Highlight devices above this usage in MB (default 100) |
update_target_list | write | Update an existing target list (PATCH /v2/target-lists/{id}). Only the fields given are sent; targets, when given, is the complete new list and is not merged with the current targets. ${USER_REQUEST_ONLY} |
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- declared (6 observation(s))
- Network
- declared (2 observation(s))
- Shell
- declared (3 observation(s))
- Dependencies
- not all pinned
- Secrets in source
- none-found
Findings (10)
delete_alarm, delete_rule, delete_target_list
.mcp.json.example
.prettierignore
import { matchesWildcard } from '../../utils/wildcard.js';import { unixToISOString } from '../../utils/timestamp.js';} from '../../firewalla/client.js';
} from '../../validation/error-handler.js';
} from '../../validation/alarm-mute.js';
const url = new URL(`http://127.0.0.1:${HTTP_PORT}/mcp`);@modelcontextprotocol/sdk, @types/geoip-lite, @types/node, axios, dotenv, geoip-lite, zod, @types/jest
Gates applied: no_behavioural_pass.
ebfb0b4d2238full audit observations/trust-audit/mcp-server/amittell__firewalla.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-08 | ebfb0b4d2238 | SAFE | B | 89 | first audit |
Questions
What is the Firewalla MCP server?
Firewalla MCP Server - Claude integration for network security monitoring and firewall management
What tools does Firewalla expose?
41 in total: 30 read-only, 8 that write, and 3 that can delete or overwrite (delete_alarm, delete_rule, delete_target_list). Every one is listed on this page with its risk.
Is Firewalla safe to connect to an agent?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 3 of its tools can destroy data, so scope the token you give it to what you actually need.
What credentials does Firewalla need?
It reads FIREWALLA_MSP_TOKEN from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.
How does Firewalla run?
It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as firewalla-mcp-server at 2.1.1.
How current is this page?
The grade is for one exact copy of the source (ebfb0b4d2238), read on 2026-10-08. The repository is watched and re-audited when it changes.