ensmcp

io.github.seifreed由 GitHub 帳號 seifreed 發布v0.1.2更新於 Oct 24, 2026

Servidor MCP para consultar el ENS y mantener declaraciones de aplicabilidad auditables.

已驗證STDIO僅桌面知識與記憶安全與監控

概覽

AI 產生的概覽

本機 MCP 伺服器,讓助理離線查詢西班牙 ENS 安全措施(RD 311/2022 附件 II)與 CCN-STIC 808 稽核指引。

可以做什麼
依類別、安全構面或等級瀏覽與搜尋附件 II 的類別與措施,並查看每項措施的法規原文與強化要求。依各構面等級計算適用性矩陣,用於編製適用性聲明,並解釋某項措施為何適用。建立、列出、讀取、更新與匯出持久化的適用性聲明,包含措施狀態、負責人、證據與排除項目。產生稽核範圍,彙整 CCN-STIC 808 驗證問題、基本要求、條文檢查與文件證據。查詢具版本的對照資料包(如 ISO/IEC 27001 與 DORA),並查看快照來源與新舊程度。
適用情境
適合西班牙公部門法遵工作:編製或維護適用性聲明、將 ENS 措施對應到系統類別,或規劃 CCN-STIC 808 稽核。也適合希望在助理內離線完成這些查詢的團隊。
執行需求
需要 Python 3.12 至 3.14,並從 PyPI 本機安裝;預設透過 stdio 執行,無需額外設定。更新快照(線上檢查、重新整理工具、建置腳本)還需要安裝 Google Chrome 以及顯示環境或 xvfb。選用的 HTTP 傳輸需要至少 32 個字元的 ENSMCP_HTTP_TOKEN;ENSMCP_DATA_DIR、ENSMCP_MODE、ENSMCP_DATA_PACKS 與 ENSMCP_TRANSPORT 為選用設定。
安裝前請注意
適用性聲明預設寫入使用者家目錄下的磁碟檔案,並可被更新與匯出,應視為真正的法遵紀錄。HTTP 傳輸使用共用密鑰 Bearer 權杖而非 OAuth,權杖絕不可放在 URL 中;應維持僅監聽回送位址並置於 TLS 代理之後。線上模式與重新整理會存取官方網站並啟動 Chrome。此伺服器與 CCN、CCN-CERT 無關,法遵判斷以 BOE 官方文本與稽核機構標準為準。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 ensmcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[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.

La procedencia de los datos se documenta en DATA_LICENSE.md y la publicación en el registro MCP consta en MCP_REGISTRY.md.

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ísticaDescripción
Transportes MCPstdio por defecto y Streamable HTTP autenticado para despliegues controlados
Funciona sin conexiónEl corpus completo viaja como snapshot en el paquete
Snapshot deterministaEl modo predeterminado sirve siempre el corpus empaquetado
Comprobación explícita--check-updates detecta cambios sin sustituir los datos servidos
Matriz de aplicabilidadCalcula la base normativa para preparar la Declaración de Aplicabilidad
Auditoría CCN-STIC 808Temario de auditoría, requisitos esenciales, artículos del RD y evidencias documentales
Crosswalks externosCarga data packs versionados sin acoplar otros marcos al core

Tools disponibles

Consulta del Anexo II

ToolArgsDescripción
list_categories—Las categorías del Anexo II con su grupo (org, op, mp).
list_measurescategory_code?, dimension?, level?Medidas filtradas por categoría, dimensión de seguridad o nivel.
get_measurecodeUna medida por código exacto (p. ej. "org.1"), con su texto del RD, refuerzos y niveles.
search_measuresqueryBú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

ToolArgsDescripción
declaracion_aplicabilidadconfidencialidad?, 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.
evaluate_system_profileprofileCalcula máximos por activos y servicios, aplica perfiles heredados y evalúa subsistemas.
explain_applicabilitycode, profile, subsystem_id?Explica la dimensión, nivel, celda, justificación o regla de perfil que decide una medida.
create_ddarecord_id, profile, subsystem_id?Crea una DdA persistente con las 73 medidas y su decisión de aplicabilidad.
list_dda—Lista las DdA guardadas y resume sus estados de implantación.
get_ddarecord_idRecupera una DdA completa.
update_dda_measure_statusrecord_id, code, implementation_status, ...Registra estado, responsable, evidencias, exclusión o compensación, vigilancia y fechas.
export_ddarecord_id, output_formatExporta como json, csv, markdown, xlsx, ods o docx; el contenido se devuelve en base64.
alcance_auditoriamismas que la DdAEl 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_auditoriacode?, 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_auditoriacode?La documentación que puede pedir el auditor, por medida.

Crosswalks

ToolArgsDescripción
list_data_packsinclude_inactive?Lista packs configurados con fuente, versión, cobertura y vigencia.
query_crosswalkpack_id, ens_code?, external_reference?Consulta correspondencias en ambas direcciones, con paginación opcional.

Estado y actualización

ToolArgsDescripció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.

Los contratos públicos de entrada y salida están versionados en ens://schemas/v1/tools; cada tool también expone su schema individual en ens://schemas/v1/tools/{name}.

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:

json
{  "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:

json
{  "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.

Las DdA persistentes se guardan como JSON versionado mediante escritura atómica. Por defecto viven en ~/.ensmcp/dda; ENSMCP_DATA_DIR=/ruta cambia la raíz a /ruta/dda. Los estados admitidos son not_assessed, implemented, partially_implemented, not_implemented, excluded y compensated. Una exclusión exige motivo y una compensación exige al menos una medida compensatoria.

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íaNivel mínimo de madurez
BÁSICAL2 — Reproducible, pero intuitivo
MEDIAL3 — Proceso definido
ALTAL4 — 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:

bash
python scripts/build_snapshot.py

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

bash
ensmcp --offlineensmcp --check-updatesensmcp --live

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

Streamable HTTP autenticado

El transporte HTTP escucha únicamente en loopback y exige un Bearer token de al menos 32 caracteres:

bash
export ENSMCP_HTTP_TOKEN="$(openssl rand -hex 32)"ensmcp --transport http

El endpoint MCP queda en http://127.0.0.1:8000/mcp. Los clientes deben enviar Authorization: Bearer $ENSMCP_HTTP_TOKEN. Un cliente web también necesita que su Origin se autorice de forma exacta:

bash
ensmcp --transport http --allow-origin https://cliente.example

ENSMCP_TRANSPORT=http selecciona el mismo transporte. --host sólo acepta 127.0.0.1, localhost, ::1 u otra dirección loopback; --port cambia el puerto. Si un proxy inverso conserva un Host distinto, se autoriza con --allow-host mcp.example.

Para acceso desde otra máquina, mantén ensmcp en loopback y publícalo tras un proxy inverso con TLS. El token nunca debe ir en la URL. Este modo implementa autenticación por secreto compartido, no el flujo OAuth 2.1 para servicios MCP públicos o multiusuario; esos despliegues necesitan un gateway OAuth compatible.

Data packs independientes

Los crosswalks no forman parte del paquete Python ni se activan implícitamente. ENSMCP_DATA_PACKS acepta un fichero, un directorio con ficheros JSON o varias rutas separadas por el separador del sistema (: en Unix, ; en Windows):

bash
ENSMCP_DATA_PACKS=./packs ensmcp --offline

El repositorio incluye packs parciales para ISO/IEC 27001:2022 y DORA. Las relaciones DORA son editoriales y no equivalencias jurídicas. El pack NIS2 sólo registra el estado de la fuente: está inactivo y vacío porque el CCN retiró la CCN-STIC 892 anterior con efecto inmediato; puede inspeccionarse con include_inactive=true y no debe utilizarse como perfil vigente.

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:

bash
pip install ensmcpensmcp --offline

Para habilitar la comprobación live:

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

Desarrollo

bash
git clone https://github.com/seifreed/ensmcp.gitcd ensmcppython3 -m venv venvsource venv/bin/activate  # Windows: venv\Scripts\activatepip install -r pylock.toml   # versiones exactas, verificadas por hashpip install -e . --no-deps   # el propio paquete, sin re-resolverpatchright install chromium

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

bash
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:

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

Inicio rápido

bash
python -m ensmcp

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

json
{  "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:

bash
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

來源:README.md,提交 db056ac

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.2最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分