Atlas / MCP servers / amittell / Firewalla

FirewallaSAFE

mcp/amittell/firewalla

Firewalla MCP Server - Claude integration for network security monitoring and firewall management

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
41 30r · 8w · 3d
Transport
stdio · streamable-http
License
MIT
Stars
39
01

Overview

Firewalla MCP Server - Claude integration for network security monitoring and firewall management

Read from source at commit ebfb0b4d2238OBSERVED · 2026-10-08
Advertisement
02

Connect

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-code
claude mcp add firewalla-mcp-server --env FIREWALLA_MSP_TOKEN=${FIREWALLA_MSP_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "firewalla-mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "FIREWALLA_MSP_TOKEN": "${FIREWALLA_MSP_TOKEN}"
      }
    }
  }
}
03

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.

ToolRiskDescription
archive_alarmreadArchive 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_analysisreadTop bandwidth consumers and usage patterns
create_rulewriteCreate 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_listwriteCreate 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_alarmdestructiveDelete 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_ruledestructivePermanently 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_listdestructivePermanently 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_idreadDevice ID (MAC) to investigate
device_investigationreadInvestigate a specific device: flows, alarms, behavior
get_access_point_channelsreadGet 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_usagewriteTop 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_boxesreadList 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_statusreadCheck 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_insightsreadGet 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_rulesreadRetrieve 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_summaryreadGet 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_devicesreadList 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_activityreadGet 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_statisticsreadGet 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_alarmreadGet 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_listreadRetrieve one target list by ID, including its targets (GET /v2/target-lists/{id}).
get_statistics_by_boxreadTop boxes by blocked flows (the default) or by Security Activity alarms, from GET /v2/stats/{type}, with each box
get_statistics_by_regionreadTop 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_listsreadRetrieve target lists (GET /v2/target-lists). Without owner the API returns the MSP
get_wifi_networksreadList 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_settingsreadGet 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_hoursreadHours of history to inspect (default 24)
mute_alarmwriteMute 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_checkreadOverall network health: summary, devices, metrics, topology, rules
pause_rulewritePause 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
periodreadReport period:
rename_devicewriteRename 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_rulewriteResume a paused firewall rule on the box, restoring it to active (POST /v2/rules/{id}/resume, no body). Checks the rule
search_devicesreadSearch 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_flowsreadSearch 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_rulesreadSearch 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_listsreadSearch 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_reportreadComprehensive security report for a time period
threat_analysisreadDeep analysis of recent threats and blocked attempts
threshold_mbreadHighlight devices above this usage in MB (default 100)
update_target_listwriteUpdate 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}
04

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.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codePASS
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (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)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_alarm, delete_rule, delete_target_list
Why it matters. 3 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mcp.json.example
.mcp.json.example
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/search/filters/index.ts:10
import { matchesWildcard } from '../../utils/wildcard.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/search/filters/time.ts:13
import { unixToISOString } from '../../utils/timestamp.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/tools/handlers/alarm-actions.ts:13
} from '../../firewalla/client.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/tools/handlers/alarm-actions.ts:18
} from '../../validation/error-handler.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/tools/handlers/alarm-actions.ts:24
} from '../../validation/alarm-mute.js';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/functional-test.mjs:243
const url = new URL(`http://127.0.0.1:${HTTP_PORT}/mcp`);
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, @types/geoip-lite, @types/node, axios, dotenv, geoip-lite, zod, @types/jest
Why it matters. 19 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha ebfb0b4d2238full audit observations/trust-audit/mcp-server/amittell__firewalla.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-08ebfb0b4d2238SAFEB89first audit
06

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.

Advertisement