mcpField
A
app-generation

app-generation

github.com/happy-technologies-llc开发4141 次安装2 天前更新
代码仓库

关于 app-generation

app-generation 是根据需求创建 ServiceNow 作用域应用的技能。它指导开发者构建数据模型、访问控制、业务逻辑和导航,并验证应用组件。

主要功能

  1. 01创建应用作用域与元数据
  2. 02定义表和字段
  3. 03配置表单与导航
  4. 04设置 ACL 和应用角色
  5. 05构建业务规则并验证组件

适用场景

  1. 01根据业务需求制作应用原型
  2. 02创建可复用的作用域应用模板
  3. 03构建自定义资产跟踪应用

MCP 相关

该技能介绍通过 SN-Create-Record 创建应用组件,并用 SN-Query-Table 检查和验证组件的 MCP 工作流。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill app-generation

安装后在 Claude Code 中输入/app-generation确认已加载。

详细介绍

ServiceNow 作用域应用生成

概述

本技能涵盖根据需求生成完整的 ServiceNow 作用域应用,包括:

  • 创建应用作用域和元数据
  • 定义自定义表及其字段、索引和关系
  • 生成表单、列表和 UI 配置
  • 创建基于角色的访问控制 ACL 规则
  • 构建业务规则、客户端脚本和脚本包含
  • 设置应用导航和模块
  • 配置应用属性和系统设置

适用场景: 从头构建新的自定义应用、根据业务需求对解决方案进行原型设计,或自动创建标准化应用模板时。

先决条件

  • 角色: admin、maint(用于创建表)或 application_creator
  • 访问权限: sys_scope、sys_app、sys_db_object、sys_dictionary、sys_security_acl、sys_script 表
  • 知识: ServiceNow 应用模型、作用域应用、数据建模、ACL 架构
  • 插件: 无需额外插件;建议使用 Studio (com.glide.studio)
  • 相关技能: 完成 development/code-assist,了解脚本生成模式

流程

步骤 1:了解应用架构
sys_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)

主要表:

表用途
sys_scope应用作用域定义和命名空间
sys_app应用元数据和版本信息
sys_metadata所有应用构件的基础记录
sys_db_object表定义
sys_dictionary表的字段/列定义
sys_security_acl访问控制规则
步骤 2:创建应用作用域

MCP 方式:

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 替代方式:

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
  }'
步骤 3:创建应用表

创建主表:

MCP 方式:

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 替代方式:

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]"
  }'

创建辅助表:

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]
步骤 4:向表中添加字段

添加字符串字段:

MCP 方式:

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]

添加引用字段:

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]

添加选项字段:

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]

为选项字段添加选项:

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

添加日期字段:

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]

添加货币字段:

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]
步骤 5:创建 ACL 规则

创建表级读取 ACL:

MCP 方式:

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]

创建基于角色的 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]

将角色关联到 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]

创建自定义应用角色:

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]
步骤 6:创建业务逻辑

插入前业务规则——自动生成资产标签:

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);

更新后业务规则——跟踪状态变更:

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);
步骤 7:创建应用导航

创建应用菜单:

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]

创建导航模块:

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]
步骤 8:验证应用

检查所有应用构件:

MCP 方式:

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 替代方式:

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"

工具用法

操作MCP 工具REST 端点
创建应用作用域SN-Create-RecordPOST /api/now/table/sys_scope
创建表SN-Create-RecordPOST /api/now/table/sys_db_object
添加字段SN-Create-RecordPOST /api/now/table/sys_dictionary
创建 ACLSN-Create-RecordPOST /api/now/table/sys_security_acl
创建业务规则SN-Create-RecordPOST /api/now/table/sys_script
创建导航SN-Create-RecordPOST /api/now/table/sys_app_module
查询元数据SN-Query-TableGET /api/now/table/sys_metadata
验证应用SN-Query-TableGET /api/now/table/sys_scope

最佳实践

  • 使用范围化应用: 始终在范围内创建应用,以确保可移植性和隔离性
  • 遵循命名规范: 为所有构件添加范围命名空间前缀(例如,x_vendor_app)
  • 围绕任务设计表: 为支持工作流的实体扩展 task 表
  • 尽早创建角色: 在创建 ACL 之前定义应用角色,以确保访问控制一致
  • 使用应用属性: 将可配置值存储在 sys_properties 中,而不是硬编码
  • 逐步构建: 先创建表和字段,再创建 ACL,然后编写业务逻辑,最后构建 UI
  • 边构建边编写文档: 为每个表、字段、ACL 和脚本添加说明
  • 在开发者实例中测试: 始终先在个人开发者实例中进行原型设计,再部署到生产环境
  • 为升级做好规划: 避免修改基线表;改为扩展或创建自定义表
  • 包含数据清理脚本: 规划应用移除流程,并制定清理步骤

故障排除

表创建失败

症状: 创建 sys_db_object 记录时出错 原因:

  1. 缺少 maint 角色
  2. 表名与范围前缀不匹配
  3. 表名已存在 解决方案:
Tool: SN-Query-Table
Parameters:
  table_name: sys_db_object
  query: name=x_happy_asset_trk_asset
  fields: sys_id,name,label,sys_scope
ACL 未生效

症状: 尽管有 ACL 规则,用户仍可访问记录 原因:

  1. ACL 未启用
  2. 优先级更高的 ACL 授予了访问权限
  3. 用户拥有 admin 角色(admin_overrides = true) 解决方案: 检查 ACL 评估顺序:
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
范围访问错误

症状: 运行脚本时出现“Scope access denied” 原因: 未配置跨范围访问 解决方案: 检查范围访问设置:

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
字段未显示在表单上

症状: 创建的字段未显示在表单上 原因: 字段已存在于字典中,但未添加到表单布局 解决方案: 创建表单分区条目或使用表单设计器。验证字段是否存在:

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 - 分析并总结现有应用
  • development/code-assist - AI 辅助生成脚本代码
  • development/code-review - 审查生成的代码质量
  • security/acl-management - ACL 配置详解
  • admin/update-set-management - 打包应用以便部署

评论

支持 Markdown