
Claude Code Skills の公式ガイドに沿って、CVE 脆弱性情報収集用の Skill を作ってみた
こんにちは。
お腹が脆弱
オペレーション部のかわいです。
やっとこさ Claude Code の Skills に入門してみました。最初はなんとなく「コマンド一発で指示できるラッパーみたいなもんやろ」とか思ってました。
でも公式ガイドを読んで分かったんですが、Skills、奥が深くておもしろいですね。
資料には独自の設計の考え方(Progressive Disclosure とか frontmatter の書き方 など)が書かれていて、ベストプラクティスを学べるめちゃくちゃいいドキュメント(説明書?)でした。全人類読むべき。
本記事では同ガイドを参考に、実際に 直近の CVE 脆弱性情報を取得して解説してくれる Skill を作ってみたので、備忘録がてらに記録をまとめます。
似たような記事が既にあるかもですが、特に Skills に入門したい方の参考になると思うので、少しお付き合いください。
書いてあること/やってみたこと
- Claude Code Skills の基本構造と公式のベストプラクティス
- Skill で NVD から CVE 情報を取得する仕組みの検証
- 実際に SKILL.md を作成し、
skill-creatorスキルで改善するまでの流れ - 完成した Skill の動作確認
Claude Code Skills とは
Skills は、Claude Code に繰り返しやる作業の手順書を持たせる仕組みです。
一度作っておけば、毎回大量の指示文を書かなくても Claude が自動的に読み込んで動いてくれます(ブログ下書き作って、とか)。
公式ガイドによると、Skill は以下の3つの設計原則に基づいています。
| 原則 | 概要 |
|---|---|
| Progressive Disclosure | 必要な情報だけを必要なタイミングで読み込む3段階構造 |
| Composability | 複数の Skill を同時に有効化しても干渉しないように設計する |
| Portability | Claude.ai、Claude Code、API のどれでも同じように動作する |
特に Progressive Disclosure が重要で、公式ガイドには以下のように書かれています。
This progressive disclosure minimizes token usage while maintaining specialized expertise.
つまり、「必要なときに必要な情報だけ読み込む」ことでトークンを節約しながら特定動作を維持する、という設計です。
具体的には以下の3層構造になっています。
1) YAML frontmatter(常時ロード)
→ Claudeが「このSkillをいつ使うか」を判断するための最小情報
2) SKILL.md 本文(Skill が関連すると判断されたときにロード)
→ 具体的な手順や指示
3) references/ 配下のファイル(必要に応じてロード)
→ 詳細ドキュメント、サンプル、APIリファレンスなど
この構造のおかげで、Skill の中身が多くなってもトークン消費を抑えられます。
Skill フォルダの構成
フォルダ名、Skill名は kebab-case(単語をハイフン - でつなぐ命名規則。串刺し。)で統一する必要があります。
cve-report や my-skill-name のような形式を用います。スペースや大文字、アンダースコア_は使えません。
your-skill-name/ ← kebab-case で命名(スペース、大文字、アンダースコアは使用不可)
├── SKILL.md ← 【必須】(大文字、拡張子 .md は厳守)
├── scripts/ ← 【任意】Python や Bash など実行スクリプト
├── references/ ← 【任意】詳細ドキュメント
└── assets/ ← 【任意】テンプレート等
SKILL.md にどれくらい記述するかですが、行数について公式ガイドにこう書かれています。
Keep SKILL.md under 500 lines; if you're approaching this limit, add an additional layer of hierarchy along with clear pointers about where the model using the skill should go next to follow up.
500行を超えそうになったら、詳細ドキュメントを references/ に切り出してリンクする設計にすると良いみたいです。
だいじなポイント YAML frontmatter
SKILL.md は YAML frontmatter が大事で、これは「いつこの Skill を使うか」を Claude に伝えるキモの部分になります。
公式ガイドではこう説明されています。
This metadata...provides just enough information for Claude to know when each skill should be used without loading all of it into context.
frontmatter はシステムプロンプトに常時ロードされるため、ここに書く内容は最小限かつ的確であることが求められます。
# 例
name: your-skill-name # スキル名。フォルダ名と一致させる(必須)
# ※ "claude" や "anthropic" で始まる名前は予約済みなので使用不可
description: # 必須。1024文字以内。< > などのXMLタグは使用不可
#「何をするか」と「いつ使うか」の両方を書く
# 例
CVEの脆弱性情報を取得して解説する。
ユーザが「CVE調べて」「最新の脆弱性を教えて」「セキュリティ情報を確認したい」
などと指示があったときに使用する。
description に「何をするか」しか書いていないと、Claude がいつ Skill を使えばいいか判断できず、自動でロードされません。
内容はできるだけ最適化し、「〜と言ったときに使う」というトリガ条件を必ず書くのがポイントです。
公式ガイドでは、 Claude が Skill を undertrigger(使うべき場面でも使わない)しやすい傾向があることが指摘されています。
Claude has a tendency to "undertrigger" skills -- to not use them when they'd be useful. To combat this, please make the skill descriptions a little bit "pushy".
つまり、description は pushy(強めに) 書くくらいがちょうどよいということです。「〜のときに使う」だけでなく「〜についての話題が出たら必ず使うかを確認する」くらいのトーンにするとトリガーの精度が上がります。
また、公式ガイドには good/bad の具体例が載っています。
bad なイメージはこんな感じ↓
# Too vague # 曖昧すぎる description: Helps with projects. # Missing triggers # トリガがない description: Creates sophisticated multi-page documentation systems. # Too technical, no user triggers # 技術的すぎる。ユーザトリガがない description: Implements the Project entity model with hierarchical relationships.
例えば今回の cve-report Skill に当てはめて、最初にこんな description を書いたとします。
# ※何をするかだけで、いつ使うかが書かれていない
description: NVD 情報から CVE 脆弱性情報を取得して詳しく解説する。
これだと Claude は「CVEについて教えて」と言われたときに、この Skill を使うべきか明確に判断できません。
以下のようにトリガフレーズを明示すると良いです。
description: |
NVD から直近の重要な CVE 脆弱性情報を取得し、影響を受ける環境と、推奨される対策を添えて解説する。
ユーザが「CVE を調べて」「今週ヤバい CVE ある?」「重要な脆弱性をまとめて」などと言ったときに使用する。
Do NOT use for: 特定CVE番号の詳細調査や一般的なセキュリティ相談。
今回作ってみる Skill「CVE 脆弱性情報収集くん」
日々脆弱性情報をチェックするのは大変なので、Claude Code に聞くだけで直近の CVE 情報をまとめてくれる Skill を作ります。
NVD から情報取得する
今回は NVD(National Vulnerability Database) が公式提供している REST API を使います。
※ NVD の利用規約では、API を利用するサービスに対して以下の表示を目立つ箇所に掲載するよう求めています。
Services which utilize or access the NVD API are asked to display the following notice prominently within the application:
"This product uses the NVD API but is not endorsed or certified by the NVD."
なので、今回作る Skill の出力にもこの文言を含めるようにします。
使用エンドポイント
GET https://services.nvd.nist.gov/rest/json/cves/2.0
主要パラメータ
| パラメータ | 説明 | 今回の設定 |
|---|---|---|
pubStartDate |
公開日の開始日時 | 7日前 |
pubEndDate |
公開日の終了日時 | 今日 |
cvssV3Severity |
深刻度フィルタ | CRITICAL or HIGH |
resultsPerPage |
取得件数 | 10 |
※実際は MEDIUM 以下でも確認するのが理想ですが、あくまでも検証なのでトークン数を極力減らし、重要な分だけチェックします。
SKILL.md を書いてみる(初版)
構造を理解したところで、まずは実際に SKILL.md を書いてみます。
~/.claude/skills/cve-report/
└── SKILL.md
SKILL.md
---
name: cve-report
description: |
NVD から、直近の重要なCVE脆弱性情報(CRITICAL/HIGH)を取得し、影響を受ける環境と、推奨される対策を添えて解説する。
ユーザが「CVEを調べて」「最新の脆弱性を教えて」「セキュリティ情報を確認したい」
「今週ヤバいCVEある?」などと言ったときに使用する。
metadata:
author: kawai
version: 1.0.0
---
# CVE 脆弱性情報報告くん
## 概要
NVD のサイトから、直近7日間の CRITICAL/HIGH の CVE 情報を最大10件取得して解説する。
## 実行手順
### Step 1: NVD の API から CVE 情報を取得
以下コマンドを実行する。
'''bash
START_DATE=$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%S.000)
END_DATE=$(date -u +%Y-%m-%dT%H:%M:%S.000)
curl -s "https://services.nvd.nist.gov/rest/json/cves/2.0?pubStartDate=${START_DATE}&pubEndDate=${END_DATE}&cvssV3Severity=CRITICAL&resultsPerPage=10"
'''
### Step 2: 各 CVE を以下フォーマットで解説
取得した各 CVE について、以下の形式で解説する:
- CVE ID と CVSS スコア
- 概要:何の脆弱性か
- 影響環境:「この CVE は xxx といった環境に影響があり、」
- 推奨対策:「xxx という対策が推奨される。」
## 帰属表示(NVD用。必須)
This product uses the NVD API but is not endorsed or certified by NVD.
skill-creator で改善する
skill-creator は Claude Code のプラグインマーケットプレイスから、以下のコマンド経由で Anthropic 公式の Skills をインストールできます。
今回は、デフォルトのユーザスコープでインストールします。
/plugin marketplace add anthropics/skills
/plugin install example-skills@anthropics/skills
初版を書いたら、インストールした skill-creator スキルに見てもらいます。公式ガイドによると skill-creator には以下の能力があります。
Flag common issues (vague descriptions, missing triggers, structural problems) / Identify potential over/under-triggering risks / Suggest test cases based on the skill's stated purpose
つまり「トリガが曖昧」「トリガが存在しない」「構造の問題」「過剰/過小トリガのリスク」まで指摘してくれる、Skill のレビュアーみたいなものです。
インストールできたら、早速以下のように提案をお願いしてみます。
skill-creatorを使って、~/.claude/skills/cve-report/SKILL.md をレビューして改善提案をください
skill-creator から指摘されたのは主に2点でした。
指摘1:description のトリガが弱い
「セキュリティ情報を確認したい」は広すぎて他の Skill と競合する可能性がある。より具体的なフレーズを追加するか、ネガティブトリガー(このSkillを使わないケース)を明示するとよい。
→ Do NOT use for の記述を追加しました。
指摘2:エラーハンドリングが不足
NVD の REST API がエラーになるケース、
cvssMetricV31が存在しないケース(古い CVE は V2 のみ)への対処が書かれていない。
→ Troubleshooting セクションを追加しました。
改善後の SKILL.md(最終版)
---
name: cve-report
description: |
NVD から、直近の重要なCVE脆弱性情報(CRITICAL/HIGH)を取得し、影響を受ける環境と、推奨される対策を添えて解説する。
ユーザが「CVEを調べて」「最新の脆弱性を教えて」「セキュリティ情報を確認したい」
「今週ヤバいCVEある?」「重要な脆弱性をまとめて」「セキュリティパッチ確認したい」などと言ったときに使用する。
Do NOT use for: 特定CVE番号の詳細調査(例:「CVE-2024-12345について教えて」)や
一般的なセキュリティ相談には使用しない。
metadata:
author: kawai
version: 1.1.0
---
# CVE 脆弱性情報報告くん
## 概要
NVD のサイトから、直近7日間の CRITICAL/HIGH CVE を最大10件取得して解説する。
帰属表示(必須): This product uses the NVD API but is not endorsed or certified by NVD.
## 実行手順
### Step 1: NVD API でCVE情報を取得
\`\`\`bash
START_DATE=$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%S.000)
END_DATE=$(date -u +%Y-%m-%dT%H:%M:%S.000)
curl -s "https://services.nvd.nist.gov/rest/json/cves/2.0?pubStartDate=${START_DATE}&pubEndDate=${END_DATE}&cvssV3Severity=CRITICAL&resultsPerPage=10"
\`\`\`
### Step 2: 各CVEを以下フォーマットで解説
\`\`\`
## CVE-XXXX-XXXXX(CVSSスコア: X.X)
**概要**: [脆弱性の内容を1〜2文で]
**影響環境**: このCVEは [影響するOS/ソフトウェア/バージョン] といった環境に影響があり、
[攻撃者が悪用するとどうなるか] のリスクがあります。
**推奨対策**: [パッチ適用/バージョンアップ/設定変更] という対策が推奨されます。
\`\`\`
### CVSSスコアの取得優先順位
1. `metrics.cvssMetricV31[0].cvssData.baseScore`(V3.1優先)
2. `metrics.cvssMetricV40[0].cvssData.baseScore`(V4.0)
3. `metrics.cvssMetricV2[0].cvssData.baseScore`(V2、上記なければ)
4. 取得不可の場合は「スコア情報なし」と表示
## Troubleshooting
**NVD REST API が応答しない場合**
原因: NVD APIは稀にメンテナンスで停止することがある
対処: https://nvd.nist.gov/ でステータス確認。時間をおいて再試行。
**`vulnerabilities` が空配列の場合**
原因: 指定期間内にCRITICAL CVEが存在しない
対処: `cvssV3Severity` を `HIGH` に変更して再取得する。
\`\`\`bash
curl -s "...&cvssV3Severity=HIGH&resultsPerPage=10"
\`\`\`
動作確認
Skill の修正が完了したら、以下のように聞いてみます。
「今週やばいCVEある?」

すると Claude が自動的に cve-report Skill をロードして、NVD API にアクセスします。
試しに 2026年3月9〜16日 の CRITICAL CVE を実際に取得してみた結果が以下です。
実際の出力サンプル(2026年3月9〜16日取得分)
CVE-2026-24713(CVSSスコア: 9.8)
概要: Apache IoTDB(時系列データベース)において、入力値検証の不備により認証なしの攻撃者がシステムを完全に侵害できる脆弱性。
影響環境: このCVEは Apache IoTDB 1.0.0〜1.3.7未満、および 2.0.0〜2.0.7未満 を稼働させているサーバー環境に影響があり、認証不要でリモートから任意コードを実行されるリスクがあります。
推奨対策: Apache IoTDB 1.3.7 または 2.0.7 以降へのアップデートという対策が推奨されます。パッチ適用が困難な場合は、IoTDB のポートをネットワーク境界でブロックする暫定対処も有効です。
参照: https://lists.apache.org/thread/vopgv6y2ccw403b0zv7rvojjrh7x1j5p
CVE-2025-41764(CVSSスコア: 9.1)
概要: MBS Solutions 製 Universal BACnet ルーター(産業用ビルオートメーション機器)において、ファームウェア更新エンドポイント(wwwupdate.cgi)の認可チェックが不十分で、認証なしに任意のファームウェアを書き込まれる脆弱性。
影響環境: このCVEは UBR-01 MK II・UBR-02・UBR-LON など MBS Universal BACnet Router ファームウェア 6.0.1.0未満 を使用しているビルオートメーション・産業制御システム環境に影響があり、攻撃者がデバイスを完全に乗っ取り、施設制御を掌握されるリスクがあります。
推奨対策: ファームウェアを 6.0.1.0 以降へアップデートするという対策が推奨されます。インターネット公開環境にある場合は即時対応が必要です。
参照: https://www.mbs-solutions.de/mbs-2025-0001
取得結果はこんな感じです。Apache のような広く使われている OSS から産業用機器まで、幅広いカテゴリの脆弱性が一覧出力されました。
まとめ的な
今回作った Skill はかなりシンプルな構成ですが、references/ に いろんな参考情報も追加していくと活用幅が拡がりそうです。
たとえば今回の例で言うと、特定ベンダやミドルウェア(Microsoft、Apache等)でフィルタする機能を追加すると、日々のパッチ管理の補助ツールとして使えそうな印象です。
公式の Skills ガイドは内容が充実しているので、Skill 作成したいと思ったら、ぜひ一読をおすすめします!
完







