scm-mcp
A Model Context Protocol server for managing Palo Alto Networks Strata Cloud Manager firewall configurations through natural language in Claude. It provides 149 tools covering the full configuration lifecycle including policy objects, security rules, NAT, and profiles with multi-tenant support.
README
scm-mcp
A Model Context Protocol (MCP) server for Palo Alto Networks Strata Cloud Manager (SCM). Exposes 149 tools covering the full SCM configuration lifecycle — policy objects, security rules, NAT, profiles, decryption, QoS, and more — so you can manage firewall configuration through natural language in Claude Code or Claude Desktop.
Features
- 149 tools across 9 functional areas
- Multi-tenant (multi-TSG) support — target different tenants per tool call with named aliases
- Full CRUD for all supported resource types
- Zero infrastructure — runs as a local stdio process, no server to maintain
- Built on the pan-scm-sdk which handles OAuth2 token lifecycle, pagination, and Pydantic validation automatically
Tool Coverage
| Area | Tools | Resources |
|---|---|---|
| Setup | 12 | Folders, Snippets |
| Objects | 45 | Addresses, Address Groups, Services, Service Groups, Tags, Log Forwarding Profiles, HTTP Server Profiles, Syslog Server Profiles |
| Policy Objects | 24 | Applications, Application Groups, Application Filters, Schedules, External Dynamic Lists |
| Security | 26 | Security Rules, Security Zones, Decryption Rules, Authentication Rules |
| Network | 17 | NAT Rules, PBF Rules, QoS Rules |
| Profiles | 24 | Anti-Spyware, WildFire, Vulnerability, URL Access, URL Categories, DNS Security, Decryption, File Blocking, Zone Protection |
| Operations | 4 | Commit, Job Status, List Jobs, List TSG Profiles |
| Total | 149 |
Requirements
- Python 3.12+
- A Palo Alto Networks SCM tenant with a service account
- Claude Code or Claude Desktop
Installation
1. Clone and install
git clone https://github.com/your-username/scm-mcp.git
cd scm-mcp
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e .
2. Configure credentials
cp .env.example .env
Edit .env with your SCM service account credentials:
SCM_CLIENT_ID=your_client_id_here
SCM_CLIENT_SECRET=your_client_secret_here
SCM_TSG_ID=your_default_tsg_id_here
# Optional: named aliases for multi-tenant use
# SCM_TSG_PROD=prod_tsg_id_here
# SCM_TSG_LAB=lab_tsg_id_here
Where to find credentials: SCM portal → Settings → Service Accounts → Create. The TSG ID appears in the tenant URL:
https://stratacloudmanager.paloaltonetworks.com/tenants/<TSG_ID>/.
3. Register with Claude Code
claude mcp add scm -- /path/to/scm-mcp/.venv/bin/python -m src.server
Or add to .claude/settings.json manually:
{
"mcpServers": {
"scm": {
"command": "/path/to/scm-mcp/.venv/bin/python",
"args": ["-m", "src.server"],
"cwd": "/path/to/scm-mcp"
}
}
}
4. Register with Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"scm": {
"command": "/path/to/scm-mcp/.venv/bin/python",
"args": ["-m", "src.server"],
"cwd": "/path/to/scm-mcp",
"env": {
"SCM_CLIENT_ID": "your_client_id",
"SCM_CLIENT_SECRET": "your_client_secret",
"SCM_TSG_ID": "your_tsg_id"
}
}
}
}
Multi-Tenant Usage
Every tool accepts an optional tsg_id parameter. When omitted, the default SCM_TSG_ID is used.
Named aliases — define them in .env:
SCM_TSG_PROD=1234567890
SCM_TSG_LAB=9876543210
Then pass the alias name to any tool:
# List which TSGs are configured
scm_list_tsg_profiles()
# Query the PROD tenant
scm_list_addresses(folder="All", tsg_id="PROD")
# Copy an object between tenants
scm_get_address(address_id="<uuid>", tsg_id="PROD")
scm_create_address(name="web-servers", folder="Texas", ip_netmask="10.0.1.0/24", tsg_id="LAB")
You can also pass a raw TSG ID string directly if no alias is configured.
Project Structure
scm-mcp/
├── src/
│ ├── server.py # MCP server entry point and tool registration
│ ├── client.py # Per-TSG Scm client factory with alias resolution
│ ├── utils.py # Serialization (Pydantic → dict) and error handling
│ └── tools/
│ ├── setup.py # Folders, Snippets
│ ├── objects.py # Addresses, Address Groups, Services, Service Groups,
│ │ # Tags, Log/HTTP/Syslog Server Profiles
│ ├── policy_objects.py# Applications, App Groups, App Filters,
│ │ # Schedules, External Dynamic Lists
│ ├── security.py # Security Rules, Security Zones,
│ │ # Decryption Rules, Authentication Rules
│ ├── network.py # NAT Rules, PBF Rules, QoS Rules
│ ├── profiles.py # Anti-Spyware, WildFire, Vulnerability, URL Access,
│ │ # URL Categories, DNS Security, Decryption,
│ │ # File Blocking, Zone Protection Profiles
│ └── operations.py # Commit, Job Status, List Jobs, List TSG Profiles
├── .env.example # Credential template (commit this)
├── .env # Real credentials (gitignored)
├── pyproject.toml # Project metadata and dependencies
└── README.md
Example Prompts
Once the MCP server is connected, you can use natural language in Claude Code:
Show me all security rules in the Texas folder.
Create an address object for our web server farm: 10.10.1.0/24 in the Texas folder, tagged "web-tier".
Copy all address objects from the PROD tenant into the LAB tenant under the same folder.
Create a security rule allowing HTTPS from the trust zone to the DMZ zone for the web-servers address group. Use the best-practice security profile group.
What external dynamic lists are configured and when do they refresh?
Commit the changes in the Texas and California folders with description "Q2 policy update".
Tool Reference
Operations
| Tool | Description |
|---|---|
scm_list_tsg_profiles |
List configured TSG profiles and their aliases |
scm_commit |
Commit staged changes and push to devices |
scm_get_job_status |
Poll an async commit job for completion |
scm_list_jobs |
List recent SCM jobs |
Setup
| Tool | Description |
|---|---|
scm_list_folders |
List all folders |
scm_get_folder |
Get folder by UUID |
scm_create_folder |
Create a folder |
scm_update_folder |
Rename or redescribe a folder |
scm_delete_folder |
Delete a folder |
scm_list_snippets |
List all snippets |
scm_get_snippet |
Get snippet by UUID |
scm_create_snippet |
Create a snippet |
scm_update_snippet |
Update a snippet |
scm_delete_snippet |
Delete a snippet |
scm_associate_snippet_to_folder |
Associate a snippet with a folder |
scm_disassociate_snippet_from_folder |
Remove snippet-folder association |
Objects
| Tool | Description |
|---|---|
scm_list_addresses |
List address objects |
scm_get_address |
Get address by UUID |
scm_create_address |
Create an address (IP/CIDR, range, wildcard, or FQDN) |
scm_update_address |
Update an address |
scm_delete_address |
Delete an address |
scm_list_address_groups |
List address groups |
scm_get_address_group |
Get address group by UUID |
scm_create_address_group |
Create a static or dynamic address group |
scm_update_address_group |
Update an address group |
scm_delete_address_group |
Delete an address group |
scm_list_services |
List service objects |
scm_get_service |
Get service by UUID |
scm_create_service |
Create a TCP/UDP service |
scm_update_service |
Update a service |
scm_delete_service |
Delete a service |
scm_list_service_groups |
List service groups |
scm_get_service_group |
Get service group by UUID |
scm_create_service_group |
Create a service group |
scm_update_service_group |
Update a service group |
scm_delete_service_group |
Delete a service group |
scm_list_tags |
List tags |
scm_get_tag |
Get tag by UUID |
scm_create_tag |
Create a tag |
scm_update_tag |
Update a tag |
scm_delete_tag |
Delete a tag |
scm_list_log_forwarding_profiles |
List log forwarding profiles |
scm_get_log_forwarding_profile |
Get log forwarding profile by UUID |
scm_create_log_forwarding_profile |
Create a log forwarding profile |
scm_delete_log_forwarding_profile |
Delete a log forwarding profile |
scm_list_http_server_profiles |
List HTTP server profiles |
scm_get_http_server_profile |
Get HTTP server profile by UUID |
scm_create_http_server_profile |
Create an HTTP server profile |
scm_delete_http_server_profile |
Delete an HTTP server profile |
scm_list_syslog_server_profiles |
List syslog server profiles |
scm_get_syslog_server_profile |
Get syslog server profile by UUID |
scm_create_syslog_server_profile |
Create a syslog server profile |
scm_delete_syslog_server_profile |
Delete a syslog server profile |
Policy Objects
| Tool | Description |
|---|---|
scm_list_applications |
List application objects |
scm_get_application |
Get application by UUID |
scm_create_application |
Create a custom application |
scm_update_application |
Update a custom application |
scm_delete_application |
Delete a custom application |
scm_list_application_groups |
List application groups |
scm_get_application_group |
Get application group by UUID |
scm_create_application_group |
Create an application group |
scm_update_application_group |
Update an application group |
scm_delete_application_group |
Delete an application group |
scm_list_application_filters |
List application filters |
scm_get_application_filter |
Get application filter by UUID |
scm_create_application_filter |
Create a dynamic application filter |
scm_delete_application_filter |
Delete an application filter |
scm_list_schedules |
List schedule objects |
scm_get_schedule |
Get schedule by UUID |
scm_create_schedule |
Create a recurring or one-time schedule |
scm_update_schedule |
Update a schedule |
scm_delete_schedule |
Delete a schedule |
scm_list_external_dynamic_lists |
List external dynamic lists (EDLs) |
scm_get_external_dynamic_list |
Get EDL by UUID |
scm_create_external_dynamic_list |
Create an IP/URL/domain EDL |
scm_update_external_dynamic_list |
Update an EDL |
scm_delete_external_dynamic_list |
Delete an EDL |
Security
| Tool | Description |
|---|---|
scm_list_security_rules |
List security policy rules |
scm_get_security_rule |
Get security rule by UUID |
scm_create_security_rule |
Create a security rule |
scm_update_security_rule |
Update a security rule |
scm_delete_security_rule |
Delete a security rule |
scm_move_security_rule |
Reorder a rule (top/bottom/before/after) |
scm_list_security_zones |
List security zones |
scm_get_security_zone |
Get security zone by UUID |
scm_create_security_zone |
Create a security zone |
scm_update_security_zone |
Update a security zone |
scm_delete_security_zone |
Delete a security zone |
scm_list_decryption_rules |
List decryption policy rules |
scm_get_decryption_rule |
Get decryption rule by UUID |
scm_create_decryption_rule |
Create a decrypt/no-decrypt rule |
scm_update_decryption_rule |
Update a decryption rule |
scm_delete_decryption_rule |
Delete a decryption rule |
scm_list_authentication_rules |
List authentication policy rules |
scm_get_authentication_rule |
Get authentication rule by UUID |
scm_create_authentication_rule |
Create an authentication rule |
scm_update_authentication_rule |
Update an authentication rule |
scm_delete_authentication_rule |
Delete an authentication rule |
Network
| Tool | Description |
|---|---|
scm_list_nat_rules |
List NAT rules |
scm_get_nat_rule |
Get NAT rule by UUID |
scm_create_nat_rule |
Create a NAT rule (IPv4, NAT64, NPTv6) |
scm_update_nat_rule |
Update a NAT rule |
scm_delete_nat_rule |
Delete a NAT rule |
scm_list_pbf_rules |
List policy-based forwarding rules |
scm_get_pbf_rule |
Get PBF rule by UUID |
scm_create_pbf_rule |
Create a PBF rule |
scm_update_pbf_rule |
Update a PBF rule |
scm_delete_pbf_rule |
Delete a PBF rule |
scm_list_qos_rules |
List QoS policy rules |
scm_get_qos_rule |
Get QoS rule by UUID |
scm_create_qos_rule |
Create a QoS rule |
scm_update_qos_rule |
Update a QoS rule |
scm_delete_qos_rule |
Delete a QoS rule |
Security Profiles
| Tool | Description |
|---|---|
scm_list_anti_spyware_profiles |
List anti-spyware profiles |
scm_get_anti_spyware_profile |
Get anti-spyware profile by UUID |
scm_create_anti_spyware_profile |
Create an anti-spyware profile |
scm_delete_anti_spyware_profile |
Delete an anti-spyware profile |
scm_list_wildfire_profiles |
List WildFire antivirus profiles |
scm_get_wildfire_profile |
Get WildFire profile by UUID |
scm_create_wildfire_profile |
Create a WildFire profile |
scm_delete_wildfire_profile |
Delete a WildFire profile |
scm_list_vulnerability_profiles |
List vulnerability protection profiles |
scm_get_vulnerability_profile |
Get vulnerability profile by UUID |
scm_create_vulnerability_profile |
Create a vulnerability protection profile |
scm_delete_vulnerability_profile |
Delete a vulnerability protection profile |
scm_list_url_access_profiles |
List URL access (filtering) profiles |
scm_get_url_access_profile |
Get URL access profile by UUID |
scm_create_url_access_profile |
Create a URL access profile |
scm_delete_url_access_profile |
Delete a URL access profile |
scm_list_url_categories |
List custom URL categories |
scm_get_url_category |
Get URL category by UUID |
scm_create_url_category |
Create a custom URL category |
scm_delete_url_category |
Delete a custom URL category |
scm_list_dns_security_profiles |
List DNS security profiles |
scm_get_dns_security_profile |
Get DNS security profile by UUID |
scm_create_dns_security_profile |
Create a DNS security profile |
scm_delete_dns_security_profile |
Delete a DNS security profile |
scm_list_decryption_profiles |
List SSL/TLS decryption profiles |
scm_get_decryption_profile |
Get decryption profile by UUID |
scm_create_decryption_profile |
Create a decryption profile |
scm_delete_decryption_profile |
Delete a decryption profile |
scm_list_file_blocking_profiles |
List file blocking profiles |
scm_get_file_blocking_profile |
Get file blocking profile by UUID |
scm_create_file_blocking_profile |
Create a file blocking profile |
scm_delete_file_blocking_profile |
Delete a file blocking profile |
scm_list_zone_protection_profiles |
List zone protection profiles |
scm_get_zone_protection_profile |
Get zone protection profile by UUID |
scm_create_zone_protection_profile |
Create a zone protection profile |
scm_delete_zone_protection_profile |
Delete a zone protection profile |
Environment Variables
| Variable | Required | Description |
|---|---|---|
SCM_CLIENT_ID |
Yes | OAuth2 client ID from the SCM service account |
SCM_CLIENT_SECRET |
Yes | OAuth2 client secret from the SCM service account |
SCM_TSG_ID |
Yes | Default Tenant Service Group ID |
SCM_TSG_<NAME> |
No | Named TSG alias — pass <NAME> as tsg_id to any tool |
Authentication
SCM uses OAuth2 client credentials flow. Tokens have a 15-minute TTL and are automatically refreshed by the underlying pan-scm-sdk. No token management is required.
Service accounts are created in the SCM portal under Settings > Identity & Access > Service Accounts. The account needs appropriate role permissions for the resources you intend to manage.
Contributing
Issues and pull requests welcome. This project is built on pan-scm-sdk — if you need a resource type that isn't covered here, check whether the SDK supports it first.
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。