Custom Now Assist Skills with Skill Kit

SkillCloud & infra

Create custom Now Assist skills using Skill Kit including skill input/output definition, prompt configuration, skill testing with ATF, deployment, and building custom AI capabilities

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Custom Now Assist Skills with Skill Kit skill

What this skill tells your AI

The instructions your AI receives, as published by happy-technologies-llc/happy-platform-skills in skills/genai/skill-kit-custom/SKILL.md and read by ahel’s review.

Overview

This skill covers creating custom Now Assist skills using the Skill Kit framework:

  • Designing custom skills with defined inputs, outputs, and processing logic
  • Building prompt templates with dynamic variable injection
  • Configuring skill triggers and invocation contexts
  • Implementing multi-step skills with chained LLM calls
  • Testing skills with Automated Test Framework (ATF) integration
  • Deploying and versioning custom skills across instances
  • Building specialized AI capabilities (summarization, classification, generation, extraction)

When to use: When the built-in Now Assist skills do not meet your requirements and you need custom AI capabilities such as domain-specific summarization, automated classification, content generation, or data extraction.

Prerequisites

  • Roles: now_assist_admin, admin, atf_test_designer (for testing)
  • Plugins: sn_now_assist (Now Assist), com.snc.generative_ai_controller (Generative AI Controller), sn_gen_ai (Generative AI), com.snc.atf (ATF for testing)
  • Access: sn_now_assist_skill, sn_now_assist_skill_input, sn_now_assist_skill_output, sys_atf_test tables
  • Knowledge: Prompt engineering, LLM capabilities and limitations, ATF testing
  • Related Skills: genai/now-assist-qa for Q&A configuration, genai/ai-search-rag for RAG integration

Procedure

Step 1: Design the Custom Skill

Define the skill's purpose and interface before implementation.

Skill design checklist:

  • Purpose: What specific AI capability does this skill provide?
  • Trigger: How is the skill invoked (automatic, user-initiated, API)?
  • Inputs: What data does the skill need (record fields, user input, context)?
  • Processing: What LLM operations are performed (summarize, classify, generate, extract)?
  • Outputs: What results does the skill produce (text, structured data, actions)?
  • Context: Where does the skill run (agent workspace, portal, mobile, API)?

Common custom skill patterns:

PatternDescriptionExample Use Case
SummarizationCondense long text into key pointsIncident summarization, meeting notes
ClassificationCategorize input into predefined labelsTicket routing, sentiment analysis
GenerationCreate new content from instructionsEmail drafts, knowledge articles
ExtractionPull structured data from unstructured textEntity extraction, field population
TranslationConvert between formats or languagesTechnical to plain language
RecommendationSuggest actions based on contextResolution suggestions, next best action

Step 2: Create the Custom Skill Record

MCP Approach:

Use SN-Create-Record on sn_now_assist_skill:
  - name: "Incident Root Cause Analyzer"
  - description: "Analyzes incident description, work notes, and related records to suggest probable root causes"
  - skill_type: "custom"
  - context: "agent_workspace"
  - active: true
  - status: "draft"
  - category: "itsm"
  - invocation_type: "user_initiated"
  - target_table: "incident"
  - version: "1.0.0"

REST Approach:

POST /api/now/table/sn_now_assist_skill
Body: {
  "name": "Incident Root Cause Analyzer",
  "description": "Analyzes incident details to suggest probable root causes",
  "skill_type": "custom",
  "context": "agent_workspace",
  "active": true,
  "status": "draft",
  "category": "itsm",
  "invocation_type": "user_initiated",
  "target_table": "incident"
}

Invocation types:

TypeValueDescription
User Initiateduser_initiatedUser clicks a button or menu item
AutomaticautomaticTriggered on record events
APIapiCalled via REST API or script
ContextualcontextualTriggered based on workspace context

Step 3: Define Skill Inputs

Inputs define what data the skill receives for processing.

MCP Approach:

Use SN-Create-Record on sn_now_assist_skill_input:
  - skill: "<skill_sys_id>"
  - name: "incident_description"
  - label: "Incident Description"
  - type: "string"
  - source: "record_field"
  - source_field: "description"
  - source_table: "incident"
  - mandatory: true
  - order: 100
Use SN-Create-Record on sn_now_assist_skill_input:
  - skill: "<skill_sys_id>"
  - name: "work_notes"
  - label: "Work Notes"
  - type: "string"
  - source: "record_field"
  - source_field: "work_notes"
  - source_table: "incident"
  - mandatory: false
  - order: 200
Use SN-Create-Record on sn_now_assist_skill_input:
  - skill: "<skill_sys_id>"
  - name: "category"
  - label: "Category"
  - type: "string"
  - source: "record_field"
  - source_field: "category"
  - source_table: "incident"
  - mandatory: true
  - order: 300
Use SN-Create-Record on sn_now_assist_skill_input:
  - skill: "<skill_sys_id>"
  - name: "affected_ci"
  - label: "Affected CI"
  - type: "reference"
  - source: "record_field"
  - source_field: "cmdb_ci"
  - source_table: "incident"
  - mandatory: false
  - order: 400

Input source types:

SourceValueDescription
Record Fieldrecord_fieldValue from the target record
User Inputuser_inputPrompted from user at invocation
ContextcontextDerived from workspace context
StaticstaticHardcoded value
ComputedcomputedCalculated via script

REST Approach:

POST /api/now/table/sn_now_assist_skill_input
Body: {
  "skill": "<skill_sys_id>",
  "name": "incident_description",
  "label": "Incident Description",
  "type": "string",
  "source": "record_field",
  "source_field": "description",
  "source_table": "incident",
  "mandatory": true,
  "order": 100
}

Step 4: Define Skill Outputs

Outputs define what the skill returns after processing.

MCP Approach:

Use SN-Create-Record on sn_now_assist_skill_output:
  - skill: "<skill_sys_id>"
  - name: "root_cause_summary"
  - label: "Root Cause Summary"
  - type: "string"
  - display_type: "rich_text"
  - order: 100
Use SN-Create-Record on sn_now_assist_skill_output:
  - skill: "<skill_sys_id>"
  - name: "confidence_score"
  - label: "Confidence Score"
  - type: "decimal"
  - display_type: "badge"
  - order: 200
Use SN-Create-Record on sn_now_assist_skill_output:
  - skill: "<skill_sys_id>"
  - name: "suggested_category"
  - label: "Suggested Category"
  - type: "string"
  - display_type: "text"
  - order: 300
Use SN-Create-Record on sn_now_assist_skill_output:
  - skill: "<skill_sys_id>"
  - name: "related_kb_articles"
  - label: "Related Knowledge Articles"
  - type: "string"
  - display_type: "link_list"
  - order: 400

Output display types:

Display TypeValueDescription
Plain TexttextSimple text display
Rich Textrich_textFormatted HTML/markdown
BadgebadgeColor-coded label
Link Listlink_listClickable reference links
JSONjsonStructured data display
Action ButtonactionClickable action trigger

Step 5: Configure Skill Prompts

Prompts are the core of the skill -- they instruct the LLM on what to do.

MCP Approach:

Use SN-Create-Record on sn_now_assist_skill_prompt:
  - skill: "<skill_sys_id>"
  - name: "root_cause_analysis_prompt"
  - prompt_type: "system"
  - order: 100
  - template: |
      You are an expert IT incident analyst. Your task is to analyze incident
      information and determine the most probable root cause.

      Analyze the following incident details:

      Category: {category}
      Description: {incident_description}
      Work Notes: {work_notes}
      Affected CI: {affected_ci}

      Provide your analysis in the following format:

      ## Root Cause Summary
      [2-3 sentence summary of the most likely root cause]

      ## Contributing Factors
      - [Factor 1]
      - [Factor 2]
      - [Factor 3]

      ## Confidence Level
      [High/Medium/Low] - [Brief justification]

      ## Recommended Actions
      1. [Action 1]
      2. [Action 2]
      3. [Action 3]

      ## Suggested Category
      [If the incident appears miscategorized, suggest the correct category]

      Guidelines:
      - Base your analysis only on the provided information
      - If insufficient data, state what additional information would help
      - Consider common patterns for the given category
      - Prioritize actionable recommendations
  - active: true

Multi-step prompt (chained LLM call):

Use SN-Create-Record on sn_now_assist_skill_prompt:
  - skill: "<skill_sys_id>"
  - name: "extract_entities_prompt"
  - prompt_type: "preprocessing"
  - order: 50
  - template: |
      Extract the following entities from the incident description:

      Description: {incident_description}

      Return a JSON object with:
      {
        "affected_systems": ["list of systems mentioned"],
        "error_codes": ["any error codes found"],
        "timestamps": ["any times/dates mentioned"],
        "user_actions": ["what the user was doing when the issue occurred"]
      }
  - active: true

Prompt types:

TypeValueOrderDescription
Preprocessingpreprocessing1-49Extract/transform inputs before main analysis
Systemsystem50-99Main system instructions for the LLM
Useruser100+Dynamic user context injection
Postprocessingpostprocessing200+Format/validate LLM output

Step 6: Configure LLM Settings for the Skill

MCP Approach:

Use SN-Create-Record on sn_gen_ai_config:
  - name: "Root Cause Analyzer LLM Config"
  - description: "LLM parameters optimized for root cause analysis"
  - active: true
  - llm_provider: "now_llm"
  - model: "default"
  - temperature: 0.2
  - max_tokens: 800
  - top_p: 0.9
  - frequency_penalty: 0.2
  - presence_penalty: 0.1

Link to skill:

Use SN-Create-Record on sn_now_assist_skill_config:
  - skill: "<skill_sys_id>"
  - name: "llm_config"
  - config_type: "gen_ai_config"
  - value: "<gen_ai_config_sys_id>"
  - active: true

Temperature guidelines by skill type:

Skill TypeTemperatureRationale
Summarization0.1-0.3Factual accuracy is critical
Classification0.0-0.2Deterministic categorization
Root Cause Analysis0.2-0.4Balanced reasoning with accuracy
Content Generation0.5-0.7Creative but coherent output
Email Drafting0.4-0.6Professional tone with variation
Code Generation0.1-0.3Syntactic correctness required

Step 7: Create ATF Tests for the Skill

Automated testing ensures skill quality across updates.

Create ATF Test:

MCP Approach:

Use SN-Create-Record on sys_atf_test:
  - name: "Test - Root Cause Analyzer Skill"
  - description: "Validates the root cause analyzer skill produces expected output format and quality"
  - active: true
  - test_type: "automated"
  - category: "now_assist_skill"

Create Test Steps:

Step 1 -- Set up test incident:

Use SN-Create-Record on sys_atf_step:
  - test: "<atf_test_sys_id>"
  - order: 100
  - step_type: "create_record"
  - table: "incident"
  - description: "Create test incident with known root cause pattern"
  - step_config: '{
      "table": "incident",
      "fields": {
        "short_description": "Email server not responding since 2AM",
        "description": "Users reporting inability to send or receive emails. Exchange server shows high CPU utilization. Error code 0x80040115 in Outlook clients. Issue started after scheduled maintenance window at 2AM.",
        "category": "email",
        "priority": 2,
        "cmdb_ci": "<email_server_ci_sys_id>"
      }
    }'

Step 2 -- Invoke the skill:

Use SN-Create-Record on sys_atf_step:
  - test: "<atf_test_sys_id>"
  - order: 200
  - step_type: "invoke_now_assist_skill"
  - description: "Execute root cause analyzer skill on test incident"
  - step_config: '{
      "skill": "<skill_sys_id>",
      "record_table": "incident",
      "record_sys_id": "${test_incident_sys_id}"
    }'

Step 3 -- Validate output format:

Use SN-Create-Record on sys_atf_step:
  - test: "<atf_test_sys_id>"
  - order: 300
  - step_type: "validate_output"
  - description: "Verify skill output contains required sections"
  - step_config: '{
      "assertions": [
        {"field": "root_cause_summary", "operator": "is_not_empty"},
        {"field": "root_cause_summary", "operator": "contains", "value": "Root Cause"},
        {"field": "confidence_score", "operator": "greater_than", "value": 0},
        {"field": "confidence_score", "operator": "less_than_or_equal", "value": 1}
      ]
    }'

Step 4 -- Clean up test data:

Use SN-Create-Record on sys_atf_step:
  - test: "<atf_test_sys_id>"
  - order: 400
  - step_type: "delete_record"
  - description: "Remove test incident"
  - step_config: '{
      "table": "incident",
      "sys_id": "${test_incident_sys_id}"
    }'

REST Approach:

POST /api/now/table/sys_atf_test
Body: {
  "name": "Test - Root Cause Analyzer Skill",
  "description": "Validates root cause analyzer skill output",
  "active": true
}

Step 8: Create Skill Test Cases

Dedicated skill test cases for quality validation.

MCP Approach:

Use SN-Create-Record on sn_now_assist_skill_test:
  - skill: "<skill_sys_id>"
  - name: "Network Incident Root Cause"
  - description: "Tests root cause analysis for network-related incidents"
  - test_input: '{
      "incident_description": "Multiple users in Building A unable to access network resources. Switch in MDF room showing amber lights on ports 1-24. Issue started after power fluctuation at 3PM.",
      "category": "network",
      "work_notes": "Checked switch logs - multiple port flaps detected. UPS battery backup depleted during power event.",
      "affected_ci": "SW-BLDGA-MDF-01"
    }'
  - expected_output_contains: "power"
  - expected_confidence_min: 0.7
  - active: true
Use SN-Create-Record on sn_now_assist_skill_test:
  - skill: "<skill_sys_id>"
  - name: "Software Crash Root Cause"
  - description: "Tests root cause analysis for application crash incidents"
  - test_input: '{
      "incident_description": "CRM application crashing with OutOfMemoryError after latest patch deployment. Heap dump shows memory leak in report generation module.",
      "category": "software",
      "work_notes": "Application team confirmed new patch v2.4.1 deployed yesterday. No issues on staging environment.",
      "affected_ci": "APP-CRM-PROD-01"
    }'
  - expected_output_contains: "memory"
  - expected_confidence_min: 0.8
  - active: true

Step 9: Deploy and Activate the Skill

MCP Approach:

Use SN-Update-Record on sn_now_assist_skill:
  - sys_id: "<skill_sys_id>"
  - status: "published"
  - active: true
  - version: "1.0.0"

Verify all components are in place:

Use SN-Query-Table on sn_now_assist_skill_input:
  - query: skill=<skill_sys_id>^active=true
  - fields: name,type,source,mandatory
  - limit: 20
Use SN-Query-Table on sn_now_assist_skill_output:
  - query: skill=<skill_sys_id>
  - fields: name,type,display_type
  - limit: 20
Use SN-Query-Table on sn_now_assist_skill_prompt:
  - query: skill=<skill_sys_id>^active=true
  - fields: name,prompt_type,order
  - limit: 10

Step 10: Monitor Skill Performance

Query skill execution logs:

Use SN-Query-Table on sn_now_assist_skill_execution:
  - query: skill=<skill_sys_id>^sys_created_on>javascript:gs.daysAgo(7)
  - fields: sys_id,status,execution_time,input_tokens,output_tokens,error_message
  - limit: 50
  - orderBy: sys_created_on
  - orderDirection: desc

Track feedback:

Use SN-Query-Table on sn_now_assist_feedback:
  - query: skill=<skill_sys_id>^rating<3
  - fields: query,response,rating,feedback_text
  - limit: 20

Monitor token usage:

Use SN-Query-Table on sn_now_assist_skill_execution:
  - query: skill=<skill_sys_id>^sys_created_on>javascript:gs.daysAgo(30)
  - fields: input_tokens,output_tokens,execution_time
  - limit: 100

Tool Usage

ToolPurposeWhen to Use
SN-Query-TableFind existing skills, test results, feedbackDiscovery and monitoring
SN-Create-RecordCreate skills, inputs, outputs, prompts, testsBuilding skill components
SN-Update-RecordModify prompts, activate skills, version updatesIteration and deployment
SN-Get-Table-SchemaDiscover skill table fieldsUnderstanding available configurations

Best Practices

  1. Design inputs carefully -- only include fields that are genuinely needed for the LLM task
  2. Use structured prompt templates with clear sections and output format specifications
  3. Keep temperature low for analytical skills (classification, extraction) and moderate for generative skills
  4. Write comprehensive ATF tests covering edge cases, empty inputs, and expected failure modes
  5. Version your skills using semantic versioning (major.minor.patch)
  6. Use preprocessing prompts to extract entities before the main analysis prompt
  7. Set max_tokens appropriately -- too low truncates output, too high wastes tokens
  8. Include postprocessing to validate and format LLM output before displaying to users
  9. Monitor token usage to manage costs and identify optimization opportunities
  10. Iterate on prompts based on feedback -- small prompt changes can significantly impact quality

Troubleshooting

IssueCauseResolution
Skill not appearing in Now AssistStatus is draft or skill inactivePublish and activate the skill
Inputs not populatedSource field mapping incorrectVerify source_field and source_table match target record
Output format inconsistentPrompt template lacks explicit format instructionsAdd structured output format with examples in prompt
ATF test fails intermittentlyLLM non-determinism at higher temperaturesLower temperature or use fuzzy assertions
Skill execution timeoutPrompt too large or chained LLM calls too manyReduce input size, simplify prompt chain
Empty output returnedLLM config not linked or inactiveVerify gen_ai_config is active and linked to skill
Confidence score always lowInsufficient context in inputsAdd more relevant input fields or knowledge context
Prompt injection vulnerabilityUser input not sanitizedAdd input validation in preprocessing step

Examples

Example 1: Incident Summarization Skill

Create a custom skill to summarize incident history:

  • Inputs: short_description, description, work_notes, comments, state, priority
  • Prompt: Summarize incident timeline, key actions taken, current status in 3-5 bullet points
  • Outputs: summary (rich_text), key_dates (text), next_action (text)
  • LLM Config: Temperature 0.2, max 400 tokens
  • Tests: Network incident with 10+ work notes, simple incident with minimal notes

Example 2: Ticket Classification Skill

Create a custom skill for automated ticket categorization:

  • Inputs: short_description, description, caller_id.department
  • Prompt: Classify into category/subcategory from predefined taxonomy, return JSON
  • Outputs: suggested_category (text), suggested_subcategory (text), confidence (badge)
  • LLM Config: Temperature 0.0, max 200 tokens for deterministic classification
  • Tests: 10+ test cases covering each category with known correct classifications

Example 3: Resolution Notes Generator

Create a custom skill to generate resolution documentation:

  • Inputs: short_description, description, work_notes, close_code, resolved_by
  • Prompt: Generate professional resolution notes documenting the problem, investigation steps, root cause, and fix applied
  • Outputs: resolution_notes (rich_text), knowledge_candidate (text), reusable_solution (text)
  • LLM Config: Temperature 0.4, max 600 tokens for structured but readable output
  • Tests: Hardware failure, software bug, user error scenarios with expected resolution patterns

Related Skills

  • genai/now-assist-qa - Q&A skill configuration that complements custom skills
  • genai/ai-search-rag - RAG configuration for knowledge-grounded custom skills
  • genai/flow-generation - Flows that can trigger custom skills as actions
  • genai/playbook-generation - Playbooks that incorporate custom skill invocations
  • development/automated-testing - ATF framework for comprehensive skill testing

Signals

GitHub stars
37
Forks
13
Last commit
Jul 2026
Advanced
Catalog kind
skill
Gateway key
skill-kit-custom
Source
github.com/happy-technologies-llc/happy-platform-skills