cortex-mcp
by Larkfen
README.md
# cortex-mcp
Servidor **MCP (Model Context Protocol)** para **Cortex XDR** de Palo Alto Networks.
Permite que un asistente como **Claude Code** / **Claude Desktop** consulte y opere tu tenant de Cortex en lenguaje natural: casos, incidentes, alertas, endpoints, vulnerabilidades, XQL, threat hunting, IOCs y políticas.
Toda la API REST de Cortex XDR está cubierta a través de la herramienta **`cortex_send_request`** (`path` + `request_data`). El servidor también expone el recurso **`cortex-xdr://reference/rest-api`** con el índice de endpoints oficiales y las reglas de oro de la API.
---
## ⚡ Requisitos previos
- **Python 3.12 o superior** — comprueba con `python --version`.
- **Claude Code** instalado (`claude --version`).
- **Git**.
- Una **API Key de Cortex XDR** (más abajo se explica cómo obtenerla).
## 1. Clona el repositorio
```bash
git clone https://github.com/Larkfen/cortex-mcp-clean.git
cd cortex-mcp-clean
```
---
## 🤖 2. Instalación automática con Claude Code (recomendado)
La forma más simple: **deja que Claude lo instale y configure por ti mientras miras.**
Abre **Claude Code dentro de la carpeta del repo** y pégale este prompt — Claude te irá pidiendo lo que necesite (credenciales, etc.):
```text
Quiero que instales y configures este MCP de Cortex XDR (estás en la raíz del repo) para usarlo desde Claude Code. Haz esto paso a paso:
1. Verifica que tengo Python 3.12+ (python --version). Si no, avísame.
2. Crea un entorno virtual .venv en esta carpeta e instala las dependencias con "pip install ." (o "poetry install" si detectas Poetry). Detecta si estoy en Windows o Linux/macOS y usa los comandos correctos.
3. Pídeme estos tres datos de mi tenant de Cortex XDR (no los inventes):
- URL base del tenant, formato https://api-<tenant>.xdr.<region>.paloaltonetworks.com
- API Key ID (el número de la key)
- API Key (el secreto)
Recomiéndame usar una key "Advanced" por seguridad; asume Advanced salvo que te diga explícitamente que es Standard.
4. Registra el servidor MCP llamado "cortex-xdr" con `claude mcp add`, donde:
- command = el python del .venv que creaste
- args = <ruta-al-repo>/src/main.py
- cwd = la raíz del repo
- env = CORTEX_MCP_PAPI_URL, CORTEX_MCP_PAPI_AUTH_ID, CORTEX_MCP_PAPI_AUTH_HEADER, CORTEX_MCP_AUTH_TYPE=advanced y MCP_TRANSPORT=stdio.
- Si te confirmo que mi key es Standard, usa CORTEX_MCP_AUTH_TYPE=standard.
5. Verifica con /mcp que "cortex-xdr" quede como connected y lístame las tools disponibles.
Reglas: nunca muestres ni subas mi API Key en texto plano fuera de la configuración local del MCP. Si algo falla, muéstrame el error exacto y cómo corregirlo.
```
Eso es todo: Claude crea el entorno, te pide las credenciales, registra el MCP y verifica que quede conectado.
👉 ¿Aún no tienes la API Key de Cortex? Míralo en el [Paso 2 de la instalación manual](#paso-2--obtener-las-credenciales-de-la-api-de-cortex-xdr).
Si prefieres hacerlo tú a mano, sigue la sección de abajo.
---
## 🔧 Instalación manual (paso a paso)
Si prefieres control total, o quieres entender qué hace el prompt, estos son los mismos pasos a mano.
El MCP corre como un proceso local de Python (transport `stdio`); **no necesitas Docker**.
### Paso 1 — Crear el entorno virtual e instalar dependencias
Un *entorno virtual* (`.venv`) es una carpeta aislada con su propio Python y sus librerías, para que las dependencias de este MCP no choquen con el resto de tu sistema. Se crea una sola vez.
**Windows (PowerShell):**
```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install .
```
**Linux / macOS:**
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install .
```
> Alternativa con Poetry (si lo usas): `poetry install` en vez de `pip install .`.
Al terminar, la ruta del intérprete de Python del entorno será:
- Windows: `<ruta-al-repo>\.venv\Scripts\python.exe`
- Linux/macOS: `<ruta-al-repo>/.venv/bin/python`
Guarda esa ruta; la usarás en el Paso 3.
### Paso 2 — Obtener las credenciales de la API de Cortex XDR
En la consola de **Cortex XDR**:
1. Ve al menú de configuración: **Settings (⚙️) → Configurations → Integrations → API Keys**.
2. Haz clic en **+ New Key**.
3. Elige el tipo de key:
- **Advanced** ✅ **(recomendado, por seguridad)** — cada petición se firma con un *nonce* + *timestamp* y un hash SHA-256, de modo que la API Key **nunca viaja en texto plano** y se protege contra ataques de *replay*.
- **Standard** — envía la key directamente en el header. Úsala solo si no puedes usar Advanced.
4. Asigna un **Role** con los permisos que necesites y guarda.
5. Cortex te mostrará **la API Key (secreto)** — cópiala ahora, **solo se muestra una vez**.
6. En la tabla de API Keys, anota el **ID** de la key (un número, p. ej. `1`, `6`, …).
También necesitas la **URL base (FQDN) de tu tenant**. La encuentras en el botón **"Copy examples"** al crear la key, o en la misma página de API Keys. Tiene esta forma:
```
https://api-<tu-tenant>.xdr.<region>.paloaltonetworks.com
```
(el prefijo `api-` es obligatorio; `<region>` suele ser `us`, `eu`, etc.)
En resumen, del Paso 2 sacas **estos datos**:
| Dato | Variable | Ejemplo |
|------|----------|---------|
| URL base del tenant | `CORTEX_MCP_PAPI_URL` | `https://api-<tu-tenant>.xdr.us.paloaltonetworks.com` |
| ID de la API Key | `CORTEX_MCP_PAPI_AUTH_ID` | `1` |
| API Key (secreto) | `CORTEX_MCP_PAPI_AUTH_HEADER` | `xxxxxxxx…` |
| Tipo de key | `CORTEX_MCP_AUTH_TYPE` | `advanced` (recomendado) |
> **Recomendación de seguridad:** usa siempre una key **Advanced** y configura `CORTEX_MCP_AUTH_TYPE=advanced`. Solo si usas una key **Standard** cambia este valor a `standard`.
### Paso 3 — Registrar el MCP en Claude Code
Tienes dos formas equivalentes. Usa **una**.
#### Opción A — Comando `claude mcp add` (rápido)
Ejecuta esto **reemplazando** las rutas y credenciales por las tuyas. En Windows usa `\` en las rutas.
```bash
claude mcp add cortex-xdr \
--env CORTEX_MCP_PAPI_URL=https://api-<tu-tenant>.xdr.us.paloaltonetworks.com \
--env CORTEX_MCP_PAPI_AUTH_ID=<tu_api_key_id> \
--env CORTEX_MCP_PAPI_AUTH_HEADER=<tu_api_key> \
--env CORTEX_MCP_AUTH_TYPE=advanced \
--env MCP_TRANSPORT=stdio \
-- <ruta-al-repo>/.venv/bin/python <ruta-al-repo>/src/main.py
```
#### Opción B — Editar el archivo de configuración MCP
Añade este bloque a tu configuración MCP (el `.mcp.json` del proyecto, o la config de usuario de Claude Code):
```json
{
"mcpServers": {
"cortex-xdr": {
"command": "<ruta-al-repo>/.venv/bin/python",
"args": ["<ruta-al-repo>/src/main.py"],
"cwd": "<ruta-al-repo>",
"env": {
"CORTEX_MCP_PAPI_URL": "https://api-<tu-tenant>.xdr.us.paloaltonetworks.com",
"CORTEX_MCP_PAPI_AUTH_ID": "<tu_api_key_id>",
"CORTEX_MCP_PAPI_AUTH_HEADER": "<tu_api_key>",
"CORTEX_MCP_AUTH_TYPE": "advanced",
"MCP_TRANSPORT": "stdio"
}
}
}
}
```
> **Windows:** el `command` es `<ruta-al-repo>\.venv\Scripts\python.exe` y las rutas llevan `\\` (doble) o `/`.
> **Importante:** incluye siempre `cwd` apuntando a la raíz del repo, para que se carguen también las *tools custom* (XQL, block list, etc.).
### Paso 4 — Verificar que funciona
1. Abre Claude Code en la carpeta del proyecto y ejecuta el comando `/mcp`.
2. Debe aparecer **`cortex-xdr`** como **connected**.
3. Prueba pidiéndole algo simple, por ejemplo:
> "Usa la tool de Cortex para traer la información del tenant (get_tenant_info)."
4. Si conecta pero no ves las tools *custom*, revisa que el `cwd` apunte a la raíz del repo (Paso 3).
En los logs del servidor deberías ver algo como `OpenAPI spec loaded with N path(s)`.
---
## 🧠 Skill incluida — investigación + dashboard
El repo trae un **skill de Claude Code** en [`.claude/skills/cortex-xdr-triage/`](.claude/skills/cortex-xdr-triage/SKILL.md) que le enseña a Claude **cómo usar el MCP bien y con pocos tokens**, sin tener que explicárselo cada vez.
Con el skill activo, puedes pedir en lenguaje natural cosas como *"revisa los casos abiertos y dime qué requiere atención"* y Claude:
1. Lista y **prioriza** los incidentes/casos abiertos (por score y severidad).
2. Investiga cada caso prioritario: **usuario**, **equipo/host**, **qué lo gatilló**, **qué ha pasado** (timeline + MITRE ATT&CK) y **cómo mitigarlo** (con las tools reales).
3. Si lo pides, genera un **dashboard SOC oscuro** (Artifact) estilo consola de Palo Alto, usando la plantilla incluida en `assets/`.
> **Guardas de seguridad del skill:** las tools de lectura corren libres; cualquier acción de contención o cambio (aislar, bloquear, cuarentena, cerrar casos) **se confirma contigo antes de ejecutarse**.
### Cómo activar el skill
- **Dentro del repo:** al abrir Claude Code en esta carpeta, el skill se detecta automáticamente (`.claude/skills/`).
- **Para usarlo en cualquier proyecto:** copia la carpeta a tu config de usuario:
```bash
# Linux/macOS
cp -r .claude/skills/cortex-xdr-triage ~/.claude/skills/
```
```powershell
# Windows
Copy-Item -Recurse .claude\skills\cortex-xdr-triage "$env:USERPROFILE\.claude\skills\"
```
> **Instalación automática vs Skill:** la instalación automática (el prompt de arriba) sirve para **dejar el MCP funcionando**; el **skill** es para **usarlo** (investigar y generar dashboards). Son complementarios.
## 🧰 Tools que expone este MCP
El servidor une automáticamente las especificaciones OpenAPI de:
- **builtin_components/** — herramientas base: `get_issues`, `get_cases`, `get_assets`, `get_filtered_endpoints`, `get_vulnerabilities`, `get_tenant_info`, etc.
- **custom_components/** — herramientas añadidas en este repo: `block_list_add_files`, `xql_run_query`, `xql_get_results`, `get_policy_list`, además de casos/incidentes/alertas, endpoint actions, threat hunting, IOCs, wildfire y políticas.
- **remote_components/** — componentes descargados con el comando de actualización del CLI (opcional).
Para que se vean las tools *custom*, el servidor debe arrancarse **desde el directorio del proyecto** (por eso el `cwd` en la config).
---
## 🩺 Solución de problemas
| Síntoma | Causa probable | Solución |
|--------|----------------|----------|
| `cortex-xdr` no aparece en `/mcp` | Ruta de `command`/`args` incorrecta | Verifica que apunten al `python` del `.venv` y a `src/main.py` (rutas absolutas). |
| Conecta pero solo se ven tools builtin | Falta `cwd` | Añade `cwd` con la raíz del repo (Paso 3). |
| Error 401 / 403 en las llamadas | Credenciales o tipo de key mal | Revisa `CORTEX_MCP_PAPI_AUTH_ID` y `..._AUTH_HEADER`, y que `CORTEX_MCP_AUTH_TYPE` coincida con el tipo real de tu key (`advanced` o `standard`). |
| Error de conexión / DNS | URL base mal formada | Debe empezar con `https://api-` y terminar en `.paloaltonetworks.com`. |
| `No OpenAPI spec or paths loaded` en logs | No arrancó desde el repo | Revisa `cwd`. |
---
## 🛠️ Desarrollo
### Estructura del proyecto
```
src/
├── cli.py # Interfaz de línea de comandos
├── main.py # Punto de entrada del servidor MCP
├── config/ # Configuración
├── entities/ # Modelos de datos y recursos
├── pkg/ # Utilidades internas y cliente PAPI
├── service/ # Capa de servicio (servidor MCP)
└── usecase/ # Lógica de negocio (tools)
├── builtin_components/ # Tools base (con OpenAPI)
├── custom_components/ # Tools añadidas en este repo
└── remote_components/ # Tools distribuidas/actualizadas por Cortex
```
### Comandos
```bash
poetry run pytest # tests
poetry run black . # formato
poetry run isort . # orden de imports
```
Para depurar un MCP, lo mejor es el [MCP inspector](https://github.com/modelcontextprotocol/inspector).
---
## 🐳 Docker (opcional)
Solo si prefieres contenedor en vez del método local. Crea un `.env` (copia `.env.example`) y:
```bash
docker build -t cortex-mcp .
```
Registro en el cliente MCP:
```json
{
"mcpServers": {
"cortex-xdr": {
"command": "docker",
"args": ["run", "--env-file", "/ruta/a/.env", "-i", "--rm", "cortex-mcp"]
}
}
}
```
---
## 📄 Licencia
Ver [LICENSE](LICENSE). Este proyecto se basa en la implementación oficial de **Palo Alto Networks**; revisa los términos antes de redistribuir.
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues