关于 ensmcp
ensmcp 是可离线运行的 MCP 服务,用于查询西班牙 ENS 安全措施,并准备适用性声明和审计清单。它整合 RD 311/2022 附录 II 与 CCN-STIC 808 审计内容,也支持保存声明记录。
主要功能
- 01搜索和查看 ENS 安全措施
- 02按安全维度计算适用要求
- 03创建并跟踪适用性声明
- 04生成审计范围与证据清单
- 05加载版本化外部映射包
适用场景
- 01准备 ENS 适用性声明
- 02为系统编制审计清单
- 03跟踪实施状态和审计证据
MCP 相关
ensmcp 向 MCP 客户端提供 ENS 措施查询、适用性计算、声明管理、审计和映射工具。默认使用随包提供的快照离线运行;更新检查和实时数据需显式启用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
19收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
ensmcp
提供 ENS 安全措施的 MCP 服务(RD 311/2022 附录 II):查询附录 II、计算规范适用性矩阵并生成审计检查清单,支持离线运行
简介
ensmcp 是一个 MCP(Model Context Protocol)服务,让 Claude Desktop、Claude Code 和任何其他 MCP 客户端都能使用 ENS Navegable 的安全措施(RD 311/2022 附录 II)。这是一个独立服务,与 CCN、CCN-CERT 或 CNI 无关,也未获其认可或维护。
数据以快照形式随软件包一起分发,因此服务可即时响应并支持离线运行。默认模式为 offline:不会启动 Chrome,也不会访问网络。--check-updates 会检查官方来源,但不会替换快照;--live 则允许临时采用实时数据。
数据来源记录在 DATA_LICENSE.md 中,MCP 注册表中的发布记录见 MCP_REGISTRY.md。
除附录 II 外,还包含 CCN-STIC 808 指南(针对 RD 311/2022 的版本)中的验证问卷:按措施列出的审计问题、对 RD 条文的检查,以及审计员可能要求提供的文档证据。
主要特性
| 特性 | 描述 |
|---|---|
| MCP 传输方式 | 默认使用 stdio,并为受控部署提供经过身份验证的 Streamable HTTP |
| 支持离线运行 | 完整语料库以快照形式随软件包一起分发 |
| 确定性快照 | 默认模式始终提供软件包中的语料库 |
| 显式检查 | --check-updates 可检测变更,但不会替换所提供的数据 |
| 适用性矩阵 | 计算规范依据,为编制适用性声明做准备 |
| CCN-STIC 808 审计 | 审计内容、基本要求、RD 条文及文档证据 |
| 外部交叉映射 | 加载有版本管理的数据包,无需将其他框架耦合到核心中 |
可用工具
附件 II 查询
| 工具 | 参数 | 描述 |
|---|---|---|
list_categories | — | 附件 II 的类别及其分组(org、op、mp)。 |
list_measures | category_code?、dimension?、level? | 按类别、安全维度或级别筛选措施。 |
get_measure | code | 按精确代码获取一项措施(例如 "org.1"),包含其 RD 文本、增强要求和级别。 |
search_measures | query | 按代码、标题、描述和 RD 措辞搜索文本(忽略大小写和重音符号)。 |
适用性声明与审计
| 工具 | 参数 | 描述 |
|---|---|---|
declaracion_aplicabilidad | confidencialidad?、integridad?、disponibilidad?、autenticidad?、trazabilidad? | 用于编制 DdA 的基础规范矩阵:评估每个维度(bajo/medio/alto,也可省略),并返回要求实施的措施及其增强要求。 |
evaluate_system_profile | profile | 按资产和服务计算最高级别,应用继承的配置文件,并评估子系统。 |
explain_applicability | code、profile、subsystem_id? | 说明决定某项措施的维度、级别、单元格、理由或配置文件规则。 |
create_dda | record_id、profile、subsystem_id? | 创建持久化 DdA,包含 73 项措施及其适用性判定。 |
list_dda | — | 列出已保存的 DdA,并概述其实施状态。 |
get_dda | record_id | 获取完整 DdA。 |
update_dda_measure_status | record_id、code、implementation_status、... | 记录状态、负责人、证据、排除或补偿措施、监控和日期。 |
export_dda | record_id、output_format | 导出为 json、csv、markdown、xlsx、ods 或 docx;内容以 base64 返回。 |
alcance_auditoria | 与 DdA 相同 | 系统的审计大纲:适用措施、累计的验证问题,以及要求达到的最低成熟度级别。 |
requisitos_auditoria | code?、level? | 原始 CCN-STIC 808 问卷,可按措施或级别区间查询,并标出基本要求。 |
requisitos_articulos | — | 对 RD 条款的审计检查(正式 DdA、分类、INES 等)。 |
evidencias_auditoria | code? | 审计员可能要求提供的文档,按措施列出。 |
交叉映射
| 工具 | 参数 | 描述 |
|---|---|---|
list_data_packs | include_inactive? | 列出已配置的数据包,包括来源、版本、覆盖范围和有效期。 |
query_crosswalk | pack_id、ens_code?、external_reference? | 双向查询对应关系,可选分页。 |
状态与更新
| 工具 | 参数 | 描述 |
|---|---|---|
refresh_live_page | — | 立即检查官方网站,并在数据发生变化时更新。 |
snapshot_status | — | 当前提供的数据来源和新鲜度。 |
公共输入和输出契约按版本管理,位于
ens://schemas/v1/tools;每个工具还在
ens://schemas/v1/tools/{name} 提供单独的 schema。
措施返回的内容
每项措施都包含两段文本,二者缺一不可:norm_text 是 RD 311/2022 的措辞(即措施要求的内容),description 是 CCN-STIC 808 问卷(即审计员询问的内容)。增强要求会与其规定级别及 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 用于区分强制增强要求(+ R1 + R2)和可选增强要求(+ [R1 o R2],满足其中任意一项即可):混淆二者会改变需要实施的内容。
适用性声明
ENS 不会为整个系统指定一个级别:而是为每个维度分别指定一个级别。每个维度都会单独评估,工具会返回该系统必须满足的要求:
{
"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-..." }
] }
]
}
规则来自 RD 311/2022:系统类别取已评估级别中的最高级别(附件 I,第 4 节);标注为“类别”的措施根据系统类别确定是否必须实施;保护各维度的措施根据相应维度的级别确定是否必须实施;未评估的维度不适用仅保护该维度的措施。
持久化的 DdA 会以带版本号的 JSON 格式保存,并通过原子写入完成。默认存储在 ~/.ensmcp/dda;ENSMCP_DATA_DIR=/ruta 会将根目录改为 /ruta/dda。支持的状态为 not_assessed、implemented、partially_implemented、not_implemented、excluded 和 compensated。排除措施时必须填写理由,采用补偿措施时至少要指定一项补偿措施。
审计范围
如果 DdA 回答的是*“我需要实施什么?”,那么 alcance_auditoria 回答的就是“审计员会问我什么?”*。对于每项适用措施,它都会返回截至该措施要求级别的累计验证要求,以及指南要求的最低成熟度级别:
| 类别 | 最低成熟度级别 |
|---|---|
| BÁSICA | L2 — 可复现,但依赖直觉 |
| MEDIA | L3 — 流程已定义 |
| ALTA | L4 — 已管理且可衡量 |
这里有一个重要细节:ENS Navegable 标记为“基础/中等/高类别”的级别区间,会按照 CCN-STIC 808 §5 逐级累积——“基础类别”表示适用于所有类别,而不是仅适用于基础级系统。中等类别系统需要回答基础级和中等级别的问题。对于 C=高、I=中、D=低、A=中、T=中的系统,实际需要准备的内容是382 个问题(其中 136 个为关键问题,未满足将导致认证受阻),而不是其级别区间中的 73 个问题。
requisitos_articulos 和 evidencias_auditoria 涵盖审计的另一部分:对 RD 条文的核查(DdA 是否存在并已签署、系统是否已正式分类、是否向 INES 报告等),以及指南提出的 365 项文档证据。这些数据来自 CCN-STIC 808;ENS Navegable 并未发布这些数据。
数据来源
src/ensmcp/data/anexo_ii.json— ENS Navegable 的语料库(措施、RD 文本、问卷、按级别划分的适用性),从官方网站获取。每次查询都是内存查找。src/ensmcp/data/guia_808.json— 从 CCN-STIC 808 指南中提取的数据及其来源说明(指南本身不会重新分发)。snapshot_status表示数据来自哪个版本。
重新生成快照:
python scripts/build_snapshot.py
服务默认不会启动 Chrome,也不会访问网络。若要显式查询更新:
ensmcp --offline
ensmcp --check-updates
ensmcp --live
也可以通过 ENSMCP_MODE=offline|check-updates|live 进行配置。
带身份验证的 Streamable HTTP
HTTP 传输仅监听 loopback 地址,并要求提供至少 32 个字符的 Bearer 令牌:
export ENSMCP_HTTP_TOKEN="$(openssl rand -hex 32)"
ensmcp --transport http
MCP 端点为 http://127.0.0.1:8000/mcp。客户端必须发送
Authorization: Bearer $ENSMCP_HTTP_TOKEN。Web 客户端还需要精确授权其
Origin:
ensmcp --transport http --allow-origin https://cliente.example
ENSMCP_TRANSPORT=http 会选择相同的传输方式。--host 仅接受
127.0.0.1、localhost、::1 或其他 loopback 地址;--port 会更改
端口。如果反向代理保留了不同的 Host,可通过
--allow-host mcp.example 授权。
如需从其他计算机访问,请让 ensmcp 保持监听在 loopback 地址,并将其部署在启用 TLS 的
反向代理之后。切勿将令牌放入 URL。此模式使用共享密钥身份验证,不支持面向公开或多用户 MCP 服务的 OAuth 2.1 流程;此类部署需要兼容的 OAuth 网关。
独立数据包
交叉映射不属于 Python 包,也不会隐式启用。ENSMCP_DATA_PACKS 接受一个文件、一个包含 JSON 文件的目录,或多个由系统分隔符分隔的路径(Unix 上为 :,Windows 上为 ;):
ENSMCP_DATA_PACKS=./packs ensmcp --offline
仓库包含适用于 ISO/IEC 27001:2022 和 DORA 的部分数据包。DORA 关系为编辑性内容,不代表法律等同关系。NIS2 数据包仅记录来源状态:由于 CCN 立即撤回了之前的 CCN-STIC 892,该数据包处于非活动且为空的状态;可通过 include_inactive=true 检查,但不应将其用作当前有效配置文件。
要求
- Python 3.12-3.14
只有在更新快照时(refresh_live_page、启动检查、scripts/build_snapshot.py),还需要:
- 安装 Google Chrome
- 显示器(或在没有显示器的服务器上使用
xvfb)
安装
要从 PyPI 使用该服务:
pip install ensmcp
ensmcp --offline
要启用实时检查:
pip install "ensmcp[live]"
ensmcp --check-updates
开发
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
在新安装的 Linux 上,可能还需要:
patchright install-deps chromium
pyproject.toml 是声明依赖项的唯一位置;pylock.toml 是根据它生成的产物(PEP 751),它将所有依赖项——运行时和开发依赖项——固定到确切版本和哈希,并包含适用于 x64 和 ARM 架构的 Windows、Linux 和 macOS 标记。要更新依赖项,请编辑 pyproject.toml 中的版本范围并重新生成:
uv pip compile pyproject.toml --all-extras --universal --python-version 3.12 \
--format pylock.toml -o pylock.toml
快速开始
python -m ensmcp
在 MCP 客户端(例如 Claude Desktop / Claude Code)中进行配置,指向虚拟环境中的解释器:
{
"mcpServers": {
"ensmcp": { "command": "ensmcp", "args": ["--offline"] }
}
}
无需进行其他配置:查询会使用包中的快照进行响应。
对于合规决策,应以 BOE、安全技术说明、现行官方指南以及相应审计或认证机构的判断为准。
要手动检查:
npx @modelcontextprotocol/inspector venv/bin/python -m ensmcp
贡献
欢迎贡献。
- Fork 此仓库
- 创建功能分支(
git checkout -b feature/nueva-funcionalidad) - 提交更改(
git commit -m 'Añade nueva funcionalidad') - 推送分支(
git push origin feature/nueva-funcionalidad) - 创建 Pull Request
提交 PR 前,请确保所有质量和安全门禁均通过,且没有错误或警告。
支持项目
如果此项目对你有帮助,可以支持其开发:
作者
- Marc Rivero López | @seifreed
- 仓库:github.com/seifreed/ensmcp
通过 MCP 获取 ENS 措施
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。