mitre-cwe-mcp-server について
MITRE CWEの脆弱性とCAPEC攻撃パターンを調べるMCPサーバーです。セキュリティ研究者や開発者が、緩和策やコード例を確認し、カタログ間の記録済みマッピングをたどれます。
主な機能
- 01CWE脆弱性とCAPECパターンの検索
- 02緩和策とコード例の取得
- 03ビューとCWE階層の閲覧
- 04CWE、CAPEC、ATT&CKのマッピング確認
活用シーン
- 01ソフトウェアの脆弱性と緩和策の調査
- 02CWEに関連する攻撃パターンの検索
- 03CWEビュー内の脆弱性メンバーの閲覧
MCP 対応
STDIOまたはStreamable HTTPを通じて、カタログ検索、詳細取得、階層の探索など7種類のツールをMCPクライアントに提供します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mitre-cwe.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-mitre-cwe https://mitre-cwe.caseyjhand.com/mcp{"mcpServers":{"cyanheads-mitre-cwe":{"type":"http","url":"https://mitre-cwe.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-mitre-cwe":{"type":"http","url":"https://mitre-cwe.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-mitre-cwe":{"type":"http","url":"https://mitre-cwe.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-mitre-cwe":{"serverUrl":"https://mitre-cwe.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
@cyanheads/mitre-cwe-mcp-server
MCP を通じて、MITRE CWE の弱点や CAPEC の攻撃パターン、緩和策、コード例、マッピングを調べられます。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://mitre-cwe.caseyjhand.com/mcp
概要
MITRE の CWE と CAPEC のカタログは、ソフトウェアやハードウェアの弱点と攻撃手法を結び付けています。根本原因を検索し、緩和策やコード例を確認し、CWE のビューや最新の階層をたどり、記録された CWE → CAPEC → ATT&CK のマッピングを追跡できます。
ツール
| ツール | 説明 |
|---|---|
cwe_list_reference | ビュー、フィルタリング用語、ワークフローのガイダンス、カタログの更新状況を確認します |
cwe_get_weakness | 選択したセクションと完全な例のページを含め、CWE の弱点またはカテゴリを取得します |
cwe_get_attack_pattern | 前提条件、実行手順、緩和策、メンバー、記録されたマッピングなど、CAPEC の攻撃パターン、カテゴリ、ビューを取得します |
cwe_search_weaknesses | テキスト、プラットフォーム、抽象化レベル、影響、ステータス、マッピングの使用状況、ビュー、分類体系マッピング(CERT C ARR30-C)、または確認された事例の CVE で弱点を検索します |
cwe_search_attack_patterns | テキスト、CWE または ATT&CK のマッピング、抽象化レベル、深刻度、または可能性で CAPEC を検索します |
cwe_get_view | CWE ビューのメタデータと、公開順の直接のメンバーを確認します |
cwe_get_hierarchy | ビュー内の最新の CWE の親、子、祖先、または子孫をたどります |
機能のリファレンス
cwe_list_reference tool
topic:views、abstraction_levels、mitigation_phases、platforms、relationship_natures、filter_values、workflow、versionsのいずれか。ラベルに対する全トークン一致のfilterは任意で、下記の単語先頭および境界付きプレフィックスルールを使用します(scriptでJavaScriptが見つかります)viewsは、すべてのCWEビューとその直接のメンバー数、およびフィルター定義ビューのfilterDefinitionを一覧表示しますfilter_valuesは、脆弱性のステータス、マッピングの使用状況、分類体系名、影響結果、CAPECのステータス、重大度、発生可能性を一覧表示します- リストは
limit(既定値20、最大100)とpagination.nextCursorでページ分割されます。versionsでは、読み込まれた各カタログのバージョン、日付、件数、更新エラーも追加されます
cwe_get_weakness tool
- CWE IDを1~200個指定できます(
CWE-79、CWE79、cwe 079、CWE_79、79)。呼び出しごとに処理される異なる項目は最大20個で、残りはdeferredIdsに返されます。不正な形式の項目はバッチを失敗させずにnotFoundに返されます。空白以外の制御文字を含む項目、またはIDではない項目が150文字を超える場合に限り、呼び出しは拒否されます sections:summary、consequences、mitigations、relations、examples、detection、observed、platforms、mappings、notes(既定値:最初の4項目)。[]を指定すると概要を返しますsummaryには、記録された別名(XSS)、序数性(Primary、Resultant、Indirect)、背景の詳細が含まれます。platformsでは機能領域と影響を受けるリソースが追加され、relationsでは関連する各脆弱性が示されます。notesは、Relationship、Maintenance、Terminology、Research Gapなど、MITREが脆弱性とカテゴリについて記録しているすべての注記を返しますentries[].kindはfull、partial(既定のセクションが応答予算に収まらない場合、各セクションのサイズがoutlineに一覧表示され、noticeで完全な応答サイズに基づいて再呼び出しをグループ化します。例のパラメーターはexamplesグループにのみ保持されます)、またはoutlineです。notFound[].reasonはnot_found、wrong_type(cwe_get_viewの対象となるビュー、または別カタログの接頭辞付きID)、またはinvalid_id(IDではない項目。前後の空白を削除してそのまま返されます)です。NVD-CWE-noinfoとNVD-CWE-Otherには、それぞれ個別の案内が表示されます。カテゴリもここで解決されます- 例は
exampleLanguageで絞り込み、exampleOffset(既定値0)、exampleLimit(既定値3、固定の上限なし)、examplePage.nextOffsetでページ分割します。sectionsを省略した場合、3つのパラメーターのいずれかを既定値以外に設定すると、既定の項目の後にexamplesが追加されます(ページサイズと、収まらない場合の再呼び出し方法が概要に記載されます)。examplesを含まない明示的なsectionsではこれらのパラメーターは無視され、guidanceにはexamplesを追加する再呼び出し方法が示されます。各例には、順序どおりの文章とコードが保持され、コードはMITREのページと同様に配置されます(インデントレベルごとに4つのスペース)。また、例が引用する参考文献がreferencesに一覧表示されます
cwe_get_attack_pattern ツール
- 1~200 個の CAPEC ID(
CAPEC-66、CAPEC66、capec_066、または66)。非推奨および廃止済みの項目も含みます。1 回の呼び出しにつき重複しない項目は最大 20 件で、残りはdeferredIdsに入ります sections:summary、prerequisites、execution、skills、consequences、mitigations、examples、relations、mappings、notes(デフォルトでは、パターンの場合は summary、prerequisites、execution、mitigations、mappings、カテゴリとビューの場合は summary と relations)。[]を指定すると概要を返しますentries[].typeはattack_pattern、category、viewのいずれかです。abstractionを持つのはパターンのみです。カテゴリまたはビューのrelationsには、ソースでの順序どおりに直接のmembersが列挙されます。フィルターで定義されたビューの場合は、ソースの XPath がfilterDefinitionとして記載されます。mappingsとnotesには、記録された分類マッピング、参照情報、MITRE の注記が含まれます- カテゴリ別にパターンを参照するには、ビュー
CAPEC-1000(攻撃のメカニズム)またはCAPEC-3000(攻撃のドメイン)から始めてください cwe_get_weaknessと同じentries[].kindおよびnotFoundの仕様です。CAPEC のパターン、カテゴリ、ビューはすべてここで解決されるため、wrong_typeが示すのはプレフィックス付きの CWE ID のみです。マッピングには、記録された CWE ID と ATT&CK ID が保持されます
cwe_search_weaknesses ツール
- 任意の
filterは、名前、MITRE が記録した別名(XSS、ReDoS、UAF)、説明、拡張説明に含まれるすべてのトークンを対象にします。また、正確なlanguage、technology、abstraction、consequenceImpact、status、mappingUsage、taxonomyName、taxonomyEntryId、observedCveId、viewIdでも絞り込めます。フィルターを指定しない場合は、カタログを参照します filterのトークンは、単語の先頭、_の後、またはキャメルケースの区切り位置に一致します(dosは ReDoS に一致します)。Unicode 文字が 4 文字以上のトークンは、単語の先頭にあるunまたはmisという接頭辞 1 つの直後にも一致します(trustedは untrusted に、configは misconfiguration に一致します)。接頭辞が再帰的に取り除かれることはありません。スペルの偶然の一致は起こり得ます。それ以外の複合語は入力どおりに検索されます。serializationは CWE-502 に一致せず、deserializationは一致します。数字で終わるトークンは、その後に別の数字が続く箇所には一致しません(79は RFC 793 を除外します)- 各結果には、MITRE の
mappingUsage(Allowed、Allowed-with-Review、Prohibitedなど)が含まれます。これは、そのエントリーを脆弱性のマッピングに使用できるかどうかを示します taxonomyName(CERT C Secure Coding、ISA/IEC 62443など)とtaxonomyEntryId(ARR30-C、A1など。大文字と小文字は区別しません)を指定すると、分類マッピングが記録された弱点を検索します。両方を指定した場合、同じ 1 件のマッピング上で一致する必要があります。observedCveId(CVE-2021-44228など)を指定すると、MITRE が観測例としてその CVE を引用している弱点を検索します。NVD の CVE と CWE の割り当ては対象外です。各結果には、一致したすべてのマッピング(matchedTaxonomyMappings)または観測例(matchedObservedExamples)が一覧表示されますviewIdを指定すると、同じビュー内のメンバーシップが推移的に含まれます。フィルターで定義されたビューの場合は、ソースの XPath フィルターで選択される弱点(CWE-658 C、CWE-702 Implementation など)が含まれます。カテゴリは除外されます。デフォルトでは、すべてのステータスが対象です- 名前または 1 つの別名ですべてのトークンに一致するものを最上位に、次に説明で一致するもの、その次にその他の一致、最後に数値 ID の順に並べます。プレビューには最初の文が含まれ、
cwe_get_weaknessはsummaryに別名を返します。limitのデフォルトは 20、最大は 100 です。pagination.nextCursorで続きを取得できます
cwe_search_attack_patterns tool
- 名前、記録済みの別表記(
MITM)、説明に対する、すべてのトークンを使った任意のfilterです。cwe_search_weaknessesと同じ単語先頭および範囲指定プレフィックスのルールを使用し、さらにcweId、attackTechniqueId、abstraction、severity、likelihoodで絞り込めます。CWEのマッピングは完全一致し、親ATT&CKテクニックには記録済みのサブテクニックが含まれます includeInactive(既定値はfalse)を指定すると、DeprecatedおよびObsoleteのパターンも含まれます。名前または1つの別表記に含まれるすべてのトークン、説明に含まれるすべてのトークン、その他の一致、数値IDの順に順位付けされます。cwe_get_attack_patternはsummaryに別表記を返します。limitの既定値は20、最大値は100です。pagination.nextCursorで続行できます
cwe_get_view tool
- 1つのビュー
id(cwe_list_referenceのトピックviewsから指定)。limitの既定値は20、最大値は100です。pagination.nextCursorで続行できます - 目的、対象者、ステータス、フィルター定義、記録済みの注記、および公開順の直接の
membersを返します。ナビゲーションビューには最上位のメンバーのみが表示されます。子孫を取得するにはcwe_get_hierarchyを使用します - フィルターで定義されたビューにはメンバーが表示されません。
filterDefinitionにはソースのXPathが含まれ、viewIdを指定してcwe_search_weaknessesを呼び出すと、そのフィルターが選択する脆弱性が返されます。サーバーが評価しない部分を含むフィルターは、その旨がguidanceに記載されます。この検索は通知とともに結果を返しません found: falseにはnot_foundまたはwrong_typeが含まれます
cwe_get_hierarchy tool
- 1つのCWE
idとdirectionを指定します。directionはparents、children、ancestors、descendantsのいずれかです。viewIdの既定値は1000で、すべてのビューを対象にする場合はallを指定します。primaryOnlyは祖先にのみ適用されます。親と子にはカテゴリおよびビューの関係が含まれ、同じビューのツリーの第1階層と一致します - ビューにスコープされた
nodes、親から子へのedges、found、retrievedAt、hierarchyFingerprintを返します。関係が空でも正常に処理されます。上流の障害はエラーとなり、一時的なMITREによる拒否(HTTP 403)は数分後に再試行できます。ノード名は読み込み済みのカタログに基づくため、ライブAPIの情報より遅れる場合があります - 合計タイムアウトにはキューの待ち時間も含まれます。期限切れは再試行可能な
hierarchy_timeoutとなり、呼び出し元によるキャンセルは再試行できません。ソースに記録されたrelationsはcwe_get_weaknessで引き続き利用できますが、ライブの子や子孫の情報の代わりにはなりません limitの既定値は20、最大値は100エッジです。各ページには、そのエッジが参照するノードのみが表示されます。ただし、最初のページではエッジのないルートも表示されます。pagination.nextCursorを呼び出すたびにトラバーサルが再取得されます。トポロジーまたはカタログが変更された場合はinvalid_cursorとなるため、カーソルを指定せずに再開してください
機能
@cyanheads/mcp-ts-core をベースにしています。stdio および Streamable HTTP トランスポート、切り替え可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレース機能を備えた構造化ログを提供します。
MITRE 固有の機能:
- API キーは不要です。サーバーがリクエストを受け付ける前に、両方の XML カタログをメモリに読み込みます。ダウンロードに成功すると、それぞれのコピーをキャッシュディレクトリ(
CWE_CACHE_DIR)に保存します。次回の起動時には、MITRE の応答を待たずに保存済みのコピーを読み込むため、MITRE にアクセスできない場合でも再起動できます。初回起動時、または使用可能な保存済みコピーがない状態で起動する場合は、MITRE の CWE および CAPEC ダウンロード元へのアクセスが必要です - CWE は 24 時間ごとに新しいバージョンを確認し、CAPEC は毎週更新されます。キャッシュから読み込んだカタログは起動直後に確認し、確認に失敗している間は 5、10、20、40 分後、以降は 60 分ごとに再確認します。更新に失敗しても読み込み済みのデータは保持されます。失敗状況は
cwe_list_referenceのversionsトピックに表示され、各カタログがキャッシュとダウンロードのどちらから読み込まれたかも報告されます - MITRE は、同一アドレスから短時間に多数のリクエストが届くと、数分間 HTTP 403 を返すことがあります。カタログのダウンロード、バージョン確認、階層取得の各処理では、これを一時的な再試行可能な失敗として報告し、直ちに再試行しません
- 階層取得のリクエストはライブ CWE REST API に送信され、複数の親とビューの識別情報を保持します。検索と詳細取得はローカルカタログに対して実行されます
- MITRE のステータスと存在しないセクションは、明示的に示されます。CAPEC のマッピングと実行フローは不完全です。マッピングが見つからないことは、関係が存在しないことや、ATT&CK ID が最新であることを示すものではありません
エージェント向けの出力:
- すべての応答に、カタログのバージョンと日付、読み込み時刻、ソースへのリンク、帰属情報を含む出典情報を付与します
- 両方の出力サーフェスで、エンリッチメントを含めて合計 24,000 バイトの上限を設けています。上限を超える場合、ID、項目、エッジは全体を次の呼び出しに繰り越します。デフォルトの詳細選択では、収まらないセクションを全体ごと省略し、再呼び出しが必要なセクション名を示します。明示的に選択した内容は完全な状態で返されます。単一のレコードまたは項目が上限を超える場合は、通知を添えて全体を返します
deferredIds、pagination.nextCursor、またはexamplePage.nextOffsetを使って続きを取得できます。古いカーソルはinvalid_cursor、不明な語彙はunknown_filterでエラーになります。後者のメッセージには、フィールド名と値、および対応する値か、それらを示すcwe_list_referenceトピックが記載されます- CWE と CAPEC の ID 入力では、任意の大文字・小文字の接頭辞の後に
-、_、スペース、または何も付けない形式を受け付け、先頭のゼロは除去します。ATT&CK のテクニック ID は、大文字・小文字を問わずTの有無を問わず、TddddまたはTdddd.dddの形式を受け付けます(T1059、t1059.001、1059)。単一の ID の形式が正しくない場合は、不正な引数としてエラーになり、メッセージに受け付ける形式が記載されます content[]とstructuredContentには同じ値が含まれ、サンプルコードも同じ順序で含まれます。カタログの説明文とコードは参照データであり、指示ではありません
はじめに
公開ホストインスタンス
公開インスタンスは https://mitre-cwe.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP を使って、任意の MCP クライアントを接続します。
{
"mcpServers": {
"mitre-cwe-mcp-server": {
"type": "streamable-http",
"url": "https://mitre-cwe.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加します。
{
"mcpServers": {
"mitre-cwe-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/mitre-cwe-mcp-server@latest"],
"env": { "MCP_TRANSPORT_TYPE": "stdio", "MCP_LOG_LEVEL": "info" }
}
}
}
または npx を使います(Bun は不要です)。
{
"mcpServers": {
"mitre-cwe-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/mitre-cwe-mcp-server@latest"],
"env": { "MCP_TRANSPORT_TYPE": "stdio", "MCP_LOG_LEVEL": "info" }
}
}
}
または Docker を使います。
{
"mcpServers": {
"mitre-cwe-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "-v", "mitre-cwe-cache:/usr/src/app/.cache", "ghcr.io/cyanheads/mitre-cwe-mcp-server:latest"]
}
}
}
名前付きボリュームにより、カタログのキャッシュは --rm を指定したコンテナ間で保持されるため、次回の起動時に MITRE へアクセスする必要はありません。
Streamable HTTP の場合は、トランスポートを設定してサーバーを起動します。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp after both catalogs load
前提条件
- Bun v1.4.0 以降(または Node.js v24 以降)。
- カタログのダウンロード(キャッシュを埋めるために少なくとも一度)には
cwe.mitre.orgとcapec.mitre.orgへの HTTPS アウトバウンドアクセスが必要です。また、バージョン確認とライブ階層取得にはcwe-api.mitre.orgへのアクセスが必要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/mitre-cwe-mcp-server.git
- ディレクトリに移動します:
cd mitre-cwe-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env for optional transport, authentication, and logging settings
設定
環境変数は必要ありません。カタログのソース、更新間隔、応答制限は固定されており、フレームワークのストレージ設定ではこれらのカタログは永続化されません。
| 変数 | 説明 | デフォルト |
|---|---|---|
CWE_CACHE_DIR | 最新の正常な CWE および CAPEC のダウンロードファイル(cwec_latest.xml.zip、capec_latest.xml。それぞれに .json レコードが付属)の保存先ディレクトリです。相対パスは作業ディレクトリを基準に解決されます。MITRE に接続できない状態で空のキャッシュにデータを用意するには、ダウンロードしたファイルをこれらの名前でコピーしてください。 | ユーザーのキャッシュディレクトリ(~/Library/Caches、%LOCALAPPDATA%、または $XDG_CACHE_HOME / ~/.cache)内の mitre-cwe-mcp-server。Docker では /usr/src/app/.cache |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポート。 | 3010 |
MCP_HTTP_HOST | HTTP のバインドアドレス。 | 127.0.0.1 |
MCP_SESSION_MODE | HTTP セッションモード:stateless、stateful、または auto。 | stateless |
MCP_AUTH_MODE | 認証:none、jwt、または oauth。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、warning、error など)。 | info |
LOGS_DIR | ログファイルの保存先ディレクトリ(Node.js のみ)。 | <app-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
任意のオーバーライドの全一覧については、.env.example を参照してください。
サーバーの実行
ローカル開発
-
本番バージョンをビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行する:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/mcp-server/tools/definitions | 読み取り専用の 7 つのツール。 |
src/mcp-server/tools | 共通の出力スキーマ、セクションの射影、予算、ページネーション。 |
src/config | サーバー環境の設定(CWE_CACHE_DIR)。 |
src/services/catalog | カタログの取得、最後に正常だった状態のキャッシュ、XML の正規化、インデックス、更新ライフサイクル、ライブ階層。 |
tests/ | src/ の構成に対応するユニットテストと統合テスト。 |
docs/ | 設計資料と生成されたディレクトリリファレンス。 |
開発ガイド
開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は以下のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジック内で
try/catchを使わないでください。 - ログには
ctx.log、ストレージにはctx.stateを使用してください。 - 新しいツールとリソースは、
src/index.tsのcreateApp()配列に登録してください。 - 外部 API 呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに従って返してください。不足しているフィールドを捏造してはいけません。
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
このプロジェクトは Apache 2.0 License の下でライセンスされています。詳細については LICENSE ファイルを参照してください。
CWE データ:Copyright © 2006–2026, The MITRE Corporation。CAPEC データ:Copyright © 2007–2026, The MITRE Corporation。CWE と CAPEC は MITRE の商標です。データのライセンスと免責事項は THIRD_PARTY_NOTICES.md に掲載されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。