mcpField
E
ensmcp

ensmcp

本地服务
github.com/seifreed法律与政务07 周前更新

关于 ensmcp

ensmcp 是可离线运行的 MCP 服务,用于查询西班牙 ENS 安全措施,并准备适用性声明和审计清单。它整合 RD 311/2022 附录 II 与 CCN-STIC 808 审计内容,也支持保存声明记录。

主要功能

  1. 01搜索和查看 ENS 安全措施
  2. 02按安全维度计算适用要求
  3. 03创建并跟踪适用性声明
  4. 04生成审计范围与证据清单
  5. 05加载版本化外部映射包

适用场景

  1. 01准备 ENS 适用性声明
  2. 02为系统编制审计清单
  3. 03跟踪实施状态和审计证据

MCP 相关

ensmcp 向 MCP 客户端提供 ENS 措施查询、适用性计算、声明管理、审计和映射工具。默认使用随包提供的快照离线运行;更新检查和实时数据需显式启用。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"seifreed-ensmcp": {
"command": "uvx",
"args": [
"ensmcp"
]
}
}
}
启动命令uvx ensmcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypiensmcp0.1.2

工具

19

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

ensmcp

ensmcp

提供 ENS 安全措施的 MCP 服务(RD 311/2022 附录 II):查询附录 II、计算规范适用性矩阵并生成审计检查清单,支持离线运行

Python 版本 CI 状态 MCP 服务

GitHub 星标 GitHub 问题 请我喝咖啡


简介

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_measurescategory_code?、dimension?、level?按类别、安全维度或级别筛选措施。
get_measurecode按精确代码获取一项措施(例如 "org.1"),包含其 RD 文本、增强要求和级别。
search_measuresquery按代码、标题、描述和 RD 措辞搜索文本(忽略大小写和重音符号)。
适用性声明与审计
工具参数描述
declaracion_aplicabilidadconfidencialidad?、integridad?、disponibilidad?、autenticidad?、trazabilidad?用于编制 DdA 的基础规范矩阵:评估每个维度(bajo/medio/alto,也可省略),并返回要求实施的措施及其增强要求。
evaluate_system_profileprofile按资产和服务计算最高级别,应用继承的配置文件,并评估子系统。
explain_applicabilitycode、profile、subsystem_id?说明决定某项措施的维度、级别、单元格、理由或配置文件规则。
create_ddarecord_id、profile、subsystem_id?创建持久化 DdA,包含 73 项措施及其适用性判定。
list_dda—列出已保存的 DdA,并概述其实施状态。
get_ddarecord_id获取完整 DdA。
update_dda_measure_statusrecord_id、code、implementation_status、...记录状态、负责人、证据、排除或补偿措施、监控和日期。
export_ddarecord_id、output_format导出为 json、csv、markdown、xlsx、ods 或 docx;内容以 base64 返回。
alcance_auditoria与 DdA 相同系统的审计大纲:适用措施、累计的验证问题,以及要求达到的最低成熟度级别。
requisitos_auditoriacode?、level?原始 CCN-STIC 808 问卷,可按措施或级别区间查询,并标出基本要求。
requisitos_articulos—对 RD 条款的审计检查(正式 DdA、分类、INES 等)。
evidencias_auditoriacode?审计员可能要求提供的文档,按措施列出。
交叉映射
工具参数描述
list_data_packsinclude_inactive?列出已配置的数据包,包括来源、版本、覆盖范围和有效期。
query_crosswalkpack_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ÁSICAL2 — 可复现,但依赖直觉
MEDIAL3 — 流程已定义
ALTAL4 — 已管理且可衡量

这里有一个重要细节: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

贡献

欢迎贡献。

  1. Fork 此仓库
  2. 创建功能分支(git checkout -b feature/nueva-funcionalidad)
  3. 提交更改(git commit -m 'Añade nueva funcionalidad')
  4. 推送分支(git push origin feature/nueva-funcionalidad)
  5. 创建 Pull Request

提交 PR 前,请确保所有质量和安全门禁均通过,且没有错误或警告。

支持项目

如果此项目对你有帮助,可以支持其开发:

请我喝杯咖啡

作者


通过 MCP 获取 ENS 措施

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。