mcpField
A
approval-summarization

approval-summarization

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

关于 approval-summarization

此技能帮助审批人员汇总 ServiceNow 待审批请求及相关上下文,以支持决策。它结合申请内容、申请人资料和历史审批信息,并整理成本、风险及合规因素。

主要功能

  1. 01检索待审批请求及条目详情
  2. 02提取申请表变量值
  3. 03补充申请人资料和组织信息
  4. 04分析相似请求的历史审批
  5. 05生成审批摘要与风险提示
  6. 06批量生成审批摘要

适用场景

  1. 01快速审阅待处理审批
  2. 02为审批人员生成定期摘要
  3. 03构建带上下文的审批仪表板
  4. 04识别高成本或异常申请

MCP 相关

说明使用 ServiceNow MCP 工具检索审批、请求、表单变量和用户资料,分析历史数据,并将摘要写入审批或请求记录。

安装

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

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

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

详细介绍

审批摘要

概述

此技能可生成全面的审批摘要,为审批者提供做出明智决策所需的背景信息。涵盖以下内容:

  • 从 sysapproval_approver 获取审批请求及其完整请求和项目背景
  • 从 sys_user 获取请求者的个人资料数据,包括角色、部门和经理,以丰富审批信息
  • 从 sc_req_item 提取变量值(表单答复),准确显示请求内容
  • 分析 sc_request 中类似请求的历史审批模式
  • 生成包含建议信号的结构化审批摘要
  • 识别每项审批的成本、风险和合规性注意事项

适用场景: 审批者需要快速获取待审批事项的全面摘要、构建审批摘要通知,或创建包含背景信息的审批仪表板时。

价值主张: 通过在单一视图中呈现所有相关背景信息,缩短审批决策时间、减少审批瓶颈,并通过呈现历史先例和风险因素提升决策质量。

前提条件

  • 角色: approver_user、itil 或 admin
  • 访问权限: 对 sysapproval_approver、sc_request、sc_req_item、sc_cat_item、item_option_new 和 sys_user 具有读取权限
  • 知识: 了解组织的审批政策和委派规则

流程

步骤 1:获取待审批事项

查询特定审批者或群组所有等待处理的审批。

使用 MCP(Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sysapproval_approver
  query: approver=[approver_sys_id]^state=requested
  fields: sys_id,sysapproval,sysapproval.number,sysapproval.short_description,sysapproval.sys_class_name,state,approver,group,sys_created_on,due_date,expected_start,comments
  limit: 25
  order_by: sys_created_on

使用 REST API:

GET /api/now/table/sysapproval_approver?sysparm_query=approver=[approver_sys_id]^state=requested&sysparm_fields=sys_id,sysapproval,sysapproval.number,sysapproval.short_description,sysapproval.sys_class_name,state,approver,group,sys_created_on,due_date,comments&sysparm_limit=25&sysparm_display_value=true

获取群组审批:

Tool: SN-Query-Table
Parameters:
  table_name: sysapproval_approver
  query: group=[group_sys_id]^state=requested
  fields: sys_id,sysapproval.number,sysapproval.short_description,state,group,sys_created_on,due_date
  limit: 25
步骤 2:获取请求和请求项目的详细信息

针对每项审批,获取完整的请求和项目背景信息。

获取请求项目的详细信息:

Tool: SN-Query-Table
Parameters:
  table_name: sc_req_item
  query: request=[request_sys_id]
  fields: sys_id,number,cat_item,cat_item.name,cat_item.short_description,cat_item.price,quantity,requested_for,requested_for.name,requested_for.department,requested_for.manager,opened_by,opened_by.name,stage,state,price,description
  limit: 10

使用 REST API:

GET /api/now/table/sc_req_item?sysparm_query=request=[request_sys_id]&sysparm_fields=sys_id,number,cat_item,cat_item.name,cat_item.short_description,cat_item.price,quantity,requested_for,requested_for.name,requested_for.department,requested_for.manager,opened_by,opened_by.name,stage,state,price,description&sysparm_limit=10&sysparm_display_value=true
步骤 3:提取变量值(表单答复)

获取请求者在目录项目表单中提供的具体答复。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sc_item_option_mtom
  query: request_item=[ritm_sys_id]
  fields: sc_item_option.item_option_new.question_text,sc_item_option.value,sc_item_option.item_option_new.name,sc_item_option.item_option_new.type
  limit: 30

使用后台脚本提取清晰的变量数据:

Tool: SN-Execute-Background-Script
Parameters:
  description: Extract catalog variable values for RITM
  script: |
    var ritmId = '[ritm_sys_id]';
    var ritm = new GlideRecord('sc_req_item');
    ritm.get(ritmId);

    var variables = [];
    var opts = new GlideRecord('sc_item_option_mtom');
    opts.addQuery('request_item', ritmId);
    opts.query();

    while (opts.next()) {
      var option = opts.sc_item_option;
      var varDef = option.item_option_new;
      if (varDef) {
        variables.push({
          question: varDef.question_text.toString(),
          answer: option.value.getDisplayValue(),
          variable_name: varDef.name.toString(),
          mandatory: varDef.mandatory.toString() === 'true'
        });
      }
    }

    var result = {
      ritm_number: ritm.number.toString(),
      item_name: ritm.cat_item.getDisplayValue(),
      requested_for: ritm.requested_for.getDisplayValue(),
      department: ritm.requested_for.department.getDisplayValue(),
      variables: variables
    };

    gs.info(JSON.stringify(result, null, 2));
步骤 4:获取请求者背景信息

收集有关请求者的相关信息。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sys_user
  query: sys_id=[requested_for_sys_id]
  fields: sys_id,name,user_name,email,title,department,manager,location,cost_center,company,vip,active
  limit: 1

使用 REST API:

GET /api/now/table/sys_user/[requested_for_sys_id]?sysparm_fields=sys_id,name,user_name,email,title,department,manager,location,cost_center,company,vip,active&sysparm_display_value=true
步骤 5:分析历史审批模式

查找类似的过往审批,为审批者的决策提供先例参考。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  description: Analyze historical approval patterns for similar requests
  script: |
    var catItemId = '[cat_item_sys_id]';
    var departmentId = '[department_sys_id]';

    var history = {
      same_item_total: 0,
      same_item_approved: 0,
      same_item_rejected: 0,
      same_dept_total: 0,
      avg_approval_time_hours: 0,
      recent_approvals: []
    };

    // Same item across all departments (last 6 months)
    var ga = new GlideAggregate('sysapproval_approver');
    ga.addQuery('sysapproval.sys_class_name', 'sc_req_item');
    ga.addQuery('sys_created_on', '>=', gs.monthsAgoStart(6));
    ga.addJoinQuery('sc_req_item', 'sysapproval', 'sys_id')
      .addCondition('cat_item', catItemId);
    ga.addAggregate('COUNT');
    ga.addAggregate('COUNT', 'state');
    ga.groupBy('state');
    ga.query();

    while (ga.next()) {
      var state = ga.state.toString();
      var count = parseInt(ga.getAggregate('COUNT'));
      history.same_item_total += count;
      if (state === 'approved') history.same_item_approved = count;
      if (state === 'rejected') history.same_item_rejected = count;
    }

    // Recent approvals for same item
    var recent = new GlideRecord('sysapproval_approver');
    recent.addQuery('sysapproval.sys_class_name', 'sc_req_item');
    recent.addQuery('state', 'approved');
    recent.addQuery('sys_created_on', '>=', gs.monthsAgoStart(3));
    recent.addJoinQuery('sc_req_item', 'sysapproval', 'sys_id')
      .addCondition('cat_item', catItemId);
    recent.orderByDesc('sys_updated_on');
    recent.setLimit(5);
    recent.query();

    while (recent.next()) {
      history.recent_approvals.push({
        approved_by: recent.approver.getDisplayValue(),
        date: recent.sys_updated_on.getDisplayValue(),
        request: recent.sysapproval.getDisplayValue()
      });
    }

    history.approval_rate = history.same_item_total > 0
      ? Math.round((history.same_item_approved / history.same_item_total) * 100) + '%'
      : 'N/A';

    gs.info(JSON.stringify(history, null, 2));
步骤 6:生成审批摘要

汇总所有收集到的背景信息,生成结构化摘要。

使用 MCP:

Tool: SN-Add-Work-Notes
Parameters:
  table_name: sysapproval_approver
  sys_id: [approval_sys_id]
  work_notes: |
    === APPROVAL SUMMARY ===

    REQUEST: REQ0045123 / RITM0067890
    ITEM: New Laptop Request - Performance Model (Dell Latitude 7640)
    PRICE: $1,800.00

    REQUESTER:
    - Name: John Smith ([email protected])
    - Title: Senior Software Engineer
    - Department: Engineering
    - Manager: Jane Doe
    - Location: Building A, Floor 3
    - VIP: No

    WHAT'S BEING REQUESTED:
    - Laptop Model: Performance (Dell Latitude 7640)
    - RAM: 32GB
    - Storage: 1TB SSD
    - Additional Software: Docker Desktop, IntelliJ IDEA
    - Business Justification: "Current laptop is 4 years old and unable to run containerized development environments. Build times exceed 30 minutes affecting productivity."
    - Replacing Existing: Yes (Asset Tag: LAP-2022-0456)

    HISTORICAL CONTEXT:
    - Same item ordered 47 times in last 6 months
    - Approval rate: 94% (44 approved, 3 rejected)
    - Engineering department: 18 orders (all approved)
    - Recent approvals: 3 in last 30 days by IT Director

    RISK ASSESSMENT:
    - Cost: Within standard budget threshold ($2,500)
    - Justification: Strong (productivity impact documented)
    - Precedent: Consistent with approval history
    - Compliance: Asset replacement documented

    RECOMMENDATION SIGNAL: Approve
步骤 7:批量汇总多项审批

为有多项待审批事项的审批者生成摘要。

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  description: Generate approval digest for approver
  script: |
    var approverId = '[approver_sys_id]';
    var digest = { approver: '', pending_count: 0, total_value: 0, approvals: [] };

    var approver = new GlideRecord('sys_user');
    approver.get(approverId);
    digest.approver = approver.name.toString();

    var ga = new GlideRecord('sysapproval_approver');
    ga.addQuery('approver', approverId);
    ga.addQuery('state', 'requested');
    ga.orderBy('sys_created_on');
    ga.query();

    while (ga.next()) {
      digest.pending_count++;

      var ritm = new GlideRecord('sc_req_item');
      if (ritm.get(ga.sysapproval.toString())) {
        var price = parseFloat(ritm.price) || 0;
        digest.total_value += price;

        digest.approvals.push({
          approval_id: ga.sys_id.toString(),
          request_number: ritm.request.getDisplayValue(),
          ritm_number: ritm.number.toString(),
          item: ritm.cat_item.getDisplayValue(),
          requested_for: ritm.requested_for.getDisplayValue(),
          department: ritm.requested_for.department.getDisplayValue(),
          price: price,
          waiting_since: ga.sys_created_on.getDisplayValue()
        });
      }
    }

    digest.total_value = '$' + digest.total_value.toFixed(2);
    gs.info(JSON.stringify(digest, null, 2));

工具用法

MCP 工具参考
工具使用场景
SN-Query-Table查询审批、请求、项目、变量和用户个人资料
SN-Get-Record获取单条审批或请求记录
SN-Natural-Language-Search根据描述关键词查找请求或项目
SN-Execute-Background-Script批量分析、历史模式分析和摘要生成
SN-Add-Work-Notes将审批摘要发布到审批或请求记录
REST API 参考
端点方法用途
/api/now/table/sysapproval_approverGET查询待审批事项
/api/now/table/sc_requestGET获取父请求的详细信息
/api/now/table/sc_req_itemGET获取请求项目的详细信息和变量
/api/now/table/sc_cat_itemGET查找目录项目定义
/api/now/table/sc_item_option_mtomGET从请求中提取变量值
/api/now/table/sys_userGET获取请求者的个人资料信息

最佳实践

  • 醒目展示业务依据: 依据变量对审批人来说是最重要的字段;始终将其放在最前面
  • 清晰展示总成本: 包含单价、数量、经常性费用以及任何基于变量的定价
  • 提供历史背景: 审批通过率和先例数据能显著降低决策的不确定性
  • 标记异常情况: 请求异常时(首次申请的项目、超出常规成本、VIP 请求人),应予以突出显示
  • 计算等待时间: 显示审批已挂起多久,以提高紧迫感
  • 按优先级分组: 审批摘要应按等待时长、成本或业务重要性排序,而非按创建日期排序
  • 遵守数据访问权限: 仅包含审批人有权查看的信息
  • 自动生成摘要: 为审批量较大的经理安排每日或每日两次生成审批摘要

故障排除

未找到变量值

原因: sc_item_option_mtom 联接未返回预期的变量值 解决方案: 部分项目直接使用 sc_item_option。请尝试使用 request_item=[ritm_sys_id] 查询 sc_item_option。对于较早的请求,变量的存储方式可能有所不同。

审批记录显示了错误的请求

原因: 审批记录上的 sysapproval 字段可能引用的是请求(REQ),而非请求项目(RITM) 解决方案: 检查 sysapproval.sys_class_name,确定审批关联的是 sc_request 还是 sc_req_item,并据此调整联接。

历史数据不完整

原因: 旧的审批记录可能已归档或清除 解决方案: 调整历史查询中的日期范围。检查实例是否对 sysapproval_approver 使用了表轮换或归档。

未填充请求人部门

原因: 用户记录上的 department 字段为空 解决方案: 使用 company 或 cost_center 作为组织背景信息。检查用户的经理层级是否能提供部门信息。

示例

示例 1:单项审批摘要

输入:“总结审批 SYSAPPR0012345”

**输出:**结构化摘要,包含请求详情、请求人档案、变量值、同一项目的历史审批通过率,以及基于先例和策略合规性的建议信号。

示例 2:每日审批摘要

输入:“为经理 Jane Doe 生成审批摘要”

输出:

APPROVAL DIGEST - Jane Doe
Date: 2026-03-19
Pending Approvals: 4
Total Value: $7,450.00

1. REQ0045123 / RITM0067890 - New Laptop ($1,800) - John Smith, Engineering - 2 days pending
2. REQ0045130 / RITM0067897 - Software License x5 ($2,500) - Lisa Park, Marketing - 1 day pending
3. REQ0045135 / RITM0067902 - Conference Travel ($2,400) - Mike Johnson, Sales - 4 hours pending
4. REQ0045138 / RITM0067905 - Desk Phone ($750) - Sarah Kim, HR - 1 hour pending
示例 3:带风险标记的高价值审批
Tool: SN-Get-Record
Parameters:
  table_name: sysapproval_approver
  sys_id: [approval_sys_id]

# Result analysis flags:
# - Cost exceeds $5,000 threshold (requires VP approval)
# - First time this item has been ordered by this department
# - Requester is a contractor (non-FTE)
# - No business justification provided (mandatory field bypass)

相关技能

  • catalog/approval-workflows - 配置审批路由规则
  • catalog/request-fulfillment - 审批后的履行处理
  • catalog/item-creation - 配置目录项目
  • catalog/catalog-item-generation - 根据描述生成项目
  • admin/workflow-creation - 构建审批工作流逻辑

评论

支持 Markdown