ensmcp について
ensmcpは、スペインのENSセキュリティ対策を参照し、適用宣言や監査チェックリストを作成するオフライン対応のMCPサーバーです。RD 311/2022の附属書IIとCCN-STIC 808の監査資料を収録し、宣言記録も保存できます。
主な機能
- 01ENS対策の検索と参照
- 02セキュリティ次元ごとの適用性評価
- 03適用宣言の作成と管理
- 04監査範囲と証拠一覧の生成
- 05バージョン管理された外部対応表の読み込み
活用シーン
- 01ENS適用宣言の準備
- 02システムの監査チェックリスト作成
- 03実装状況と監査証拠の追跡
MCP 対応
ensmcpは、ENS対策の検索、適用性評価、宣言管理、監査、対応表のツールをMCPクライアントに提供します。既定では同梱スナップショットでオフライン動作し、更新確認やライブデータ利用は明示的に選択します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
19掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
ensmcp
ENS(RD 311/2022 の附属書 II)のセキュリティ対策に対応した MCP サーバーです。附属書 II の参照、適用性に関する規範マトリクスの計算、監査チェックリストの生成をオフラインで行えます。
概要
ensmcp は、ENS Navegable(RD 311/2022 の附属書 II)のセキュリティ対策を、Claude Desktop、Claude Code、その他あらゆる MCP クライアントから利用できるようにするMCP(Model Context Protocol)サーバーです。独立したサーバーであり、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 | — | グループ(org、op、mp)ごとの附属書 II のカテゴリです。 |
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? | 適用可否の判断とともに、73 件の対策を含む永続的な DdA を作成します。 |
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} で公開しています。
対策が返す内容
各対策には 2 つのテキストがあり、どちらも必要です。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]。いずれか 1 つで足ります)を区別します。これらを混同すると、実装すべき内容が変わります。
適用宣言
ENS はシステム全体に 1 つのレベルを適用するのではなく、各次元に 1 つずつ適用します。それぞれを評価すると、ツールがシステムで満たすべき内容を返します。
{
"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 です。除外には理由が必要で、代替策には少なくとも 1 つの補完対策が必要です。
監査範囲
DdA が「何を実施する必要があるか?」に答えるものだとすれば、alcance_auditoria は「監査人から何を質問されるか?」に答えます。適用される各対策について、要求されるレベルまでに累積した検証要件と、ガイドが求める最低成熟度レベルを返します。
| カテゴリ | 最低成熟度レベル |
|---|---|
| BÁSICA | L2 — 再現可能だが、直感に依存 |
| MEDIA | L3 — 定義されたプロセス |
| ALTA | L4 — 管理され、測定可能 |
この点は重要です。ENS Navegable が「カテゴリ Básica/Media/Alta」とラベル付けしている区分は、CCN-STIC 808 §5 に従って累積されます。「カテゴリ Básica」は、すべてのカテゴリに求められるという意味であり、基本システムのみに求められるという意味ではありません。中カテゴリのシステムでは、基本の質問と中カテゴリの質問に回答します。C=alto、I=medio、D=bajo、A=medio、T=medio のシステムでは、実際の設問は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 トランスポートはループバックでのみリッスンし、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 を送信する必要があります。ウェブクライアントでは、
Origin も完全一致で許可する必要があります。
ensmcp --transport http --allow-origin https://cliente.example
ENSMCP_TRANSPORT=http は同じトランスポートを選択します。--host には
127.0.0.1、localhost、::1、またはその他のループバックアドレスのみを指定できます。--port でポートを変更できます。リバースプロキシが異なる Host を保持する場合は、
--allow-host mcp.example で許可します。
別のマシンからアクセスする場合は、ensmcp をループバックで稼働させたまま、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)で、Windows、Linux、macOS の x64 と ARM 向けのマーカーを含め、すべての依存関係(実行時と開発時の両方)を正確なバージョンとハッシュに固定します。依存関係を更新するには、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
貢献
貢献を歓迎します。
- リポジトリをフォークします
- 機能ブランチを作成します(
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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。