
cMCP: Puerta de enlace MCP confidencial. Aplicación de políticas atestiguada por hardware para llamadas a herramientas MCP.
<p align="center">
<img src="https://raw.githubusercontent.com/agentrust-io/cmcp/HEAD/docs/assets/icon.svg" width="96" height="96" alt="cMCP"/>
</p>
# cMCP: Entorno de ejecución MCP confidencial
Novedades de la comunidad y destacados de colaboradores: [AgenTrust en LinkedIn](https://www.linkedin.com/company/agentrust-io/).
### Aplica la política de herramientas MCP dentro de un TEE, donde el agente que gobierna no puede alcanzarla
<p align="center">
<a href="https://cmcp.agentrust-io.com">
<img src="https://img.shields.io/badge/Documentation-cmcp.agentrust--io.com-7c3aed?style=for-the-badge" alt="Documentation" height="36">
</a>
</p>
<p align="center">
<strong>
<a href="#quick-start">Inicio rápido</a> ·
<a href="#how-it-works">Arquitectura</a> ·
<a href="#configuration">Configuración</a> ·
<a href="#cli-reference">CLI</a> ·
<a href="https://github.com/agentrust-io/cmcp/blob/main/CHANGELOG.md">Registro de cambios</a>
</strong>
</p>
[](https://github.com/agentrust-io/cmcp/actions/workflows/ci.yml) [](LICENSE) [](https://pypi.org/project/cmcp-runtime/) [](https://scorecard.dev/viewer/?uri=github.com/agentrust-io/cmcp) [](https://discord.gg/grgzFEHgkj)
> **Vista previa para desarrolladores** - lanzada en la Confidential Computing Summit, 23 de junio de 2026. Puede tener cambios incompatibles antes de la v1.0. Consulta [STATUS.md](https://github.com/agentrust-io/cmcp/blob/main/STATUS.md) para saber exactamente qué se entrega hoy frente a lo que está en la hoja de ruta.
**cMCP (Confidential MCP Runtime) es una puerta de enlace de código abierto que verifica cada llamada a herramienta que realiza un agente de IA contra las reglas que tú escribes, y puede ejecutarse en hardware aislado que el agente no puede manipular.** Los agentes de IA utilizan herramientas (bases de datos, CRMs, correo electrónico, API internas) enviando solicitudes llamadas llamadas a herramientas, normalmente a través de MCP, el Model Context Protocol. cMCP se sitúa en la ruta de esas llamadas, verifica cada una contra tus reglas (escritas en el lenguaje de políticas Cedar) y bloquea las que las reglas prohíben. Puede ejecutarse dentro de un TEE (entorno de ejecución de confianza: hardware que mantiene la memoria de un programa aislada incluso del propietario de la máquina), donde el agente que gobierna no puede alcanzarlo. Cada sesión termina con un recibo firmado, un TRACE Claim, que cualquiera puede verificar sin confiar en quien ejecutó la puerta de enlace. El recibo está respaldado por un informe de hardware cuando la puerta de enlace se ejecuta en un TEE, y solo está firmado (sin prueba de hardware) en modo software. ¿No conoces estos términos? Consulta [los términos, en lenguaje sencillo](https://agentrust-io.com/#plain-terms).
> **TL;DR:** Apunta tu agente a la puerta de enlace cMCP. Verifica cada llamada a herramienta contra tus reglas Cedar, bloquea o redacta (oculta) lo que las reglas deniegan, y te entrega un recibo firmado que muestra si alguien lo alteró. Ejecuta `pip install cmcp-runtime` y empieza en modo software en cualquier ordenador; no se requiere hardware especial.
Tu agente llama a Snowflake, Salesforce, una docena de API. ¿Qué le impide filtrar los datos de un cliente en alguna de esas llamadas? Si un regulador lo pregunta, ¿podrías demostrar que no lo hizo?
---
## El problema
Un agente llama a una herramienta. El motor de políticas dice permitir. La llamada a la herramienta se realiza.
Nada de eso demuestra que el propio motor de políticas no haya sido comprometido. La gobernanza MCP solo por software no puede garantizar:
- Que la política Cedar en disco sea la que se ejecutó. Un administrador malicioso puede sustituir el paquete después de su aprobación; la verificación de hash se ejecuta dentro del mismo sistema operativo que controla el administrador.
- Que la decisión de permitir/denegar no se haya invertido en memoria. Una CVE de la cadena de suministro en el evaluador se ejecuta en el mismo espacio de direcciones que el atacante.
- Que el registro de auditoría refleje lo que realmente ocurrió. Cualquier parte que posea la clave de firma de software puede reconstruir una cadena de auditoría válida a posteriori.
El plano de control que gobierna las llamadas a herramientas debe ejecutarse donde no pueda ser alcanzado por el proceso que gobierna.
Aplicación de políticas con atestación de hardware para llamadas a herramientas MCP. Cada llamada a herramienta se intercepta, se evalúa contra un paquete de políticas Cedar y se aplica mediante un motor de políticas que se ejecuta dentro de un Trusted Execution Environment (TEE). Antes de atender una sola llamada a herramienta, la puerta de enlace mide su código instalado, el paquete de políticas y la configuración en el informe de atestación de hardware, y vuelve a atestiguar cada vez que el paquete se recarga.
En un despliegue de hardware, el tiempo de ejecución de cMCP procesa las cargas útiles de las llamadas a herramientas dentro del TEE. Lo que el host y el proveedor de conectividad pueden leer también depende de la política de salida, y el servidor de herramientas ascendente es un componente separado fuera del TEE. El modo software (`CMCP_DEV_MODE`) no proporciona aislamiento de hardware. [LIMITATIONS.md](https://github.com/agentrust-io/cmcp/blob/main/LIMITATIONS.md) enumera lo que cMCP no impide.
---
## Inicio rápido
```bash
pip install cmcp-runtime
```
Cree `cmcp-config.yaml`:
```yaml
attestation:
provider: auto
enforcement_mode: advisory # advisory eases first-run tuning; the default is `enforcing`
listen_addr: "127.0.0.1:8443" # pin loopback: dev mode runs without a bearer token
policy_bundle_path: ./policies/
catalog_path: ./catalog.json
```
`listen_addr` no es opcional aquí. `CMCP_DEV_MODE=1` omite deliberadamente el
requisito del token bearer para que puedas probar cosas rápidamente, y el bind por defecto sigue siendo
`0.0.0.0:8443`. En 0.3.0 esa combinación levantaba un gateway sin autenticación
en todas las interfaces de tu máquina. A partir de 0.4.0 se rechaza: el modo de desarrollo sin token
solo puede enlazar una dirección de loopback, y un bind que no sea de loopback requiere
`CMCP_BEARER_TOKEN`. Fija `listen_addr` explícitamente y la configuración será correcta en
ambos casos.
Inicia el gateway:
```bash
CMCP_DEV_MODE=1 cmcp start --config cmcp-config.yaml
```
Hacer una llamada a la herramienta:
```bash
curl -X POST http://localhost:8443/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"salesforce.contacts","arguments":{"query":"Acme Corp"},"_cmcp":{"session_id":"s1","workflow_id":"demo-agent"}}}'
```
¿Prefieres una versión guiada? [agentrust-io.com/quickstart](https://agentrust-io.com/quickstart/)
recorre el mismo camino en unos diez minutos en un portátil, sin hardware y sin
registro: instala, escribe una regla Cedar `forbid`, observa cómo una llamada a herramienta devuelve 403
`POLICY_DENY` antes de llegar a un upstream, y luego verifica el recibo firmado.
Consulta [docs/quickstart.md](https://github.com/agentrust-io/cmcp/blob/main/docs/quickstart.md) para el recorrido completo: política Cedar, catálogo de herramientas, primer TRACE Claim y verificación (no se requiere TEE de hardware).
---
## Cómo funciona
1. El agente envía cada llamada a herramienta al cMCP Gateway en lugar de directamente a los servidores MCP.
2. Al arrancar, antes de atender tráfico, el gateway mide su código instalado, el bundle de políticas Cedar y la configuración. En SEV-SNP, TDX y Azure CVM el digest se vincula a `report_data`; en el nivel TPM se extiende a un índice NV certificado. Una recarga de políticas desencadena una nueva atestación.
3. Cada llamada a herramienta entrante es evaluada por el motor de políticas Cedar que se ejecuta dentro del TEE. El resultado es permitir, denegar o redactar. La llamada y su decisión se añaden a la cadena de auditoría sellada por hardware.
4. Al final de la sesión el gateway produce un TRACE Claim: un artefacto firmado y atestado por hardware que registra qué herramientas se ejecutaron, qué política decidió cada llamada y la cadena de auditoría completa. Un verificador comprueba esto sin confiar en el operador.
```
Agent -> cMCP Runtime -> Cedar Policy Engine (TEE) -> Tool
|
GatewayClaim (TRACE Profile)
+-- trace.eat_profile
+-- trace.runtime.platform + measurement
+-- trace.policy.bundle_hash
+-- trace.cnf.jwk (Ed25519 confirmation key)
+-- gateway.audit_chain (root/tip/length)
+-- signature (Ed25519 over canonical JSON)
```
---
## Proveedores de hardware
| Proveedor | Plataforma | Garantía | Notas |
|---|---|---|---|
| `tpm` | TPM 2.0 / vTPM (Azure, AWS, GCP Trusted Launch) | Media | Cita local del TPM |
| `sev-snp` | AMD SEV-SNP (Azure DCasv5, AWS C6a Nitro) | Alta | AMD KDS |
| `tdx` | Intel TDX (Azure DCedsv5, GCP C3) | Alta | Intel PCS |
| `gpu-cc` _(v0.2)_ | NVIDIA H100/H200/Blackwell (modo CC) | Alta | NVIDIA Remote Attestation Service (NRAS) |
Orden de sondeo para la autodetección de proveedores: `azure-cvm -> tpm -> sev-snp -> tdx`. Se selecciona el primer proveedor cuyo `detect()` tenga éxito. Si no se detecta ningún proveedor de hardware, la puerta de enlace solo se inicia bajo `CMCP_DEV_MODE=1` (un mecanismo de respaldo solo de software, sin atestación) y, de lo contrario, se niega a iniciarse.
```python
from cmcp_runtime.config import TEEProvider
# Auto-detect (default)
# attestation.provider: auto -> azure-cvm -> tpm -> sev-snp -> tdx
# (software-only is used only under CMCP_DEV_MODE=1)
# Explicit hardware selection
# attestation.provider: sev-snp
```
## Modos de aplicación
| Modo | Comportamiento | Caso de uso |
|---|---|---|
| `enforcing` | Las denegaciones de política devuelven HTTP 403; la llamada no se reenvía | Producción |
| `advisory` | Las denegaciones de política se registran; la llamada continúa | Primer despliegue, ajuste de políticas |
| `silent` | La política se evalúa pero no se registra ni se bloquea nada | Establecimiento de línea base |
El valor predeterminado es `enforcing`. Establezca `enforcement_mode: advisory` en `cmcp-config.yaml` para usar el modo advisory.
---
## Configuración
Referencia completa de `cmcp-config.yaml`:
```yaml
attestation:
provider: auto # auto | tpm | sev-snp | tdx | software-only
enforcement_mode: enforcing # enforcing | advisory | silent
validity_seconds: 86400 # attestation freshness window (default: 24 hours)
staleness_policy: fail_closed # fail_closed | warn_only
expected_measurement: ~ # pin a specific PCR/measurement (optional)
policy_bundle_path: policies/ # directory containing .cedar files and manifest.json
catalog_path: catalog.json # approved tool catalog
listen_addr: "127.0.0.1:8443" # tokenless dev mode is loopback-only; set CMCP_BEARER_TOKEN before binding wider
max_response_size_bytes: 2097152 # 2 MB default
policy_reload_interval_seconds: 0 # >0 with a pinned CMCP_POLICY_HASH refuses to start, see docs/spec/policy-hot-reload.md
```
Variables de entorno:
| Variable | Efecto |
|---|---|
| `CMCP_DEV_MODE=1` | Usar proveedor TEE solo de software; no se requiere hardware |
| `CMCP_BEARER_TOKEN` | Requerir este token bearer en todas las solicitudes entrantes |
---
## Referencia de la CLI
| Comando | Flags | Descripción |
|---|---|---|
| `cmcp start` | `--config PATH` (obligatorio) | Iniciar la puerta de enlace |
| `cmcp validate-config` | `--config PATH` (obligatorio) | Validar `cmcp-config.yaml` sin iniciar |
| `cmcp validate-bundle` | `--bundle-path PATH` (obligatorio), `--expected-hash sha256:<hex>` (obligatorio) | Verificar el hash de un bundle de Cedar antes del despliegue |
| `cmcp verify` | `CLAIM_FILE` (obligatorio); `--policy-hash`, `--catalog-hash`, `--max-age`, `--trusted-key`, `--trusted-tpm-ca`, `--audit-bundle`, `--agent-manifest`, `--agent-manifest-trust-anchor` | Verificar un TRACE Claim firmado (firma, esquema, frescura, cadena de auditoría, hashes fijados y anclas de confianza) |
---
## TRACE Claims
Un `GatewayClaim` es la unidad de prueba entregada a un auditor, regulador o verificador posterior. Se produce por sesión (o por llamada, configurable) y se firma con una clave que nunca sale del TEE.
| Campo | Descripción |
|---|---|
| `trace.eat_profile` | URI del perfil EAT: `tag:agentrust-io.com,2026:trace-v0.2` |
| `trace.runtime` | Plataforma TEE y medición de hardware registradas en el arranque del enclave |
| `trace.policy.bundle_hash` | SHA-256 del bundle de Cedar cargado al inicio; cambiar cualquier archivo de política cambia este valor |
| `trace.cnf.jwk` | Clave pública Ed25519 vinculada a la clave de firma del TEE |
| `trace.tool_transcript` | Vista por llamada derivada de la cadena de auditoría: `hash` (vinculado a la punta de la cadena de auditoría), `call_count` y `entries` que preservan la privacidad (nombre de la herramienta, clase de datos, decisión) |
| `gateway.audit_chain` | Raíz y punta del registro de auditoría encadenado por hash; verificable sin reproducir las entradas individuales |
| `signature` | Ed25519 sobre el JSON canónico del cuerpo completo del claim (RFC 8785) |
(Esta tabla es un resumen de los campos más usados.)
La verificación con la biblioteca `cmcp_verify` no requiere confiar en el operador. El verificador comprueba la firma contra la clave vinculada al TEE, el hash del bundle de políticas contra el valor aprobado y la cadena de auditoría en busca de consistencia interna.
El esquema normativo es [`schemas/trace-claim.schema.json`](https://github.com/agentrust-io/cmcp/blob/main/schemas/trace-claim.schema.json), y [docs/quickstart.md](https://github.com/agentrust-io/cmcp/blob/main/docs/quickstart.md) muestra un ejemplo completo. Consulte [docs/spec/verification-library.md](https://github.com/agentrust-io/cmcp/blob/main/docs/spec/verification-library.md) y la [especificación TRACE](https://trace.agentrust-io.com) para el protocolo de verificación completo.
---
## Alineación con estándares
| Estándar | Cobertura |
|---|---|
| OWASP Agentic AI Top 10 | MCP10 (fuga de datos mediante llamadas a herramientas), MCP02 (herramientas no autorizadas), MCP08 (gobernanza demostrable), MCP04 (cadena de suministro) |
| NIST SP 800-207 | Punto de decisión de políticas dentro del TEE; sin confianza implícita en la identidad de la carga de trabajo |
| EU AI Act Art. 12, 15 | Registros de auditoría por decisión (Art. 12); controles de ciberseguridad respaldados por TEE (Art. 15) |
| DORA Art. 9 | Cadena de atestación; retención del registro de auditoría mediante `gateway.audit_chain` |
| RATS/EAT RFC 9711 | `GatewayClaim` es un EAT; el campo `eat_profile` identifica el perfil TRACE |
---
## Seguridad
| Herramienta | Qué comprueba |
|---|---|
| ruff | Linting de estilo e importaciones en cada PR |
| bandit | Linting de seguridad de Python en cada PR |
| pip-audit | Escaneo de vulnerabilidades en dependencias en cada PR |
| mypy | Comprobación estática de tipos en cada PR |
| CodeQL | SAST de Python, consultas security-extended, semanal |
| OpenSSF Scorecard | Puntuación semanal, carga de SARIF |
Consulte [SECURITY.md](https://github.com/agentrust-io/cmcp/blob/main/SECURITY.md) para el reporte de vulnerabilidades y los SLA de respuesta. Consulte [LIMITATIONS.md](https://github.com/agentrust-io/cmcp/blob/main/LIMITATIONS.md) para los límites explícitos del alcance, incluidos los riesgos residuales de la captura de payloads de APM, la inyección de configuración en tiempo de ejecución y la cadena de suministro P4.1 (typosquat) que la Fase 1 no cierra.
---
## Documentación
| Página | Descripción |
|---|---|
| [docs/quickstart.md](https://github.com/agentrust-io/cmcp/blob/main/docs/quickstart.md) | De cero a la primera TRACE Claim en menos de 30 minutos |
| [docs/configuration.md](https://github.com/agentrust-io/cmcp/blob/main/docs/configuration.md) | Referencia completa de configuración con todos los campos y valores predeterminados |
| [docs/confinement.md](https://github.com/agentrust-io/cmcp/blob/main/docs/confinement.md) | Sandbox experimental del agente Linux, pruebas de omisión y supuestos de confianza |
| [docs/SPEC.md](https://github.com/agentrust-io/cmcp/blob/main/docs/SPEC.md) | Especificación del producto: taxonomía de problemas, arquitectura, matriz de cobertura |
| [docs/spec/threat-model.md](https://github.com/agentrust-io/cmcp/blob/main/docs/spec/threat-model.md) | Análisis STRIDE, modelo de adversario, riesgos residuales |
| [docs/spec/cedar-policy.md](https://github.com/agentrust-io/cmcp/blob/main/docs/spec/cedar-policy.md) | Referencia del lenguaje de políticas Cedar y esquema |
| [docs/testing/benchmarks.md](https://github.com/agentrust-io/cmcp/blob/main/docs/testing/benchmarks.md) | Benchmarks de latencia y rendimiento por proveedor de TEE |
---
## Preguntas frecuentes
### ¿Qué es cMCP?
cMCP (Confidential MCP Runtime) es una puerta de enlace de código abierto que aplica la política de llamadas a herramientas MCP dentro de un Entorno de Ejecución de Confianza (TEE) por hardware. Intercepta cada llamada a herramienta, la evalúa contra un paquete de políticas Cedar, aplica la decisión (permitir, denegar o redactar) y registra la llamada en una cadena de auditoría sellada por hardware.
### ¿En qué se diferencia cMCP de la gobernanza de MCP puramente software?
La gobernanza puramente software ejecuta el motor de políticas en el mismo sistema operativo al que puede llegar un operador o un CVE de la cadena de suministro, por lo que no puede demostrar que la política ejecutada fuera la aprobada ni que la decisión no se alterara en memoria. cMCP ejecuta el motor de políticas dentro de un TEE y mide su código y el paquete Cedar en el informe de atestación de hardware antes de atender una sola llamada, de modo que el plano de control no puede ser alcanzado por el proceso que gobierna.
### ¿Necesito hardware especial para probarlo?
No. Establece `CMCP_DEV_MODE=1` para usar el proveedor de TEE puramente software y ejecutar el quickstart completo sin un TEE de hardware. Los proveedores de hardware (TPM, AMD SEV-SNP, Intel TDX) se usan en producción.
### ¿Qué es una TRACE Claim?
Una TRACE Claim (un `GatewayClaim`) es un artefacto firmado y atestado por hardware que se produce por sesión. Registra qué herramientas se ejecutaron, qué política decidió cada llamada, el hash del paquete Cedar y la cadena de auditoría, y está firmado con una clave Ed25519 que nunca sale del TEE. Un verificador lo comprueba con la biblioteca `cmcp_verify` sin confiar en el operador.
### ¿Qué proveedores de TEE son compatibles?
TPM 2.0 / vTPM, AMD SEV-SNP e Intel TDX, con computación confidencial de GPU NVIDIA prevista para la v0.2. El orden de detección automática es VM confidencial de Azure, luego TPM 2.0 / vTPM, luego AMD SEV-SNP y luego Intel TDX; el proveedor puramente software se usa solo bajo CMCP_DEV_MODE=1.
### ¿Bajo qué licencia está cMCP?
MIT.
---
## Contribuir
[CONTRIBUTING.md](https://github.com/agentrust-io/cmcp/blob/main/CONTRIBUTING.md) · [GOVERNANCE.md](https://github.com/agentrust-io/cmcp/blob/main/GOVERNANCE.md) · [Discussions](https://github.com/orgs/agentrust-io/discussions)
Únete a la comunidad en [Discord](https://discord.gg/grgzFEHgkj).
¿Usas cMCP en producción? Añade tu organización a [ADOPTERS.md](https://github.com/agentrust-io/cmcp/blob/main/ADOPTERS.md).
---
## Licencia
MIT - consulta [LICENSE](https://github.com/agentrust-io/cmcp/blob/main/LICENSE).