mcpField
I
itsm-kb-generation

itsm-kb-generation

github.com/happy-technologies-llc生産性4141 回インストール2 日前に更新
リポジトリ

itsm-kb-generation について

ServiceNow ITSM 向けに、解決済みのインシデントや問題からナレッジ記事を作成するスキルです。再利用できる症状や解決情報を抽出し、既存記事との重複を確認して内容を構成し、記事を元の記録に関連付けます。

主な機能

  1. 01記事化に適した記録の特定
  2. 02症状と解決内容の抽出
  3. 03既存ナレッジ記事との重複確認
  4. 04標準形式での記事構成
  5. 05記事の作成と元記録への関連付け

活用シーン

  1. 01繰り返す問題をナレッジ記事化
  2. 02既知のエラーと回避策の記録
  3. 03解決済みインシデントから草稿を作成
  4. 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/incidentGET解決済みインシデントを検索
/api/now/table/problemGET確認済みの問題を検索
/api/now/table/kb_knowledgeGET/POSTKB 記事を検索、作成
/api/now/table/kb_knowledge_baseGET対象のナレッジベースを検索
/api/now/table/kb_categoryGET対象のカテゴリを検索
/api/now/table/sys_journal_fieldGET記事の内容に使用する作業メモを抽出

ベストプラクティス

  • 症状を先に記述する: ユーザーが問題に関する記事を検索したとき、内容が該当するかすぐに判断できるよう、観察できる症状から始めます
  • エラーメッセージを含める: 検索の精度を高めるため、正確なエラーメッセージをそのまま記載します
  • 解決策と回避策を分ける: 恒久的な修正と一時的な回避策を明確に区別します
  • 確認手順を追加する: ユーザーが早まって対応を終了しないよう、解決したことを確認する方法を含めます
  • 出典を引用する: 追跡可能性を確保し、今後の更新に役立てるため、元となったインシデントまたは問題の番号を記載します
  • まず下書きを作成し、その後レビューする: 公開前にピアレビューを受けられるよう、必ず記事を下書き状態で作成します
  • 有効期限を設定する: 定期的なレビューを促し、古いコンテンツが残らないよう、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 - 一般的なナレッジ管理スキル

参考資料

コメント