Skip to main content
Glama
README.md
# 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

A3.5/5.0

Scored across 42 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness3/5

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.

Maintenance

ActivityInactive
ResponsivenessNo issues