skills/genai/app-generation/SKILL.md
Generate ServiceNow scoped applications from requirements including tables, forms, ACLs, and business logic
npx skillsauth add happy-technologies-llc/happy-servicenow-skills app-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 covers generating complete ServiceNow scoped applications from requirements, including:
When to use: When building a new custom application from scratch, prototyping a solution from business requirements, or automating the creation of standardized application templates.
admin, maint (for table creation), or application_creatordevelopment/code-assist for script generation patternssys_scope (Application Scope)
├── sys_app (Application Record)
├── sys_db_object (Tables)
│ └── sys_dictionary (Fields/Columns)
├── sys_ui_form (Forms)
│ └── sys_ui_form_section (Form Sections)
├── sys_ui_list (List Views)
├── sys_security_acl (ACL Rules)
├── sys_script (Business Rules)
├── sys_script_client (Client Scripts)
├── sys_script_include (Script Includes)
├── sys_app_module (Navigation Modules)
└── sys_properties (Application Properties)
Key Tables: | Table | Purpose | |-------|---------| | sys_scope | Application scope definition and namespace | | sys_app | Application metadata and version info | | sys_metadata | Base record for all application artifacts | | sys_db_object | Table definitions | | sys_dictionary | Field/column definitions for tables | | sys_security_acl | Access control rules |
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_scope
data:
name: "Asset Tracking Pro"
scope: "x_happy_asset_trk"
short_description: "Custom asset tracking and lifecycle management application"
version: "1.0.0"
vendor: "Happy Technologies LLC"
vendor_prefix: "x_happy"
active: true
licensable: false
js_level: "helsinki_es6"
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_scope" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-X POST \
-d '{
"name": "Asset Tracking Pro",
"scope": "x_happy_asset_trk",
"short_description": "Custom asset tracking and lifecycle management application",
"version": "1.0.0",
"vendor": "Happy Technologies LLC",
"active": true
}'
Create the primary table:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_db_object
data:
name: "x_happy_asset_trk_asset"
label: "Tracked Asset"
super_class: task
is_extendable: true
create_access: true
read_access: true
update_access: true
delete_access: true
sys_scope: [scope_sys_id]
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_db_object" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"name": "x_happy_asset_trk_asset",
"label": "Tracked Asset",
"super_class": "task",
"is_extendable": true,
"sys_scope": "[scope_sys_id]"
}'
Create a supporting table:
Tool: SN-Create-Record
Parameters:
table_name: sys_db_object
data:
name: "x_happy_asset_trk_asset_history"
label: "Asset History"
is_extendable: false
sys_scope: [scope_sys_id]
Add string field:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "asset_tag"
column_label: "Asset Tag"
internal_type: "string"
max_length: 40
mandatory: true
unique: true
active: true
read_only: false
sys_scope: [scope_sys_id]
Add reference field:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "assigned_user"
column_label: "Assigned User"
internal_type: "reference"
reference: "sys_user"
max_length: 32
mandatory: false
active: true
sys_scope: [scope_sys_id]
Add choice field:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
column_label: "Asset Status"
internal_type: "string"
max_length: 40
choice: 1
mandatory: true
default_value: "available"
active: true
sys_scope: [scope_sys_id]
Add choices for the choice field:
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "Available"
value: "available"
sequence: 100
inactive: false
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "In Use"
value: "in_use"
sequence: 200
inactive: false
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "In Maintenance"
value: "in_maintenance"
sequence: 300
inactive: false
Tool: SN-Create-Record
Parameters:
table_name: sys_choice
data:
name: "x_happy_asset_trk_asset"
element: "asset_status"
label: "Retired"
value: "retired"
sequence: 400
inactive: false
Add date field:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "purchase_date"
column_label: "Purchase Date"
internal_type: "glide_date"
mandatory: false
active: true
sys_scope: [scope_sys_id]
Add currency field:
Tool: SN-Create-Record
Parameters:
table_name: sys_dictionary
data:
name: "x_happy_asset_trk_asset"
element: "purchase_cost"
column_label: "Purchase Cost"
internal_type: "currency"
mandatory: false
active: true
sys_scope: [scope_sys_id]
Create table-level read ACL:
MCP Approach:
Tool: SN-Create-Record
Parameters:
table_name: sys_security_acl
data:
name: "x_happy_asset_trk_asset"
operation: "read"
type: "record"
active: true
admin_overrides: true
advanced: false
condition: ""
sys_scope: [scope_sys_id]
Create role-based ACL:
Tool: SN-Create-Record
Parameters:
table_name: sys_security_acl
data:
name: "x_happy_asset_trk_asset"
operation: "write"
type: "record"
active: true
admin_overrides: true
sys_scope: [scope_sys_id]
Associate role with ACL:
Tool: SN-Create-Record
Parameters:
table_name: sys_security_acl_role
data:
sys_security_acl: [acl_sys_id]
sys_user_role: [role_sys_id]
Create custom application role:
Tool: SN-Create-Record
Parameters:
table_name: sys_user_role
data:
name: "x_happy_asset_trk.manager"
description: "Asset Tracking Manager - full CRUD access"
assignable_by: [admin_role_sys_id]
sys_scope: [scope_sys_id]
Tool: SN-Create-Record
Parameters:
table_name: sys_user_role
data:
name: "x_happy_asset_trk.user"
description: "Asset Tracking User - read and create access"
assignable_by: [admin_role_sys_id]
sys_scope: [scope_sys_id]
Before insert business rule - auto-generate asset tag:
Tool: SN-Create-Record
Parameters:
table_name: sys_script
data:
name: "Generate Asset Tag"
collection: "x_happy_asset_trk_asset"
when: "before"
order: 100
active: true
action_insert: true
sys_scope: [scope_sys_id]
script: |
(function executeRule(current, previous) {
if (!current.asset_tag) {
var prefix = 'AST';
var ga = new GlideAggregate('x_happy_asset_trk_asset');
ga.addAggregate('COUNT');
ga.query();
var count = 0;
if (ga.next()) {
count = parseInt(ga.getAggregate('COUNT'), 10);
}
current.asset_tag = prefix + '-' + gs.nowNoTZ().substring(0, 4) + '-' + String(count + 1).padStart(5, '0');
}
})(current, previous);
After update business rule - track status changes:
Tool: SN-Create-Record
Parameters:
table_name: sys_script
data:
name: "Track Asset Status Change"
collection: "x_happy_asset_trk_asset"
when: "after"
order: 200
active: true
action_update: true
sys_scope: [scope_sys_id]
script: |
(function executeRule(current, previous) {
if (current.asset_status.changes()) {
var history = new GlideRecord('x_happy_asset_trk_asset_history');
history.initialize();
history.asset = current.sys_id;
history.previous_status = previous.asset_status;
history.new_status = current.asset_status;
history.changed_by = gs.getUserID();
history.changed_on = new GlideDateTime();
history.insert();
}
})(current, previous);
Create application menu:
Tool: SN-Create-Record
Parameters:
table_name: sys_app_application
data:
title: "Asset Tracking"
hint: "Asset Tracking Pro application"
device_type: "browser"
category: "custom"
active: true
sys_scope: [scope_sys_id]
Create navigation modules:
Tool: SN-Create-Record
Parameters:
table_name: sys_app_module
data:
title: "All Assets"
application: [app_menu_sys_id]
hint: "View all tracked assets"
link_type: "LIST"
name: "x_happy_asset_trk_asset"
query: ""
order: 100
active: true
sys_scope: [scope_sys_id]
Tool: SN-Create-Record
Parameters:
table_name: sys_app_module
data:
title: "Create New Asset"
application: [app_menu_sys_id]
hint: "Create a new tracked asset"
link_type: "NEW"
name: "x_happy_asset_trk_asset"
order: 200
active: true
sys_scope: [scope_sys_id]
Tool: SN-Create-Record
Parameters:
table_name: sys_app_module
data:
title: "My Assigned Assets"
application: [app_menu_sys_id]
hint: "Assets assigned to me"
link_type: "LIST"
name: "x_happy_asset_trk_asset"
query: "assigned_user=javascript:gs.getUserID()"
order: 300
active: true
sys_scope: [scope_sys_id]
Check all application artifacts:
MCP Approach:
Tool: SN-Query-Table
Parameters:
table_name: sys_metadata
query: sys_scope=[scope_sys_id]
fields: sys_id,sys_class_name,sys_name
limit: 200
REST Alternative:
curl -u "$SN_USER:$SN_PASS" \
"$SN_INSTANCE/api/now/table/sys_metadata?sysparm_query=sys_scope=[scope_sys_id]&sysparm_fields=sys_id,sys_class_name,sys_name&sysparm_limit=200" \
-H "Accept: application/json"
| Action | MCP Tool | REST Endpoint | |--------|----------|---------------| | Create app scope | SN-Create-Record | POST /api/now/table/sys_scope | | Create table | SN-Create-Record | POST /api/now/table/sys_db_object | | Add fields | SN-Create-Record | POST /api/now/table/sys_dictionary | | Create ACLs | SN-Create-Record | POST /api/now/table/sys_security_acl | | Create business rules | SN-Create-Record | POST /api/now/table/sys_script | | Create navigation | SN-Create-Record | POST /api/now/table/sys_app_module | | Query metadata | SN-Query-Table | GET /api/now/table/sys_metadata | | Validate app | SN-Query-Table | GET /api/now/table/sys_scope |
x_vendor_app)task table for workflow-enabled entitiessys_properties rather than hard-codingSymptom: Error creating sys_db_object record Causes:
maint roleTool: SN-Query-Table
Parameters:
table_name: sys_db_object
query: name=x_happy_asset_trk_asset
fields: sys_id,name,label,sys_scope
Symptom: Users can access records despite ACL rules Causes:
Tool: SN-Query-Table
Parameters:
table_name: sys_security_acl
query: name=x_happy_asset_trk_asset^active=true
fields: sys_id,name,operation,type,admin_overrides,condition
limit: 20
Symptom: "Scope access denied" when running scripts Cause: Cross-scope access not configured Solution: Check scope access settings:
Tool: SN-Query-Table
Parameters:
table_name: sys_scope_privilege
query: source_scope=[scope_sys_id]
fields: sys_id,source_scope,target_scope,type,operation,status
limit: 20
Symptom: Created fields not visible on the form Cause: Fields exist in dictionary but not added to form layout Solution: Create form section entries or use the form designer. Verify field existence:
Tool: SN-Query-Table
Parameters:
table_name: sys_dictionary
query: name=x_happy_asset_trk_asset^active=true
fields: element,column_label,internal_type,mandatory
limit: 50
# 1. Create scope
Tool: SN-Create-Record
Parameters:
table_name: sys_scope
data:
name: "Visitor Management"
scope: "x_happy_visitor"
version: "1.0.0"
vendor: "Happy Technologies LLC"
# 2. Create visitor table extending task
Tool: SN-Create-Record
Parameters:
table_name: sys_db_object
data:
name: "x_happy_visitor_visit"
label: "Visitor Request"
super_class: task
# 3. Add fields: visitor_name, company, host, visit_date, badge_number
# 4. Create ACLs for receptionist and host roles
# 5. Create business rule to auto-assign badge numbers
# 6. Create client script for date validation
# 7. Create navigation modules
# 8. Validate all artifacts via sys_metadata
genai/app-summary - Analyze and summarize existing applicationsdevelopment/code-assist - AI-assisted code generation for scriptsdevelopment/code-review - Review generated code for qualitysecurity/acl-management - Detailed ACL configurationadmin/update-set-management - Package application for deploymenttesting
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