itsm-kb-generation について
ServiceNow ITSM 向けに、解決済みのインシデントや問題からナレッジ記事を作成するスキルです。再利用できる症状や解決情報を抽出し、既存記事との重複を確認して内容を構成し、記事を元の記録に関連付けます。
主な機能
- 01記事化に適した記録の特定
- 02症状と解決内容の抽出
- 03既存ナレッジ記事との重複確認
- 04標準形式での記事構成
- 05記事の作成と元記録への関連付け
活用シーン
- 01繰り返す問題をナレッジ記事化
- 02既知のエラーと回避策の記録
- 03解決済みインシデントから草稿を作成
- 04ナレッジ記事のカバレッジ不足を発見
MCP 対応
ServiceNow MCP ツールでインシデント、問題、ジャーナル、ナレッジ記録を照会し、記事を作成して元の記録に関連付けます。バックグラウンドスクリプトは候補の一括特定や記事生成に利用できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill itsm-kb-generationインストール後、Claude Code で/itsm-kb-generationを入力して読み込まれたか確認します。
詳細
ITSM ナレッジ記事の生成
概要
このスキルでは、解決済みの IT サービス管理インシデントおよび問題からナレッジ記事を生成するための構造化されたアプローチを提供します。以下を扱います。
- ナレッジ記事の作成に適したインシデントと問題の特定
- ケース履歴から症状の説明、診断手順、解決手順を抽出
- 標準化された「症状/原因/解決方法/回避策」の形式で記事を構成
- 既存のナレッジ記事との重複や内容の重なりを確認
- 適切なナレッジベースとカテゴリに記事を公開
- 生成した記事を元のインシデントおよび問題にリンク
使用する場面: 解決済みのインシデントや確認済みの問題に、サービスデスク、エンドユーザー、または今後のインシデント対応者に役立つ、再利用可能な解決方法の知識が含まれている場合です。特に、繰り返し発生する問題、複雑な解決方法、新たに発見された問題に有効です。
必要なプラグイン: com.glideapp.knowledge(Knowledge Management)
前提条件
- ロール:
knowledge_admin、knowledge_manager、knowledge、またはナレッジへの書き込みアクセス権を持つitil - アクセス権:
incident、problem、sys_journal_fieldへの読み取りアクセス権、およびkb_knowledgeへの書き込みアクセス権 - ナレッジ: ナレッジ管理のライフサイクル、記事の品質基準、組織の KB 分類体系に関する知識
- プラグイン:
com.glideapp.knowledgeが有効化されている必要があります
手順
ステップ 1:KB 記事に適したインシデントを特定する
ナレッジ記事の候補となる、解決済みのインシデントを検索します。
MCP を使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Find resolved incidents suitable for knowledge article creation
script: |
gs.info('=== KB CANDIDATE IDENTIFICATION ===');
// Find recurring incidents (same short_description appearing 3+ times)
gs.info('\n--- RECURRING INCIDENTS ---');
var ga = new GlideAggregate('incident');
ga.addQuery('state', 'IN', '6,7'); // Resolved or Closed
ga.addQuery('sys_created_on', '>=', gs.daysAgo(90));
ga.addQuery('close_notes', '!=', '');
ga.addAggregate('COUNT');
ga.groupBy('short_description');
ga.orderByAggregate('COUNT', 'DESC');
ga.setLimit(20);
ga.query();
while (ga.next()) {
var count = parseInt(ga.getAggregate('COUNT'));
if (count >= 3) {
// Check if KB article already exists
var kb = new GlideRecord('kb_knowledge');
kb.addQuery('short_description', 'LIKE', ga.short_description.toString().substring(0, 30));
kb.addQuery('workflow_state', 'published');
kb.setLimit(1);
kb.query();
var hasKB = kb.hasNext() ? 'YES' : 'NO';
gs.info('Count: ' + count + ' | KB Exists: ' + hasKB + ' | Subject: ' + ga.short_description);
}
}
// Find incidents with detailed close notes
gs.info('\n--- INCIDENTS WITH DETAILED RESOLUTIONS ---');
var detailed = new GlideRecord('incident');
detailed.addQuery('state', 'IN', '6,7');
detailed.addQuery('sys_created_on', '>=', gs.daysAgo(30));
detailed.addQuery('close_notes', '!=', '');
detailed.addQuery('close_notes.char_length', '>', 100);
detailed.orderByDesc('resolved_at');
detailed.setLimit(15);
detailed.query();
while (detailed.next()) {
gs.info(detailed.number + ': ' + detailed.short_description + ' | Close Notes Length: ' + detailed.close_notes.toString().length);
}
ステップ 2:KB 記事に適した問題を特定する
既知のエラーまたは回避策がある、確認済みの問題を検索します。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: problem
query: state=4^ORknown_error=true^workaroundISNOTEMPTY^ORfixISNOTEMPTY
fields: sys_id,number,short_description,description,root_cause,workaround,fix,known_error,state,related_incidents
limit: 20
REST API を使用する場合:
GET /api/now/table/problem?sysparm_query=state=4^ORknown_error=true^workaroundISNOTEMPTY^ORfixISNOTEMPTY&sysparm_fields=sys_id,number,short_description,description,root_cause,workaround,fix,known_error,state,related_incidents&sysparm_display_value=true&sysparm_limit=20
ステップ 3:元レコードから解決内容を抽出する
記事の内容を作成するため、ケース履歴全体を取得します。
MCP を使用する場合(インシデント):
Tool: SN-Get-Record
Parameters:
table_name: incident
sys_id: [incident_sys_id]
fields: sys_id,number,short_description,description,category,subcategory,close_code,close_notes,cmdb_ci,business_service,priority,impact
Tool: SN-Query-Table
Parameters:
table_name: sys_journal_field
query: element_id=[incident_sys_id]^name=incident^element=work_notes^ORDERBYsys_created_on
fields: value,sys_created_by,sys_created_on
limit: 30
REST API を使用する場合:
GET /api/now/table/incident/[incident_sys_id]?sysparm_fields=sys_id,number,short_description,description,category,subcategory,close_code,close_notes,cmdb_ci,business_service&sysparm_display_value=true
GET /api/now/table/sys_journal_field?sysparm_query=element_id=[incident_sys_id]^name=incident^element=work_notes^ORDERBYsys_created_on&sysparm_fields=value,sys_created_by,sys_created_on&sysparm_limit=30
ステップ 4:既存の記事を確認する
トピックに関する既存のナレッジ記事を検索し、重複を避けます。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge
query: short_descriptionLIKE[keyword]^ORtextLIKE[keyword]^workflow_stateINpublished,draft
fields: sys_id,number,short_description,workflow_state,sys_updated_on
limit: 10
REST API を使用する場合:
GET /api/now/table/kb_knowledge?sysparm_query=short_descriptionLIKE[keyword]^ORtextLIKE[keyword]^workflow_stateINpublished,draft&sysparm_fields=sys_id,number,short_description,workflow_state,sys_updated_on&sysparm_display_value=true&sysparm_limit=10
ステップ 5:対象のナレッジベースとカテゴリを特定する
記事に適切な KB とカテゴリを探します。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge_base
query: active=true^titleLIKEIT^ORtitleLIKEService Desk^ORtitleLIKETechnical
fields: sys_id,title,description,owner
limit: 5
Tool: SN-Query-Table
Parameters:
table_name: kb_category
query: kb_knowledge_base=[kb_sys_id]^active=true^ORDERBYlabel
fields: sys_id,label,parent_id,full_category
limit: 30
ステップ 6:ナレッジ記事を作成する
標準化された構成で記事を作成します。
MCP を使用する場合:
Tool: SN-Create-Record
Parameters:
table_name: kb_knowledge
data:
kb_knowledge_base: [kb_sys_id]
kb_category: [category_sys_id]
short_description: "[Clear, searchable title]"
text: |
<h2>Symptoms</h2>
<p>Users may experience the following symptoms:</p>
<ul>
<li>[Symptom 1 - observable behavior]</li>
<li>[Symptom 2 - error messages seen]</li>
<li>[Symptom 3 - affected functionality]</li>
</ul>
<p><strong>Affected Systems:</strong> [CI/Service names]</p>
<p><strong>Error Messages:</strong></p>
<pre>[Exact error message text if applicable]</pre>
<h2>Cause</h2>
<p>[Explanation of what causes this issue]</p>
<p><strong>Root Cause:</strong> [Technical root cause from problem record if available]</p>
<p><strong>Contributing Factors:</strong></p>
<ul>
<li>[Factor 1]</li>
<li>[Factor 2]</li>
</ul>
<h2>Resolution</h2>
<p>Follow these steps to resolve the issue:</p>
<ol>
<li>[Step 1 with specific instructions]</li>
<li>[Step 2 with specific instructions]</li>
<li>[Step 3 with specific instructions]</li>
<li>[Step 4 - verification step]</li>
</ol>
<p><strong>Expected Result:</strong> [What the user should see after applying the fix]</p>
<h2>Workaround</h2>
<p>If the resolution above is not immediately available, use this temporary workaround:</p>
<ol>
<li>[Workaround step 1]</li>
<li>[Workaround step 2]</li>
</ol>
<p><strong>Limitations:</strong> [Any limitations of the workaround]</p>
<h2>Additional Information</h2>
<p><strong>Applies To:</strong> [Product/Service versions, OS versions, etc.]</p>
<p><strong>Related Articles:</strong></p>
<ul>
<li>[KB Number] - [Related Article Title]</li>
</ul>
<p><strong>Source:</strong> Generated from [INC/PRB number]</p>
workflow_state: draft
valid_to: 2027-12-31
source: [incident_or_problem_number]
author: [current_user_sys_id]
REST API を使用する場合:
POST /api/now/table/kb_knowledge
Content-Type: application/json
{
"kb_knowledge_base": "[kb_sys_id]",
"kb_category": "[category_sys_id]",
"short_description": "[Title]",
"text": "<h2>Symptoms</h2>...",
"workflow_state": "draft",
"source": "[INC/PRB number]"
}
ステップ 7:記事を元レコードにリンクする
新しい記事を元のインシデントまたは問題に関連付けます。
MCP を使用する場合:
Tool: SN-Update-Record
Parameters:
table_name: incident
sys_id: [incident_sys_id]
data:
work_notes: "Knowledge article KB[number] created from this incident resolution. Article is in draft state pending review."
ステップ 8:解決済みインシデントから記事を一括生成する
複数の記事候補を一度に生成します。
MCP を使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Generate KB article drafts from top recurring resolved incidents
script: |
gs.info('=== BULK KB ARTICLE GENERATION ===');
var kbBase = '[kb_sys_id]';
var category = '[category_sys_id]';
// Find top recurring resolved incidents without KB articles
var ga = new GlideAggregate('incident');
ga.addQuery('state', 'IN', '6,7');
ga.addQuery('sys_created_on', '>=', gs.daysAgo(90));
ga.addQuery('close_notes', '!=', '');
ga.addAggregate('COUNT');
ga.groupBy('short_description');
ga.addHaving('COUNT', '>', 3);
ga.orderByAggregate('COUNT', 'DESC');
ga.setLimit(10);
ga.query();
while (ga.next()) {
var subject = ga.short_description.toString();
// Check for existing KB
var existingKB = new GlideRecord('kb_knowledge');
existingKB.addQuery('short_description', 'LIKE', subject.substring(0, 30));
existingKB.addQuery('workflow_state', 'published');
existingKB.setLimit(1);
existingKB.query();
if (existingKB.hasNext()) {
gs.info('SKIP (exists): ' + subject);
continue;
}
// Get the best resolution from the most recent incident
var inc = new GlideRecord('incident');
inc.addQuery('short_description', subject);
inc.addQuery('state', 'IN', '6,7');
inc.addQuery('close_notes', '!=', '');
inc.orderByDesc('resolved_at');
inc.setLimit(1);
inc.query();
if (inc.next()) {
gs.info('CANDIDATE: ' + subject + ' | Source: ' + inc.number + ' | Occurrences: ' + ga.getAggregate('COUNT'));
gs.info(' Close Notes: ' + inc.close_notes.toString().substring(0, 200));
}
}
ツールの使用方法
MCP ツールのリファレンス
| ツール | 使用場面 |
|---|---|
SN-Query-Table | インシデント、問題、既存の KB 記事、カテゴリの検索 |
SN-Get-Record | インシデント/問題レコードの詳細全体を取得 |
SN-Create-Record | 新しいナレッジ記事を作成 |
SN-Update-Record | 記事を元レコードにリンク、記事の内容を更新 |
SN-Natural-Language-Search | 重複を避けるため、既存の記事を意味検索 |
SN-Execute-Background-Script | 候補の一括特定と記事の生成 |
REST API リファレンス
| エンドポイント | メソッド | 目的 |
|---|---|---|
/api/now/table/incident | GET | 解決済みインシデントを検索 |
/api/now/table/problem | GET | 確認済みの問題を検索 |
/api/now/table/kb_knowledge | GET/POST | KB 記事を検索、作成 |
/api/now/table/kb_knowledge_base | GET | 対象のナレッジベースを検索 |
/api/now/table/kb_category | GET | 対象のカテゴリを検索 |
/api/now/table/sys_journal_field | GET | 記事の内容に使用する作業メモを抽出 |
ベストプラクティス
- 症状を先に記述する: ユーザーが問題に関する記事を検索したとき、内容が該当するかすぐに判断できるよう、観察できる症状から始めます
- エラーメッセージを含める: 検索の精度を高めるため、正確なエラーメッセージをそのまま記載します
- 解決策と回避策を分ける: 恒久的な修正と一時的な回避策を明確に区別します
- 確認手順を追加する: ユーザーが早まって対応を終了しないよう、解決したことを確認する方法を含めます
- 出典を引用する: 追跡可能性を確保し、今後の更新に役立てるため、元となったインシデントまたは問題の番号を記載します
- まず下書きを作成し、その後レビューする: 公開前にピアレビューを受けられるよう、必ず記事を下書き状態で作成します
- 有効期限を設定する: 定期的なレビューを促し、古いコンテンツが残らないよう、
valid_toの日付を設定します - 検索しやすいタイトルを付ける: IT 部門での分類方法ではなく、ユーザーが問題を説明するときの表現に合わせてタイトルを作成します
トラブルシューティング
クローズノートの情報が不足していて記事にできない
原因: エージェントが解決手順を詳しく記録していません 解決策: 作業メモを確認し、診断と解決の手順を調べます。クローズノートに作業メモの詳細を組み合わせます。
記事の重複が検出される
原因: タイトルが少し異なるだけで、類似したナレッジベースの記事がすでに存在します 解決策: 新しい記事を作成するのではなく、既存の記事を更新します。新しい解決策の内容を既存の記事に統合します。
記事が検索結果に表示されない
原因: タイトルまたは内容がユーザーの検索パターンと一致していません 解決策: よく使われるキーワードやエラーメッセージを記事のテキストに追加します。別の検索語にはメタタグを使用します。
記事が下書きのままになっている
原因: ナレッジ承認ワークフローで特定のレビュアー操作が必要です
解決策: ナレッジワークフローの設定を確認します。割り当てられたレビュアーに knowledge_manager ロールがあることを確認します。テスト中であれば、ワークフローの状態を手動で進めます。
例
例 1:VPN 接続の問題に関する記事
# 1. Get resolved VPN incidents
Tool: SN-Query-Table
Parameters:
table_name: incident
query: state=6^short_descriptionLIKEVPN^close_notesISNOTEMPTY^ORDERBYDESCresolved_at
fields: number,short_description,description,close_notes,category
limit: 10
# 2. Check for existing KB
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge
query: workflow_state=published^123TEXTQUERY321=VPN connection troubleshooting
fields: number,short_description,workflow_state
limit: 5
# 3. Create the article
Tool: SN-Create-Record
Parameters:
table_name: kb_knowledge
data:
short_description: "VPN Connection Fails - Troubleshooting Guide"
text: "<h2>Symptoms</h2>..."
workflow_state: draft
例 2:既知のエラーから作成した記事
# 1. Get problem details
Tool: SN-Get-Record
Parameters:
table_name: problem
sys_id: [problem_sys_id]
fields: number,short_description,root_cause,workaround,fix,known_error
# 2. Create KB with workaround
Tool: SN-Create-Record
Parameters:
table_name: kb_knowledge
data:
short_description: "[Problem title] - Known Issue and Workaround"
text: "<h2>Symptoms</h2>...<h2>Workaround</h2>[workaround from problem]"
workflow_state: draft
例 3:ナレッジベースのカバレッジ不足レポート
Tool: SN-Execute-Background-Script
Parameters:
description: Report on top incident categories without KB coverage
script: |
var ga = new GlideAggregate('incident');
ga.addQuery('state', 'IN', '6,7');
ga.addQuery('sys_created_on', '>=', gs.daysAgo(90));
ga.addAggregate('COUNT');
ga.groupBy('category');
ga.groupBy('subcategory');
ga.orderByAggregate('COUNT', 'DESC');
ga.setLimit(15);
ga.query();
gs.info('=== KB COVERAGE GAP REPORT ===');
while (ga.next()) {
var cat = ga.category.getDisplayValue();
var subcat = ga.subcategory.getDisplayValue();
var count = ga.getAggregate('COUNT');
var kb = new GlideAggregate('kb_knowledge');
kb.addQuery('workflow_state', 'published');
kb.addQuery('kb_category.label', 'LIKE', cat);
kb.addAggregate('COUNT');
kb.query();
kb.next();
var articleCount = kb.getAggregate('COUNT');
gs.info(cat + ' > ' + subcat + ' | Incidents: ' + count + ' | KB Articles: ' + articleCount);
}
関連スキル
itsm/incident-summarization- ナレッジベースに変換する前にインシデントを要約しますitsm/chat-reply-recommendation- チャットの返信で生成されたナレッジベース記事を参照しますitsm/email-recommendation- メールの返信でナレッジベース記事を参照しますhrsd/kb-generation- HR 固有のナレッジ記事を生成しますknowledge/article-generation- 一般的なナレッジ管理スキル