cisco-secure-access-mcp
# cisco-secure-access-mcp
A community **Model Context Protocol (MCP)** server for **Cisco Secure Access**.
It exposes the Secure Access REST API to MCP-compatible AI clients (Cursor, Claude
Desktop, VS Code GitHub Copilot, etc.) as a curated catalog of tools grouped by Cisco's
own resource categories: Admin, Deployments, Investigate, Policies, and Reports.
> **Status:** v1.1 + composites batches 1 & 2 — 5 categories / 44 modules / 185 tools.
> See [`install.md`](./install.md) for the build journal and per-phase progress.
---
## Why a community DevNet server
This repo is structured to be hosted as a Cisco DevNet community MCP server, following
the [`CiscoDevNet/devnet-template`](https://github.com/CiscoDevNet/devnet-template)
layout. The standard template files (`AGENTS.md`, `CODE_OF_CONDUCT.md`, `CONTRIBUTING.md`,
`LICENSE`, `README.md`, `SECURITY.md`) are present and conform to that template.
In addition, [`install.md`](./install.md) is a working journal that captures every step
taken to build the server, troubleshooting notes, and any tools we add as enhancements.
It is intentionally kept in-tree so future contributors can see the reasoning trail.
---
## Quick start
```bash
# 1. Clone and install (using uv)
git clone https://github.com/sdntechforum/Secure_Access.git
cd Secure_Access
uv sync
# 2. Provide your Cisco Secure Access API credentials via environment variables
# (Admin > API Keys in the Secure Access dashboard)
export SECURE_ACCESS_API_KEY=...
export SECURE_ACCESS_API_SECRET=...
# 3. Run the server (stdio transport, default)
uv run cisco-secure-access-mcp
```
For client configuration (Cursor / Claude Desktop / VS Code), Docker usage, the full
list of tools, and the list of supported environment variables, see
[`AGENTS.md`](./AGENTS.md).
---
## Authentication at a glance
- OAuth 2.0 Client Credentials Flow against `POST https://api.sse.cisco.com/auth/v2/token`.
- Bearer token cached in memory and refreshed shortly before its 1-hour expiry.
- Credentials read from environment variables only — never from CLI flags or committed
files.
- Multi-org / MSSP supported via `SECURE_ACCESS_ORG_ID` (sent as `X-Umbrella-OrgId`).
- A separate, optional Key Admin credential pair gates the small set of tools that
manage other API keys.
See [Cisco Secure Access — API Authentication](https://developer.cisco.com/docs/cloud-security/secure-access-api-authentication/)
for how to mint API keys.
---
## Tool catalog
The full catalog of every MCP tool exposed by this server — grouped by
Cisco's category taxonomy (Admin / Deployments / Investigate / Policies /
Reports), with API path, signature, one-line description, and **live
verification status** for each module — lives in [TOOLS.md](./TOOLS.md).
At a glance: **185 tools** across **5 categories** / **44 modules**.
**0 prompts**, **0 resources** — this is a tools-only MCP server.
To regenerate the catalog directly from the registered code (no
hand-maintained list to drift):
```bash
python scripts/dump_catalog.py # human-readable text
python scripts/dump_catalog.py --json # machine-readable JSON
```
To re-run the live verification (requires a Cisco Secure Access API key
+ secret):
```bash
pytest -m integration tests/integration/test_list_coverage.py -v
```
> **Status note for community evaluators:** as of 2026-05-04 a coverage
> sweep against a real Secure Access tenant found that ~32 of 47
> reachable list endpoints return `404 no Route matched`, indicating
> the v1.1 `API_BASE` paths in many tool modules don't match the live
> Cisco surface. The auth + client + retry layers are bulletproof
> (every 2xx exercised them end-to-end), and Admin/Deployments/
> Investigate/Policies/Reports each have at least one verified working
> module. See [`install.md`](./install.md) Phase 9 (2026-05-04
> follow-up) and [`TOOLS.md`](./TOOLS.md) for which modules are verified
> vs. need a path fix. **Contributions welcome.**
---
## Repo layout
```
.
├── AGENTS.md # Install + tool catalog + env vars (read this first if you're an AI agent)
├── CODE_OF_CONDUCT.md # Cisco DevNet template (unchanged)
├── CONTRIBUTING.md # Cisco DevNet template (project name filled in)
├── LICENSE # Apache-2.0 (Cisco DevNet template)
├── README.md # this file
├── SECURITY.md # Cisco DevNet template (project name filled in)
├── TOOLS.md # Full tool catalog (185 tools, per-module verification status)
├── install.md # Build journal — phases, troubleshooting, enhancements
├── pyproject.toml # Package metadata + entry point
├── Dockerfile # Optional secondary distribution
├── .env.example # Documented env vars; NEVER real secrets
├── scripts/
│ └── dump_catalog.py # Generates TOOLS.md content from the live registry
├── src/cisco_secure_access_mcp/
│ ├── server.py # FastMCP entrypoint (stdio default)
│ ├── auth.py # OAuth2 client-credentials + token cache
│ ├── client.py # httpx-based REST client (TLS-only, retry-aware)
│ ├── config.py # Env-var loading + validation
│ ├── errors.py # SDK / HTTP errors → MCP errors
│ ├── logging.py # Structured JSON logs with secret redaction
│ ├── registry.py # Discovers and registers tools from each category
│ └── tools/
│ ├── admin/ # admin_* — Admin Resources
│ ├── deployments/ # deploy_* — Deployments Resources
│ ├── investigate/ # investigate_* — Investigate Resources (v1.1)
│ ├── policies/ # policy_* — Policies Resources
│ └── reports/ # report_* — Reports Resources (v1.1)
└── tests/
├── unit/ # Offline; mock HTTP and clock
└── integration/ # Opt-in; requires real DevNet sandbox credentials
```
---
## Running the tests
```bash
# Unit tests only — fast, fully offline (default)
uv run pytest
# Live smoke tests against a real Secure Access tenant — opt-in only
export SECURE_ACCESS_API_KEY=...
export SECURE_ACCESS_API_SECRET=...
# optional: SECURE_ACCESS_ORG_ID, SECURE_ACCESS_BASE_URL
uv run pytest -m integration tests/integration
```
The smoke tests are read-only by design: they exercise list/get endpoints
across each category (and one Investigate domain-categorization call against
`cisco.com`) and never mutate the org. Override the test domain with
`SECURE_ACCESS_INTEGRATION_TEST_DOMAIN=example.com` if needed.
---
## Security
This repo follows the security rules in `.cursor` (parameterization, no hardcoded
credentials, structured logging with redaction, TLS 1.2+ enforcement, distroless-style
container hardening, etc.). To report a vulnerability, see [`SECURITY.md`](./SECURITY.md).
---
## License
Apache License 2.0 — see [`LICENSE`](./LICENSE).
TDQS
Scored across 42 tools
Tools are cleanly separated by prefixes (admin_, deploy_, policy_) and within each group verbs like list, get, create, delete, update clearly distinguish their purposes. No two tools overlap in functionality.
All tools follow a consistent domain_verb_noun pattern in snake_case (e.g., admin_list_api_keys, deploy_delete_site). No mixing of conventions or ambiguous verb choices.
42 tools is on the higher side but justified given the three distinct domains (admin, deploy, policy) and the breadth of Cisco Secure Access. Each domain has a reasonable number of tools for its scope, though some could be consolidated.
The tool set covers CRUD for most resources but notably lacks update operations for deploy resources (networks, tunnel groups, sites, roaming computers) and for policy destination/application lists. This forces agents to delete and recreate to modify, which is a significant gap.