mcpField
C
cisa-cybersecurity-mcp-server

cisa-cybersecurity-mcp-server

リモート
github.com/cyanheadsセキュリティ12 週間前に更新
リポジトリ

cisa-cybersecurity-mcp-server について

cisa-cybersecurity-mcp-serverは、CISAのKEV、ICSアドバイザリー、SSVC判断点、最新アラートをセキュリティチームに提供します。CVEの一括確認とBOD 26-04の修正期限算出に対応し、APIキーは不要です。

主な機能

  1. 01複数のCVEをKEVと一括照合
  2. 02ベンダー、製品、期限でKEVを検索
  3. 03SSVC判断点とBOD 26-04の期限を取得
  4. 04ICSセキュリティアドバイザリーの検索と閲覧
  5. 05CISAの最新アドバイザリーとアラートを取得

活用シーン

  1. 01スキャン結果のCVEをKEVカタログと照合
  2. 02ベンダーや製品の期限超過脆弱性を特定
  3. 03資産の公開状況に応じた修正期限を把握
  4. 04産業制御製品のアドバイザリーを検索

MCP 対応

STDIOとStreamable HTTPに対応し、MCP経由で7つのツールと2つのリソースを公開します。公開されているCISAデータソースを使用し、キーは不要です。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://cisa-cybersecurity.caseyjhand.com/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npm@cyanheads/cisa-cybersecurity-mcp-server0.3.2

ツール

7
パラメーター型必須説明
topicenumはい返す参照ブロック:directives(BOD 26-04 Table 1 とその定義)、kev_fields、ssvc_values、sectors、advisory_id_formats、severity_bands、sources(このサーバーが現在保持するデータ)。directives | kev_fields | ssvc_values | sectors | advisory_id_formats | severity_bands | sources

詳細

@cyanheads/cisa-cybersecurity-mcp-server

MCP 経由で、BOD 26-04 の期限を含む CISA 既知の悪用された脆弱性、SSVC による優先順位付け、ICS アドバイザリーの全コーパス(CSAF)を利用できます。キー不要。STDIO または Streamable HTTP。

7 個のツール • 2 個のリソース

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

公開ホスト型サーバー: https://cisa-cybersecurity.caseyjhand.com/mcp


概要

CISA の脆弱性データを一か所に集約しています。既知の悪用された脆弱性カタログとその修復期限、CVE ごとの SSVC 判断ポイント、2010 年まで遡る ICS アドバイザリー、CISA の最新アラートを確認できます。スキャン対象の CVE をまとめて 1 回の呼び出しで KEV と照合したり、特定ベンダーの期限超過項目を見つけたり、BOD 26-04 の対応スケジュールを確認したりできます。API キーは不要です。

ツール
ツール説明
cisa_list_reference入力で使用する語彙(BOD 26-04 のスケジュール、KEV フィールド、SSVC 値、セクター、ID 形式、重大度区分)を説明し、サーバーが保持するデータを報告します
cisa_check_cve_status最大 200 個の CVE ID を 1 回の呼び出しで KEV と照合します。期限、期限超過状況、ランサムウェア関連およびフォレンジック・トリアージのフラグ、引用された指令を確認できます
cisa_search_kevベンダー、製品、CWE、追加日、期限、期限超過状況、ランサムウェアとの関連、フォレンジック・トリアージのティア、指令で KEV を検索します
cisa_get_ssvcCVE ごとに CISA が公開する SSVC 判断ポイントを取得し、指定された資産の露出状況に基づいて BOD 26-04 のスケジュールを算出します
cisa_search_ics_advisoriesベンダー、製品、CVE、CWE、KEV への登録状況、CVSS、重大度、セクター、シリーズ、日付、またはフリーテキストで ICS アドバイザリーを検索します
cisa_get_advisory1 件の ICS アドバイザリーを確認します。影響を受ける製品バージョン、CVE ごとの CVSS と CWE、修復策、セクター、改訂履歴を参照できます
cisa_get_alertsCISA のアドバイザリー、アラート、または ICS アドバイザリーのフィードから最新項目を一覧表示します
リソース
リソース説明
cisa://kev/{cveId}CVE ID による KEV カタログのエントリー 1 件
cisa://advisory/{advisoryId}CSAF 2.0 からフラット化した ICS アドバイザリー 1 件

どちらのリソースも上記のツールで完全にカバーされているため、ツールのみを使うクライアントでも機能は失われません。

機能リファレンス

cisa_list_reference ツール
  • 必須の topic は 1 つです。指定できる値は directives、kev_fields、ssvc_values、sectors、advisory_id_formats、severity_bands、sources です。インプロセス状態のみを読み取るため、ほかのツールが失敗している場合でも応答できます。
  • directives は、BOD 26-04 Table 1 の全 16 行を含む timelineTable(remediationTimelineDays と forensicTriageRequired を含む)、definitions、supersedes を追加します。sources は、KEV の catalogVersion、アドバイザリーインデックスの ready/documentCount/syncStatus、SSVC キャッシュの TTL、キャッシュされたフィードの期間を報告します。

cisa_check_cve_status ツール
  • 1 回の呼び出しで最大 200 件の cveIds を指定できます。キャッシュされた KEV スナップショットから応答し、上流へのリクエストは行いません。KEV に含まれない CVE はエラーではなく、inKev: false として返されます。
  • CVE ごとに、dateAdded、dueDate、daysUntilDue、overdue、requiredAction、knownRansomwareCampaignUse、forensicTriage、cwes[]、エントリーの注記に含まれるすべての URL を kind で型付けした references[]、3 状態の directive(BOD 26-04、BOD 22-01、または null)を返します。応答には catalog スナップショットと、期限の計算に使用した asOf 日付も含まれます。
  • detail: "summary" を指定すると、KEV に含まれる各レコードをトリアージ用フィールド(日付、期限の状態、ディレクティブ、ベンダーと製品のラベル、ランサムウェアとフォレンジックトリアージのフラグ)に絞り込みます。これにより、200 件すべてを含むバッチでも簡潔に保てます。デフォルトは full です。

cisa_search_kev ツール
  • フィルターは AND 条件で組み合わされます。vendorProject と product(CPE 名ではなく CISA 独自のラベル)、nameContains、cwe、cveIdPrefix、dateAddedFrom/dateAddedTo、dueBefore/dueAfter、overdue、ransomware、forensicTriage、directive(BOD 26-04/BOD 22-01/none)を指定できます。1 ページあたり最大 100 件(デフォルトは 25 件)で、不透明な cursor を使用します。dateAdded(デフォルト)または dueDate で並べ替えます。
  • totalCount と appliedFilters を報告します。該当結果が 0 件の場合は、原因となったフィルターと、それを外した場合に何件の結果が得られるかを示します。nameContains は大文字・小文字とアクセントを正規化したうえで a-z と 0-9 を検索し、除外したその他の文字があれば通知に記載します。
  • 型付きエラー:catalog_unavailable(再試行可能)、invalid_date_range、empty_search_text

cisa_get_ssvc ツール
  • 1 回の呼び出しで最大 50 件の cveIds を指定でき、それぞれについて最新の Vulnrichment を検索します。また、assetExposure は publicly_exposed、not_publicly_exposed、unknown(デフォルト。両方の分岐を返します)から指定できます。
  • CVE ごとに、CISA が公開している場合は found、exploitation、automatable、technicalImpact、cvss、cwes を返し、bod2604.timelines[] には tableRow、remediationTimelineDays、forensicTriageRequired を含めます。KEV エントリーには kevAssigned が追加され、露出状況が指定されている場合は assignmentAgrees も追加されます。
  • エンリッチメントのない CVE は、guidance を含む found: false として返されます。enrichment_source_unavailable(再試行可能)が発生するのは、すべての取得に失敗した場合のみです。
cisa_search_ics_advisories tool
  • タイトル、ベンダー名、製品名を対象とする全文検索 q のほか、vendor、product(大文字と小文字を区別しない部分一致)、cve、cwe、inKev、cvssMin / cvssMax、severity、sector、series(ICSA / ICSMA)、publisher(coordinator / other)、publishedFrom / publishedTo、revisedFrom / revisedTo で絞り込めます。revised(デフォルト)、published、maxCvss、relevance(q が必要)で並べ替えられます。1ページあたり最大50件(デフォルトは20件)で、不透明な cursor を使用します
  • 結果には advisoryId、最大20件の cves と cveCount、kevCves、severityDerived を含む maxCvss、sectors、url、csafUrl、attribution のほか、totalCount と appliedFilters が含まれます。該当結果が0件の場合は、原因となったフィルターが示されます。KEV スナップショットが読み込まれていない場合、kevCves は省略され、その旨が示されます
  • 型付きエラー:mirror_not_ready、mirror_busy、catalog_unavailable(再試行可能)、mirror_unavailable、invalid_cvss_range、invalid_date_range、relevance_sort_without_query、empty_search_text

cisa_get_advisory tool
  • advisoryId(任意のリビジョンサフィックス)、任意の sections(advisory、summary、products、vulnerabilities、revisionHistory、references、acknowledgments)、脆弱性エントリーを選択する cves、および完全一致で大文字と小文字を区別する製品定義を選択する productIds を指定できます。cves と productIds を指定すると、それぞれに対応するセクションも指定したことになります
  • kind: "full" を返します。sections を指定せずに読み込んだ結果が24,000バイトを超える場合は、セクションごとのバイト数と CVE ID を含む kind: "outline" を返します。その場合は sections を指定して再度呼び出してください
  • インデックスにない ID の場合、found: false と guidance、indexCheckpoint、indexLastSyncedAt を返します。ガイダンスには、勧告がインデックスより新しい可能性がある場合について記載されます
  • 型付きエラー:mirror_not_ready、mirror_busy(再試行可能)、mirror_unavailable、unknown_section、unknown_cve、cves_need_vulnerabilities_section、unknown_product_id、product_ids_need_products_section

cisa_get_alerts tool
  • feed:advisories(デフォルト)、alerts、または ics。limit は最大30で、上流ウィンドウのサイズを指定します。since(YYYY-MM-DD)でそのウィンドウ内を絞り込めますが、ウィンドウより前の日付は指定できません
  • 各項目には title、link、pubDate、summary(HTML タグを除去し、最大1,200文字に制限。切り詰められた場合は summaryTruncated で示されます)が含まれます。ICS の項目には、cisa_get_advisory 用の advisoryId も含まれます。window には itemCount、oldest、newest、upstreamWindowSize が含まれます
  • すべての応答に fetchedAt と stale が含まれます。更新に失敗した場合は、最後のウィンドウが古いデータとして返され、再試行方法が示されます。古いデータによる結果が空でも、何も公開されていない証拠にはなりません。キャッシュされたウィンドウがない場合は、feed_unavailable(再試行可能)が返されます

cisa://kev/{cveId} resource
  • 1件の KEV レコードを application/json として返します。形状は、デフォルトの detail: "full" を指定した cisa_check_cve_status の結果と同じです。KEV に含まれない CVE は、見つからない場合のエラーになります
  • 一覧には追加日時が新しい順に30件が返されます。cveId はスナップショットから最大100件の候補を補完します

cisa://advisory/{advisoryId} resource
  • フラット化された勧告1件を application/json として返します。cisa_get_advisory と同じく、24,000バイトを超える場合は概要に切り替わります。このテンプレートでは sections、cves、productIds を指定できないため、概要が返された場合はツールを使用して詳細を取得してください
  • 一覧にはリビジョン日時が新しい順に30件の勧告が返されます。advisoryId はインデックスから最大100件の候補を補完します

特徴

@cyanheads/mcp-ts-core を基盤としています。stdio および Streamable HTTP トランスポート、切り替え可能な認証(none/jwt/oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。

CISA 固有の機能:

  • アカウントやキーは不要で、4 つの公開ソースを利用できます。KEV JSON フィード、Vulnrichment、CSAF ICS アドバイザリーリポジトリ、CISA の RSS フィードです。
  • いずれのソースも検索機能を提供していないため、フィルターはローカルで実行します。KEV はメモリ内スナップショットを定期的に取得して変更を確認し、ICS アドバイザリーは FTS5 を備えた SQLite インデックスを使用します。日付フィルターには、YYYY-MM-DD 形式の実際の暦日を指定します。
  • 不正な KEV 更新は拒否され、最後に取得した有効なスナップショットが引き続き使用されます。有効なスナップショットがない場合、読み取り時に再試行可能な catalog_unavailable が返されます。
  • KEV、SSVC、アラートのツールは、アドバイザリーインデックスの初期化がバックグラウンドで行われている間も、最初のリクエストから利用できます。
  • BOD 26-04 Table 1 はデータとして含まれているため、計算されるタイムラインは、公表済みの判断ポイントをテーブルで参照したものです。これはコンプライアンスの判定ではなく、CISA の KEV 期限と照合せず、別途報告されます。

エージェントに適した出力:

  • すべてのレスポンスに出典情報を含めます。KEV の catalog バージョンと asOf 日付、検索の基となるインデックスのチェックポイント、すべてのアドバイザリーの url、csafUrl、attribution が含まれます。
  • 判別可能な出力を提供します。3 状態の directive、型付きの references[].kind、found/inKev のブール値、上流データで公表されていない深刻度レベルを示す severityDerived、復旧方法のヒントを含む型付きのエラー理由です。
  • 検索結果が空の場合や上流データに欠落がある場合は、その理由を説明します。検索結果が 0 件の場合は該当するフィルターを示し、既知の欠落に該当するフィルター(セクター関連の注記は 2017 年以降のみ、CVSS v2 のみのアドバイザリー、KEV の改訂タイムスタンプなし)についても明記します。詳しくは既知の制限事項をご覧ください。

はじめに

公開ホストインスタンス

公開インスタンス(https://cisa-cybersecurity.caseyjhand.com/mcp)を利用できます。インストールは不要です。Streamable HTTP を介して、任意の MCP クライアントから接続できます。

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "streamable-http",
      "url": "https://cisa-cybersecurity.caseyjhand.com/mcp"
    }
  }
}
セルフホスト/ローカル

以下を MCP クライアントの設定ファイルに追加します。API キーは不要です。

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/cisa-cybersecurity-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

または、npx を使用します(Bun は不要です)。

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/cisa-cybersecurity-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info"
      }
    }
  }
}

または、Docker を使用します。

{
  "mcpServers": {
    "cisa-cybersecurity-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MCP_TRANSPORT_TYPE=stdio",
        "-v", "cisa-mirror:/usr/src/app/.mirror",
        "ghcr.io/cyanheads/cisa-cybersecurity-mcp-server:latest"
      ]
    }
  }
}

Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します。

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
  • Bun v1.4.0 以降(または Node.js v24 以降)。
  • 認証情報は不要です。すべての上流ソースは、キー不要で公開されています。
インストール
  1. リポジトリをクローンします:
git clone https://github.com/cyanheads/cisa-cybersecurity-mcp-server.git
  1. ディレクトリに移動します:
cd cisa-cybersecurity-mcp-server
  1. 依存関係をインストールします:
bun install

設定

すべての変数は任意です。どの変数も設定されていなくても、サーバーは正常に動作します。

変数説明デフォルト
CISA_KEV_REFRESH_CRONKEV 更新ポーリングの Cron です。off にすると無効になります。*/30 * * * *
CISA_CSAF_MIRROR_PATHICS アドバイザリの SQLite インデックスへのパスです。<user cache dir>/cisa-cybersecurity-mcp-server/csaf.sqlite3
CISA_CSAF_MIRROR_AUTO_INIT初回実行時にバックグラウンドでインデックスを作成します。true
CISA_CSAF_REFRESH_CRONアドバイザリ更新の Cron です(起動時にも一度実行されます)。off にすると両方が無効になります。17 */6 * * *
CISA_VULNRICHMENT_CACHE_TTL_SECONDSキャッシュされた SSVC レコードの TTL です。21600
CISA_FEED_CACHE_TTL_SECONDS解析済み RSS フィード期間の TTL です。900
CISA_HTTP_TIMEOUT_MSすべての上流フェッチに対するリクエストごとのタイムアウト(ミリ秒)です。30000
MCP_TRANSPORT_TYPEトランスポートです。stdio または http を指定します。stdio
MCP_HTTP_PORTHTTP サーバーのポートです。3010
MCP_SESSION_MODEHTTP セッションモードです。stateless、stateful、または auto を指定します。stateless
MCP_AUTH_MODE認証方式です。none、jwt、または oauth を指定します。none
MCP_LOG_LEVELログレベルです(debug、info、warning、error など)。info
LOGS_DIRログファイルのディレクトリです(Node.js のみ)。<project-root>/logs
STORAGE_PROVIDER_TYPESSVC キャッシュのストレージバックエンドです。in-memory、filesystem、または supabase を指定します。in-memory
OTEL_ENABLEDOpenTelemetry を有効にします。false

任意の上書き設定の全一覧は .env.example を参照してください。

サーバーの実行

ローカル開発
  • ビルドして実行:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:stdio
    # or
    bun run start:http
    
  • チェックとテストを実行:

    bun run devcheck   # Lint, format, typecheck, security
    bun run test       # Vitest test suite
    bun run lint:mcp   # Validate MCP definitions against spec
    
ICS アドバイザリインデックス

2 つの ICS ツールとアドバイザリリソースは、CISA_CSAF_MIRROR_PATH にある CSAF コーパスのローカル SQLite インデックスを読み込みます。デフォルトでは、ユーザーのキャッシュディレクトリが使用されます。初回実行時にサーバーがバックグラウンドでインデックスを構築します。準備が整うまでは、これらの機能は再試行可能な mirror_not_ready を返し、トピック sources を指定した cisa_list_reference で進捗を確認できます。パスを開けない場合、ICS 機能は再試行できない mirror_unavailable で失敗しますが、他のすべてのツールは引き続き動作します。

同じインデックスを共有するプロセスは、順番に同期を行います。コンテナ、CI、または個別にシードする場合(CISA_CSAF_MIRROR_AUTO_INIT=false にし、更新を手動で行うには CISA_CSAF_REFRESH_CRON=off にします)は、スクリプトを直接実行してください。

bun run mirror:init      # full build, idempotent, safe to re-run after an interrupt
bun run mirror:refresh   # requires a completed mirror:init; fetches changed documents only
bun run mirror:verify    # readiness, sync status, checkpoint, count, content version, SQLite integrity; non-zero on failure

一時的な SQLite ロックが発生すると、再試行可能な mirror_busy が返されます。少し待ってから再試行してください。一部の更新後に処理が中断した場合、適用済みの行は引き続き読み取り可能で、失敗したドキュメントは次回に再試行されます。sources は syncStatus: partial と failedDocumentCount を報告し、mirror:refresh と mirror:verify はゼロ以外の終了コードを返します。

Docker
docker build -t cisa-cybersecurity-mcp-server .
docker run --rm -p 3010:3010 -v cisa-mirror:/usr/src/app/.mirror cisa-cybersecurity-mcp-server

Dockerfile のデフォルトは、HTTP トランスポート、ステートレスセッションモード、および /var/log/cisa-cybersecurity-mcp-server へのログ出力です。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。イメージでは CISA_CSAF_MIRROR_PATH=/usr/src/app/.mirror/csaf.sqlite3 が設定されています。コンテナを再作成してもアドバイザリインデックスを保持できるように、/usr/src/app/.mirror にボリュームをマウントしてください。イメージには mirror:* スクリプトが含まれているため、docker exec <container> bun run mirror:refresh を実行できます。

プロジェクト構成

ディレクトリ目的
src/index.tscreateApp() のエントリーポイントです。4 つのサービスを接続し、更新ジョブをスケジュールして、サーフェスを登録します。
src/configサーバー固有の環境変数を Zod で解析および検証します。
src/mcp-server/toolsツール定義(*.tool.ts)です。
src/mcp-server/resourcesリソース定義(*.resource.ts)です。
src/mcp-server/schemasKEV ツールおよびリソースとアドバイザリツールおよびリソースで共有する出力スキーマとレンダラーです。
src/reference静的な参照データです。BOD 26-04 Table 1、標準セクター名、CVSS バンドが含まれます。
src/services/kev-catalogKEV JSON フィードです。スナップショット、派生インデックス、条件付き更新を扱います。
src/services/vulnrichmentCVE ごとの SSVC エンリッチメント取得と TTL キャッシュです。
src/services/csaf-mirrorICS アドバイザリインデックスです。スキーマ、取り込み、正規化、クエリを扱います。
src/services/cisa-feeds3 つの RSS フィードを解析し、TTL 付きでキャッシュします。
scripts/ビルド、チェック、mirror:* コマンドです。
tests/src/ に対応する単体テスト、統合テスト、ファズテスト、スモークテストです。

開発ガイド

開発ガイドラインとアーキテクチャ上のルールについては CLAUDE.md/AGENTS.md を、実装済みの仕様については docs/design.md を参照してください。要点は次のとおりです。

  • ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックに try/catch は使用しないでください。
  • リクエスト単位のログには ctx.log を、テナント単位のストレージには ctx.state を使用してください。
  • 新しいツールとリソースは、src/mcp-server/*/definitions/index.ts のバレル経由で登録してください。
  • 外部ソースはラップしてください。生データを検証し、ドメイン型に正規化してから出力スキーマに従って返します。上流で省略されたフィールドを決して作り出さないでください。

貢献

Issue を歓迎します。提出前にチェックとテストを実行してください。

bun run devcheck
bun run test

ライセンス

Apache-2.0 — 詳細は LICENSE を参照してください。

ライセンスの対象はこのコードであり、提供されるデータではありません。KEV のエントリーは米国政府の著作物としてパブリックドメインで、Vulnrichment は CC0-1.0 ですが、CSAF リポジトリにはライセンスの記載がなく、多くのアドバイザリにはベンダーの文章が再掲載されています。そのため、再配布する前に各アドバイザリの url で再利用の権利を確認してください。このプロジェクトは CISA または Department of Homeland Security と提携しておらず、これらの組織から承認も受けていません。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。