关于 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_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/incident | GET | 查询已解决事件 |
/api/now/table/problem | GET | 查询已确认的问题 |
/api/now/table/kb_knowledge | GET/POST | 搜索并创建知识文章 |
/api/now/table/kb_knowledge_base | GET | 查找目标知识库 |
/api/now/table/kb_category | GET | 查找目标类别 |
/api/now/table/sys_journal_field | GET | 提取用于文章内容的工作备注 |
最佳实践
- 以症状为先: 先描述可观察到的症状,让搜索帮助的用户快速判断文章是否与他们遇到的问题相关
- 包含错误消息: 原样记录确切的错误消息,以提高搜索准确性
- 区分解决方案与临时规避方法: 明确区分永久修复方案和临时规避方法
- 添加验证步骤: 说明如何确认问题已解决,避免用户过早关闭问题
- 引用来源: 引用源事件或问题编号,以便追溯和后续更新
- 先起草,再审核: 始终先以草稿状态创建文章,供同行审核后再发布
- 设置到期时间: 为
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- 通用知识管理技能