skills/knowledge/duplicate-detection/SKILL.md
Identify duplicate knowledge articles using content similarity analysis, compare titles and metadata across knowledge bases, and recommend merge or deduplication strategies
npx skillsauth add happy-technologies-llc/happy-servicenow-skills duplicate-detectionInstall 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 provides a structured approach to identifying and resolving duplicate knowledge articles in ServiceNow. Over time, knowledge bases accumulate redundant content created by different authors, imported from multiple sources, or drafted independently for similar issues. Duplicates degrade search quality, confuse users, and increase maintenance burden.
This skill helps you:
When to use: During periodic knowledge base hygiene reviews, after bulk imports, or when users report conflicting articles for the same issue.
knowledge_manager or knowledge_adminkb_knowledge, kb_knowledge_base, kb_category, and kb_use tablescom.glideapp.knowledge (Knowledge Management) activatedSearch for articles with similar or identical short descriptions across all published knowledge bases.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge
query: workflow_state=published^short_descriptionLIKEpassword reset
fields: sys_id,number,short_description,kb_knowledge_base,kb_category,author,sys_updated_on,rating,sys_view_count
limit: 25
Using REST API:
GET /api/now/table/kb_knowledge?sysparm_query=workflow_state=published^short_descriptionLIKEpassword reset&sysparm_fields=sys_id,number,short_description,kb_knowledge_base,kb_category,author,sys_updated_on,rating,sys_view_count&sysparm_limit=25
Duplicates often use different phrasing. Search for common synonyms and alternate terms.
Using MCP:
Tool: SN-NL-Search
Parameters:
table_name: kb_knowledge
query: "published knowledge articles about resetting passwords or changing credentials or account lockout"
fields: sys_id,number,short_description,text,kb_knowledge_base,author
limit: 30
Using REST API:
GET /api/now/table/kb_knowledge?sysparm_query=workflow_state=published^short_descriptionLIKEpassword^ORshort_descriptionLIKEcredential^ORshort_descriptionLIKElockout&sysparm_fields=sys_id,number,short_description,text,kb_knowledge_base,author&sysparm_limit=30
Retrieve the full text of candidate duplicates and compare their content structure.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: kb_knowledge
query: numberIN KB0010234,KB0010567,KB0010890
fields: sys_id,number,short_description,text,wiki,kb_knowledge_base,kb_category,author,published,sys_updated_on
limit: 10
Using REST API:
GET /api/now/table/kb_knowledge?sysparm_query=numberINKB0010234,KB0010567,KB0010890&sysparm_fields=sys_id,number,short_description,text,wiki,kb_knowledge_base,kb_category,author,published,sys_updated_on
Check view counts, feedback ratings, and attachment counts to identify the most-used version.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: kb_use
query: article.numberINKB0010234,KB0010567,KB0010890
fields: article,article.number,viewed,useful,not_useful
limit: 20
Using REST API:
GET /api/now/table/kb_use?sysparm_query=article.numberINKB0010234,KB0010567,KB0010890&sysparm_fields=article,article.number,viewed,useful,not_useful&sysparm_limit=20
Check feedback records:
Tool: SN-Query-Table
Parameters:
table_name: kb_feedback
query: article.numberINKB0010234,KB0010567,KB0010890
fields: article,article.number,rating,comments,sys_created_on
limit: 50
Determine which articles are actively linked to incidents or cases.
Using MCP:
Tool: SN-Query-Table
Parameters:
table_name: m2m_kb_task
query: kb_knowledge.numberINKB0010234,KB0010567,KB0010890
fields: kb_knowledge,kb_knowledge.number,task,task.number
limit: 50
Using REST API:
GET /api/now/table/m2m_kb_task?sysparm_query=kb_knowledge.numberINKB0010234,KB0010567,KB0010890&sysparm_fields=kb_knowledge,kb_knowledge.number,task,task.number&sysparm_limit=50
Based on the analysis, choose a merge strategy and execute it.
Strategy A: Retire the Duplicate
Set the inferior article to "retired" and add a redirect note:
Tool: SN-Update-Record
Parameters:
table_name: kb_knowledge
sys_id: [duplicate_article_sys_id]
data:
workflow_state: retired
retirement_date: 2026-03-19
work_notes: "Retired as duplicate of KB0010234. Content merged into authoritative article."
Strategy B: Consolidate Content
Update the authoritative article with the best content from all duplicates:
Tool: SN-Update-Record
Parameters:
table_name: kb_knowledge
sys_id: [authoritative_article_sys_id]
data:
text: "[Merged content from KB0010234, KB0010567]"
work_notes: "Consolidated content from duplicate articles KB0010567 and KB0010890. Retired duplicates."
Using MCP:
Tool: SN-Add-Work-Notes
Parameters:
sys_id: [authoritative_article_sys_id]
work_notes: |
=== DEDUPLICATION ANALYSIS ===
Date: 2026-03-19
Analyst: Knowledge Manager
Duplicate Cluster Identified:
- KB0010234 (Authoritative) - 1,245 views, 4.5 rating, last updated 2026-02-15
- KB0010567 (Retired) - 312 views, 3.8 rating, last updated 2025-08-20
- KB0010890 (Retired) - 89 views, no rating, last updated 2025-03-10
Decision: Retained KB0010234 as primary. Merged unique resolution steps from KB0010567.
Retired KB0010567 and KB0010890.
Impact: Reduced duplicate search results for "password reset" queries.
| Tool | When to Use |
|------|-------------|
| SN-Query-Table | Structured queries for articles, usage data, feedback |
| SN-NL-Search | Natural language search for topic-based duplicate discovery |
| SN-Update-Record | Retire duplicates, update authoritative articles |
| SN-Add-Work-Notes | Document deduplication decisions and rationale |
| Endpoint | Method | Purpose |
|----------|--------|---------|
| /api/now/table/kb_knowledge | GET | Query knowledge articles |
| /api/now/table/kb_knowledge/{sys_id} | PATCH | Update or retire articles |
| /api/now/table/kb_use | GET | Retrieve usage/view metrics |
| /api/now/table/kb_feedback | GET | Retrieve user feedback and ratings |
| /api/now/table/m2m_kb_task | GET | Find articles linked to incidents |
Cause: Generic keywords matching unrelated articles
Solution: Add category or knowledge base filters: kb_knowledge_base=<sys_id>^short_descriptionLIKEpassword
Cause: Article lifecycle requires specific transitions (e.g., published -> review -> retired) Solution: Check the knowledge workflow configuration; you may need to move through intermediate states
Cause: kb_use tracking may not be enabled or articles accessed via direct URL bypass tracking
Solution: Verify the glide.knowman.track_article_usage property is set to true
Cause: Different teams created similar articles in separate knowledge bases Solution: Coordinate with knowledge base owners; cross-KB deduplication may require governance approval
Search: Articles about password reset procedures
Findings:
Action: Consolidated best content into KB0010234, retired KB0010567 and KB0010890. Notified HR knowledge base owner about the consolidated article.
Search: Articles about VPN setup and troubleshooting
Findings:
Action: Merged KB0020145 content into KB0020100 and retired KB0020145. Kept KB0020200 as it covers troubleshooting, not setup.
knowledge/gap-analysis - Find topics missing articlesknowledge/content-recommendation - Surface relevant articles for incidentsknowledge/article-generation - Create new articles from resolved incidentsknowledge/gap-grouping - Cluster knowledge gaps for action planningtesting
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