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_admin、knowledge_manager、knowledge,或具有知识写入权限的 itil
  • 访问权限: 对 incident、problem、sys_journal_field 有读取权限;对 kb_knowledge 有写入权限
  • 知识: 熟悉知识管理生命周期、文章质量标准以及组织的知识库分类体系
  • 插件: 必须激活 com.glideapp.knowledge

操作步骤

步骤 1:找出适合创建知识文章的事件

查找适合作为知识文章素材的已解决事件。

使用 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:找出适合创建知识文章的问题

查找已确认且存在已知错误或临时解决方法的问题。

使用 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:确定目标知识库和类别

为文章找到合适的知识库和类别。

使用 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查询事件、问题、现有知识文章和类别
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/POST搜索并创建知识文章
/api/now/table/kb_knowledge_baseGET查找目标知识库
/api/now/table/kb_categoryGET查找目标类别
/api/now/table/sys_journal_fieldGET提取用于文章内容的工作备注

最佳实践

  • 以症状为先: 先描述可观察到的症状,让搜索帮助的用户快速判断文章是否与他们遇到的问题相关
  • 包含错误消息: 原样记录确切的错误消息,以提高搜索准确性
  • 区分解决方案与临时规避方法: 明确区分永久修复方案和临时规避方法
  • 添加验证步骤: 说明如何确认问题已解决,避免用户过早关闭问题
  • 引用来源: 引用源事件或问题编号,以便追溯和后续更新
  • 先起草,再审核: 始终先以草稿状态创建文章,供同行审核后再发布
  • 设置到期时间: 为 valid_to 设置日期,以触发定期审核并防止内容过时
  • 使用便于搜索的标题: 标题应贴合用户描述问题的方式,而非 IT 对问题的分类方式

故障排除

关闭备注过于简略,无法用于撰写文章

原因: Agent 未详细记录解决步骤 解决方案: 查看工作备注中的逐步诊断和解决操作。结合关闭备注与工作备注中的详细信息。

检测到重复文章

原因: 已存在标题略有不同的相似知识库文章 解决方案: 更新现有文章,而不是创建新文章。将新解决方案中的内容合并到现有文章中。

无法搜索到文章

原因: 标题或内容与用户的搜索模式不匹配 解决方案: 在文章文本中添加常用关键词和错误消息。使用元标签添加其他搜索词。

文章卡在草稿状态

原因: 知识审批工作流要求审核者执行特定操作 解决方案: 检查知识工作流配置。确保指定的审核者拥有 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 - 通用知识管理技能

参考资料

评论

支持 Markdown