skills/csm/kb-generation/SKILL.md
Generate knowledge articles from resolved CSM cases with customer-facing language, structured content, screenshot placeholders, and FAQ sections
npx skillsauth add happy-technologies-llc/happy-servicenow-skills csm-kb-generationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill generates polished knowledge base articles from resolved customer service cases. It transforms internal case resolution data into customer-facing documentation that can deflect future cases and empower self-service. It covers:
When to use: After resolving a CSM case that addresses a common or recurring issue, when knowledge gaps are identified during case handling, or during periodic knowledge harvesting from closed case data.
Value proposition: Converts tribal knowledge locked in case resolutions into reusable self-service content. Reduces case volume by enabling customers to find answers independently and ensures consistent resolution guidance across the support team.
com.sn_customerservice), Knowledge Management (com.glideapp.knowledge)knowledge_admin, knowledge_manager, or knowledge (for article creation); sn_customerservice_agent (for case access)sn_customerservice_case, interaction, csm_consumer, sys_journal_field; read/write access to kb_knowledge, kb_knowledge_base, kb_categoryQuery resolved cases that are good candidates for knowledge articles based on frequency, category, and resolution quality.
Using MCP (Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_case
query: state=3^resolution_codeISNOTEMPTY^closed_atONLast 30 days@javascript:gs.beginningOfLast30Days()@javascript:gs.endOfLast30Days()^ORDERBYDESCclosed_at
fields: sys_id,number,short_description,category,subcategory,resolution_code,resolved_by,product,close_notes,opened_at,closed_at
limit: 20
Using REST API:
GET /api/now/table/sn_customerservice_case?sysparm_query=state=3^resolution_codeISNOTEMPTY^closed_atONLast 30 days@javascript:gs.beginningOfLast30Days()@javascript:gs.endOfLast30Days()^ORDERBYDESCclosed_at&sysparm_fields=sys_id,number,short_description,category,subcategory,resolution_code,resolved_by,product,close_notes,opened_at,closed_at&sysparm_limit=20&sysparm_display_value=true
Retrieve the complete case record including close notes, work notes, and resolution information.
Using MCP:
Tool: SN-Read-Record
Parameters:
table_name: sn_customerservice_case
sys_id: [case_sys_id]
fields: sys_id,number,short_description,description,state,category,subcategory,resolution_code,close_notes,cause,product,contact_type,opened_at,closed_at,resolved_by
Then retrieve work notes for step-by-step resolution context:
Tool: SN-Query-Table
Parameters:
table_name: sys_journal_field
query: element_id=[case_sys_id]^elementINwork_notes,comments^ORDERBYsys_created_on
fields: sys_id,element,value,sys_created_on,sys_created_by
limit: 30
Using REST API:
GET /api/now/table/sn_customerservice_case/{case_sys_id}?sysparm_fields=sys_id,number,short_description,description,state,category,subcategory,resolution_code,close_notes,cause,product,contact_type,opened_at,closed_at,resolved_by&sysparm_display_value=true
GET /api/now/table/sys_journal_field?sysparm_query=element_id=[case_sys_id]^elementINwork_notes,comments^ORDERBYsys_created_on&sysparm_fields=sys_id,element,value,sys_created_on,sys_created_by&sysparm_limit=30
Query related cases to identify common follow-up questions and alternative resolutions.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_case
query: category=[case_category]^subcategory=[case_subcategory]^state=3^sys_id!=[case_sys_id]^ORDERBYDESCclosed_at
fields: sys_id,number,short_description,close_notes,resolution_code,description
limit: 10
Using REST API:
GET /api/now/table/sn_customerservice_case?sysparm_query=category=[case_category]^subcategory=[case_subcategory]^state=3^sys_id!=[case_sys_id]^ORDERBYDESCclosed_at&sysparm_fields=sys_id,number,short_description,close_notes,resolution_code,description&sysparm_limit=10&sysparm_display_value=true
Search for duplicate or related articles to avoid redundancy.
Using MCP:
Tool: SN-NL-Search
Parameters:
query: [case_short_description]
table: kb_knowledge
limit: 5
Using REST API:
GET /api/now/table/kb_knowledge?sysparm_query=short_descriptionLIKE[key_terms]^workflow_stateINpublished,draft&sysparm_fields=sys_id,number,short_description,workflow_state,sys_view_count,kb_knowledge_base&sysparm_limit=5&sysparm_display_value=true
Determine where the article should be published.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge_base
query: active=true
fields: sys_id,title,description,owner,kb_version
limit: 10
Tool: SN-Query-Table
Parameters:
table_name: kb_category
query: kb_knowledge_base=[kb_sys_id]^active=true
fields: sys_id,label,parent_id,full_category
limit: 20
Using REST API:
GET /api/now/table/kb_knowledge_base?sysparm_query=active=true&sysparm_fields=sys_id,title,description,owner&sysparm_limit=10&sysparm_display_value=true
GET /api/now/table/kb_category?sysparm_query=kb_knowledge_base=[kb_sys_id]^active=true&sysparm_fields=sys_id,label,parent_id,full_category&sysparm_limit=20&sysparm_display_value=true
Compose the article with customer-facing language and create it in ServiceNow.
Using MCP:
Tool: SN-Create-Record
Parameters:
table_name: kb_knowledge
fields:
short_description: "How to Resolve Online Return Processing Errors"
kb_knowledge_base: [kb_sys_id]
kb_category: [category_sys_id]
text: |
<h2>Problem</h2>
<p>When attempting to process a return through the online portal, you may encounter an error message stating "Unable to process return" or the page may time out during submission.</p>
<h2>Cause</h2>
<p>This issue occurs when the browser session expires during the return process, typically after being idle for more than 15 minutes on the return form.</p>
<h2>Resolution</h2>
<ol>
<li>Clear your browser cache and cookies for the portal domain</li>
<li>Log out and log back in to establish a fresh session</li>
<li>Navigate to <strong>My Orders > Returns</strong></li>
<!-- [SCREENSHOT: Navigation to Returns page showing My Orders menu] -->
<li>Select the order containing the item(s) to return</li>
<li>Click <strong>Start Return</strong> and complete the form within 10 minutes</li>
<!-- [SCREENSHOT: Start Return button highlighted on the order detail page] -->
<li>Submit the return request and note the confirmation number</li>
<!-- [SCREENSHOT: Return confirmation page with confirmation number] -->
</ol>
<h2>If the Issue Persists</h2>
<p>If you continue to experience errors after following the steps above:</p>
<ul>
<li>Try using a different browser (Chrome, Firefox, or Edge recommended)</li>
<li>Disable browser extensions that may interfere with the portal</li>
<li>Contact support with your order number and the error message</li>
</ul>
<h2>Frequently Asked Questions</h2>
<p><strong>Q: Will I lose my return information if the page times out?</strong></p>
<p>A: Yes, you will need to re-enter the return details. The system does not save partial return submissions.</p>
<p><strong>Q: Can I process returns through the mobile app instead?</strong></p>
<p>A: Yes, the mobile app maintains a longer session and is recommended for complex returns with multiple items.</p>
<p><strong>Q: How long does the return take to process after submission?</strong></p>
<p>A: Returns are typically processed within 3-5 business days. You will receive an email confirmation when the return is approved.</p>
workflow_state: draft
article_type: text
valid_to: "2027-03-19"
source: case_resolution
Using REST API:
POST /api/now/table/kb_knowledge
Content-Type: application/json
{
"short_description": "How to Resolve Online Return Processing Errors",
"kb_knowledge_base": "[kb_sys_id]",
"kb_category": "[category_sys_id]",
"text": "<h2>Problem</h2><p>When attempting to process a return...</p>",
"workflow_state": "draft",
"article_type": "text",
"source": "case_resolution"
}
Associate the new article with the originating case for traceability.
Using MCP:
Tool: SN-Create-Record
Parameters:
table_name: m2m_kb_task
fields:
kb_knowledge: [article_sys_id]
task: [case_sys_id]
Using REST API:
POST /api/now/table/m2m_kb_task
Content-Type: application/json
{
"kb_knowledge": "[article_sys_id]",
"task": "[case_sys_id]"
}
| Tool | When to Use |
|------|-------------|
| SN-NL-Search | Find existing KB articles semantically matching the case topic |
| SN-Query-Table | Query resolved cases, work notes, KB bases, and categories |
| SN-Read-Record | Retrieve full case details by sys_id |
| SN-Create-Record | Create the KB article and case-article association |
| SN-Update-Record | Update article content or workflow state |
| SN-Execute-Background-Script | Batch-generate articles from multiple resolved cases |
| Endpoint | Method | Purpose |
|----------|--------|---------|
| /api/now/table/sn_customerservice_case | GET | Query resolved cases for article candidates |
| /api/now/table/sys_journal_field | GET | Retrieve work notes with resolution steps |
| /api/now/table/kb_knowledge | GET/POST/PATCH | Search, create, and update knowledge articles |
| /api/now/table/kb_knowledge_base | GET | List available knowledge bases |
| /api/now/table/kb_category | GET | Browse knowledge categories |
| /api/now/table/kb_feedback | GET | Check article feedback for improvement |
<!-- [SCREENSHOT: description] --> for content teams to fill invalid_to dates to trigger periodic review and ensure article accuracyCause: Work notes often contain technical shorthand intended for internal teams. Solution: Post-process the generated text to replace technical terms. Use a glossary mapping (e.g., "GlideRecord" -> "database query", "BR" -> "automated rule") before composing the article.
Cause: A knowledge article covering the same topic already exists. Solution: Compare the existing article with the new resolution. If the new case provides additional context, update the existing article rather than creating a duplicate.
Cause: The resolving agent did not populate close notes on the case. Solution: Fall back to work notes to reconstruct the resolution steps. Filter work notes for resolution-related content by looking for keywords like "resolved", "fixed", "solution", "workaround".
Cause: No similar cases found to extract common questions from. Solution: Generate generic FAQs based on the article category (e.g., "How long does this take?", "What if this doesn't work?", "Who do I contact for help?").
Scenario: Case CS0045678 resolved a recurring login issue.
Tool: SN-Read-Record
Parameters:
table_name: sn_customerservice_case
sys_id: [case_sys_id]
fields: number,short_description,description,close_notes,resolution_code,category,product
Generated article structure:
Scenario: Generate articles for all resolved cases in the "Billing" category from the last 30 days.
Tool: SN-Query-Table
Parameters:
table_name: sn_customerservice_case
query: category=billing^state=3^closed_atONLast 30 days@javascript:gs.beginningOfLast30Days()@javascript:gs.endOfLast30Days()^close_notesISNOTEMPTY
fields: sys_id,number,short_description,close_notes,resolution_code
limit: 50
Group cases by subcategory, then generate one consolidated article per subcategory covering the most common resolutions.
Scenario: An existing KB article needs updated resolution steps based on a newly resolved case.
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge
query: number=KB0045123
fields: sys_id,short_description,text,workflow_state
limit: 1
Tool: SN-Update-Record
Parameters:
table_name: kb_knowledge
sys_id: [article_sys_id]
fields:
text: [updated_html_content_with_new_resolution_steps]
workflow_state: draft
csm/case-summarization - Summarize cases for context before KB generationcsm/resolution-notes - Generate structured resolution notes on case closurecsm/suggested-steps - Generate resolution steps that can seed KB contentknowledge/content-recommendation - Recommend existing articles to avoid duplicationknowledge/article-optimization - Optimize article searchability and qualitytesting
Manage supplier onboarding, qualification, performance monitoring, and offboarding with auditable lifecycle controls
tools
Identify emerging risks, prioritize intake signals, and route candidates into formal GRC risk assessment workflows
documentation
Screen inbound documents for completeness, policy risk, and routing readiness before extraction or case workflows
testing
Generate concise task summaries with status, timeline, blockers, SLA risk, and recommended next actions