Content
# Tool List
Palo Alto Networks Strata Cloud Manager (SCM) MCP server, exposing SCM REST API to AI assistants like Claude and Cursor via stdio.
**Current Version**: Batch 1 MVP, with **111 MCP tools**, covering Object Management, Security Rules, Security Profiles, Operations, and IAM.
## Prerequisites
- Python 3.11+
- SCM tenant credentials: Client ID, Client Secret, TSG ID
(created in SCM Console → Identity → Service Accounts)
## Install
```bash
git clone <this-repo>
cd scm-mcp-server
pip install -e ".[dev]"
```
## Configure Environment Variables
```bash
cp .env.example .env
# Edit .env, fill in real credentials
```
`.env` content:
```
SCM_CLIENT_ID=your-client-id
SCM_CLIENT_SECRET=your-client-secret
SCM_TSG_ID=your-tsg-id
SCM_BASE_URL=https://api.strata.paloaltonetworks.com # Optional, default value
```
## Connectivity Self-Test
After configuring credentials, run self-test to verify token acquisition and SCM API reachability:
```bash
python -m scm_mcp_server.check
```
Expected output:
```
[check] OK token obtained (first 8 chars: eyJ0eXAi...)
[check] OK GET /config/operations/v1/jobs → HTTP 200
[check] All checks passed.
```
## Run
```bash
# Run directly (stdio mode, for MCP client connection)
python -m scm_mcp_server
# Debug with MCP Inspector
mcp dev scm_mcp_server/server.py
```
## Register in Claude Desktop
Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"scm": {
"command": "python",
"args": ["-m", "scm_mcp_server"],
"cwd": "/absolute/path/to/scm-mcp-server",
"env": {
"SCM_CLIENT_ID": "your-client-id",
"SCM_CLIENT_SECRET": "your-client-secret",
"SCM_TSG_ID": "your-tsg-id"
}
}
}
}
```
Restart Claude Desktop, ask "List available tools" to confirm `list_addresses` etc. tools are loaded.
## Register in Cursor
Create or edit `.cursor/mcp.json`:
```json
{
"mcpServers": {
"scm": {
"command": "python",
"args": ["-m", "scm_mcp_server"],
"cwd": "/absolute/path/to/scm-mcp-server",
"env": {
"SCM_CLIENT_ID": "your-client-id",
"SCM_CLIENT_SECRET": "your-client-secret",
"SCM_TSG_ID": "your-tsg-id"
}
}
}
}
```
Restart Cursor, input `@scm` in Composer to confirm tools are available.
## Available Tool List (111 in total, Batch 1 MVP)
> ⚠️ marked tools are write operations, **take effect immediately, cannot be rolled back**.
### Objects Core — Address / Service / Tag / Application Group / EDL (35)
| Operation | Resource |
|------|------|
| list / get | addresses, address_groups, services, service_groups, tags, application_groups, external_dynamic_lists |
| ⚠️ create / update / delete | same 7 resources |
### Security Rules — Security / Decryption / App Override / DoS Rules (23)
| Operation | Resource |
|------|------|
| list / get | security_rules, decryption_rules, app_override_rules, dos_protection_rules |
| ⚠️ create / update / delete | same 4 rules |
| ⚠️ move | security_rules, decryption_rules, app_override_rules (adjust rule order) |
### Security Profiles — Security Profiles (33, read-only)
list / get operations, covering:
anti_spyware_profiles, anti_spyware_signatures, data_filtering_profiles, data_objects, decryption_exclusions, decryption_profiles, dns_security_profiles, dos_protection_profiles, file_blocking_profiles, http_header_profiles, profile_groups, url_access_profiles, url_categories, url_filtering_categories (list only), vulnerability_protection_profiles, vulnerability_protection_signatures, wildfire_anti_virus_profiles
### Operations — Config Version and Tasks (8)
| Operation | Tool |
|------|------|
| read-only | list_jobs, get_job, list_config_versions, get_config_version, get_running_config_version |
| ⚠️ write | load_config_version (load version), push_candidate_config (**high risk**: deploy to real device), delete_candidate_config |
### IAM — Identity and Access Management (12)
| Operation | Resource |
|------|------|
| list / get | service_accounts, roles, access_policies |
| ⚠️ create / update / delete | service_accounts |
| ⚠️ create / delete | access_policies |
| ⚠️ reset | reset_service_account_secret (reset secret) |
See [DESIGN.md](DESIGN.md) for complete input/output mapping.
## Development and Testing
```bash
# Run all unit tests
pytest -v
# Syntax check (AST parse all .py files)
python scripts/syntax_check.py
# Route integrity verification (route table key == descriptor name collection)
python scripts/route_integrity.py
# stdio smoke test (require .env credentials)
python scripts/smoke_stdio.py
```
## OpenAPI Specification
Tool schema comes from `../pan.dev/openapi-specs/scm/` (relative to this repo's parent directory):
```
openapi-specs/scm/
auth/AuthService.yaml
config/
sase/objects/objects-june.yaml
sase/security/security-services-R2-2026.yaml
sase/operations/config-operations-march.yaml
iam/
ServiceAccounts.yaml Roles.yaml AccessPolicies.yaml
```
**Do not modify specification files**; update from upstream `pan.dev` repo if needed.