Skip to main content

ensmcp

ensmcp

Servidor MCP con las medidas de seguridad del ENS (Anexo II del RD 311/2022): consulta el Anexo II, calcula la matriz normativa de aplicabilidad y genera un checklist de auditoría, sin conexión

Python Version CI Status MCP Server

GitHub Stars GitHub Issues Buy Me a Coffee


Qué es

ensmcp es un servidor MCP (Model Context Protocol) que pone las medidas de seguridad del ENS Navegable (Anexo II del RD 311/2022) al alcance de Claude Desktop, Claude Code y cualquier otro cliente MCP. Es un servidor independiente y no está afiliado, respaldado ni mantenido por el CCN, CCN-CERT o el CNI.

Los datos viajan incluidos en el paquete como un snapshot, así que el servidor responde al instante y funciona sin conexión. El modo predeterminado es offline: no abre Chrome ni accede a la red. --check-updates comprueba la fuente oficial sin sustituir el snapshot y --live permite adoptar temporalmente los datos vivos.

Además del Anexo II, incorpora el cuestionario de verificación de la guía CCN-STIC 808 (edición para el RD 311/2022): las preguntas de auditoría por medida, las comprobaciones sobre el articulado del RD y las evidencias documentales que puede pedir el auditor.

Características principales

Característica Descripción
Servidor MCP sobre stdio Integrable en Claude Desktop, Claude Code y otros clientes MCP
Funciona sin conexión El corpus completo viaja como snapshot en el paquete
Snapshot determinista El modo predeterminado sirve siempre el corpus empaquetado
Comprobación explícita --check-updates detecta cambios sin sustituir los datos servidos
Matriz de aplicabilidad Calcula la base normativa para preparar la Declaración de Aplicabilidad
Auditoría CCN-STIC 808 Temario de auditoría, requisitos esenciales, artículos del RD y evidencias documentales

Tools disponibles

Consulta del Anexo II

Tool Args Descripción
list_categories — Las categorías del Anexo II con su grupo (org, op, mp).
list_measures category_code?, dimension?, level? Medidas filtradas por categoría, dimensión de seguridad o nivel.
get_measure code Una medida por código exacto (p. ej. "org.1"), con su texto del RD, refuerzos y niveles.
search_measures query Búsqueda por texto en código, título, descripción y redacción del RD (ignora mayúsculas y tildes).

Declaración de Aplicabilidad y auditoría

Tool Args Descripción
declaracion_aplicabilidad confidencialidad?, integridad?, disponibilidad?, autenticidad?, trazabilidad? La matriz normativa base para preparar la DdA: se valora cada dimensión (bajo/medio/alto, u omitida) y devuelve las medidas exigibles con sus refuerzos.
alcance_auditoria mismas que la DdA El temario de auditoría del sistema: las medidas aplicables con sus preguntas de verificación acumuladas y el nivel de madurez mínimo exigible.
requisitos_auditoria code?, level? El cuestionario CCN-STIC 808 en bruto, por medida o por tramo, marcando los requisitos esenciales.
requisitos_articulos — Las comprobaciones de auditoría sobre el articulado del RD (DdA formal, categorización, INES...).
evidencias_auditoria code? La documentación que puede pedir el auditor, por medida.

Estado y actualización

Tool Args Descripción
refresh_live_page — Comprueba ahora el sitio oficial y actualiza los datos si han cambiado.
snapshot_status — Origen y frescura de los datos que se están sirviendo.

Qué devuelve una medida

Cada medida trae dos textos, y hacen falta los dos: norm_text es la redacción del RD 311/2022 (lo que la medida exige) y description es el cuestionario de la CCN-STIC 808 (lo que el auditor pregunta). Los refuerzos vienen emparejados con el nivel que los exige y con su redacción en el RD:

{
  "code": "mp.s.4",
  "title": "Protección frente a denegación de servicio",
  "description": "Categoría Media 1.1 ¿Se ha planificado y dotado al sistema de capacidad suficiente ...?",
  "norm_text": "Se establecerán medidas preventivas frente a ataques de denegación de servicio ...",
  "category_code": "mp.s",
  "dimensions": ["disponibilidad"],
  "levels": ["medio", "alto"],
  "reinforcements": [
    { "code": "R1", "level": "alto", "alternative": false, "text": "R1-Detección y reacción. ..." }
  ],
  "raw_levels": { "bajo": "n.a.", "medio": "aplica", "alto": "+ R1" }
}

alternative distingue los refuerzos obligatorios (+ R1 + R2) de los alternativos (+ [R1 o R2], donde basta uno cualquiera): confundirlos cambia lo que hay que implantar.

Declaración de Aplicabilidad

El ENS no aplica un nivel al sistema entero: aplica uno por dimensión. Se valora cada una y la tool devuelve lo que ese sistema debe cumplir:

{
  "categoria_sistema": "alta",
  "measures": [
    { "code": "op.acc.5", "title": "Mecanismo de autenticación (usuarios externos)",
      "required_level": "alto",
      "required_reinforcements": [
        { "code": "R2", "alternative": true,  "text": "R2-..." },
        { "code": "R5", "alternative": false, "text": "R5-..." }
      ] }
  ]
}

La regla sale del RD 311/2022: la categoría del sistema es el mayor de los niveles valorados (Anexo I, ap. 4), las medidas marcadas «Categoría» se exigen según la categoría del sistema, las que protegen dimensiones según el nivel de esas dimensiones, y una dimensión sin valorar deja fuera las medidas que solo la protegen.

Alcance de auditoría

Si la DdA contesta «¿qué tengo que implantar?», alcance_auditoria contesta «¿qué me va a preguntar el auditor?». Devuelve, por cada medida aplicable, los requisitos de verificación acumulados hasta su nivel exigible y el nivel de madurez mínimo que exige la guía:

Categoría Nivel mínimo de madurez
BÁSICA L2 — Reproducible, pero intuitivo
MEDIA L3 — Proceso definido
ALTA L4 — Gestionado y medible

El matiz importa: los tramos que el ENS Navegable etiqueta «Categoría Básica / Media / Alta» son acumulativos según la CCN-STIC 808 §5 — «Categoría Básica» significa exigible a todas las categorías, no solo para sistemas básicos. Un sistema de categoría media responde las preguntas de básica y las de media. Para un sistema C=alto, I=medio, D=bajo, A=medio, T=medio, el temario real son 382 preguntas (136 esenciales, cuyo incumplimiento bloquea la certificación), no las 73 de su tramo.

requisitos_articulos y evidencias_auditoria cubren la otra mitad de la auditoría: las comprobaciones sobre el articulado del RD (si la DdA existe y está suscrita, si el sistema está categorizado formalmente, si se reporta a INES...) y las 365 evidencias documentales que la guía propone. Estos datos salen de la CCN-STIC 808; el ENS Navegable no los publica.

De dónde salen los datos

  • src/ensmcp/data/anexo_ii.json — el corpus del ENS Navegable (medidas, textos del RD, cuestionario, aplicabilidad por niveles), capturado del sitio oficial. Cada consulta es un lookup en memoria.
  • src/ensmcp/data/guia_808.json — el dato extraído de la guía CCN-STIC 808 con su atribución (la guía en sí no se redistribuye). snapshot_status indica de qué edición procede.

Para regenerar el snapshot:

python scripts/build_snapshot.py

El servidor no abre Chrome ni usa la red por defecto. Para consultar cambios explícitamente:

ensmcp --offline
ensmcp --check-updates
ensmcp --live

También puede configurarse con ENSMCP_MODE=offline|check-updates|live.

Requisitos

  • Python 3.12-3.14

Solo para actualizar el snapshot (refresh_live_page, la comprobación de arranque, scripts/build_snapshot.py) hacen falta además:

  • Google Chrome instalado
  • Un display (o xvfb en servidores sin él)

Instalación

Para usar el servidor desde PyPI:

pip install ensmcp
ensmcp --offline

Para habilitar la comprobación live:

pip install "ensmcp[live]"
ensmcp --check-updates

Desarrollo

git clone https://github.com/seifreed/ensmcp.git
cd ensmcp
python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate
pip install -r pylock.toml   # versiones exactas, verificadas por hash
pip install -e . --no-deps   # el propio paquete, sin re-resolver
patchright install chromium

En Linux recién instalado puede hacer falta además:

patchright install-deps chromium

pyproject.toml es el único sitio donde se declaran las dependencias; pylock.toml es un artefacto generado a partir de él (PEP 751) que fija todas las dependencias —runtime y desarrollo juntas— a versión exacta y hash, con marcadores para Windows, Linux y macOS en x64 y ARM. Para actualizar dependencias, edita los rangos en pyproject.toml y regenera:

uv pip compile pyproject.toml --all-extras --universal --python-version 3.12 \
  --format pylock.toml -o pylock.toml

Inicio rápido

python -m ensmcp

Configúralo en un cliente MCP (p. ej. Claude Desktop / Claude Code) apuntando al intérprete del entorno virtual:

{
  "mcpServers": {
    "ensmcp": { "command": "ensmcp", "args": ["--offline"] }
  }
}

No hace falta configurar nada más: las consultas se responden desde el snapshot del paquete.

Para decisiones de conformidad prevalecen el BOE, las Instrucciones Técnicas de Seguridad, las guías oficiales vigentes y el criterio de la entidad auditora o de certificación correspondiente.

Para inspeccionarlo manualmente:

npx @modelcontextprotocol/inspector venv/bin/python -m ensmcp

Contribuir

Las contribuciones son bienvenidas.

  1. Haz un fork del repositorio
  2. Crea tu rama de funcionalidad (git checkout -b feature/nueva-funcionalidad)
  3. Haz commit de tus cambios (git commit -m 'Añade nueva funcionalidad')
  4. Sube la rama (git push origin feature/nueva-funcionalidad)
  5. Abre un Pull Request

Asegúrate de que todas las gates de calidad y seguridad pasen sin errores ni warnings antes de enviar el PR.

Apoya el proyecto

Si este proyecto te es útil, puedes apoyar su desarrollo:

Buy Me A Coffee

Autor


Las medidas del ENS, accesibles por MCP

Metadata

Release files for ensmcp 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ensmcp 0.1.1
File Size Uploaded
ensmcp-0.1.1.tar.gz 472.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ensmcp 0.1.1
File Interpreter ABI Platform
ensmcp-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 614.4 kB

Release files / ensmcp-0.1.1.tar.gz

Download URL ensmcp-0.1.1.tar.gz
Size 472.2 kB
Tags Source
SHA-256 checksum
How to use checksums
9cac5ea0552af5b6c37fa22be12669ce547e1ac39da84e9703a98ccf64a9c8d4
BLAKE2b-256 checksum
How to use checksums
94734db1e3ea53bceb087beaa1755c80f00a0d98a348292b4df4ff9d740f1505
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 25, 2026.

Transparency log

Release files / ensmcp-0.1.1-py3-none-any.whl

Download URL ensmcp-0.1.1-py3-none-any.whl
Size 142.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
977fec2810d147f566b08f62d762d1566fd093d89c9ea4cf7b196e4b382b3427
BLAKE2b-256 checksum
How to use checksums
6dedc78b5de97f0735242401772848a3801b1f7f5da194e374b2a6031e9c161a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 25, 2026.

Transparency log

Release history Release notifications | RSS feed

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page