mcpField
I
issue-action-plan

issue-action-plan

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

关于 issue-action-plan

此 ServiceNow GRC 技能为风险与合规问题制定结构化整改计划,面向 GRC 团队及审计响应场景。它关联风险、控制和责任人,并支持创建合规任务及保留审计记录。

主要功能

  1. 01检索并分析未结 GRC 问题
  2. 02按风险和合规影响排序
  3. 03生成整改步骤、责任人与期限
  4. 04定义可衡量的完成标准
  5. 05创建合规任务并记录计划

适用场景

  1. 01制定审计发现的整改方案
  2. 02安排合规缺口的纠正行动
  3. 03风险评审后规划问题处理优先级

MCP 相关

技能说明使用 ServiceNow MCP 工具查询 GRC 问题、风险和控制,创建合规任务,并更新问题记录以保留行动计划。

安装

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

$npx skills add https://github.com/happy-technologies-llc/happy-platform-skills --skill issue-action-plan

安装后在 Claude Code 中输入/issue-action-plan确认已加载。

详细介绍

GRC 问题行动计划生成

概述

此技能可为 ServiceNow 中的治理、风险与合规(GRC)问题生成结构化行动计划。内容包括:

  • 检索并分析未解决的 GRC 问题及其关联的风险、控制措施和档案
  • 根据风险评级、合规影响和业务关键性确定问题优先级
  • 制定补救步骤,明确负责人和截止日期
  • 定义可衡量的成功标准和验证检查点
  • 创建合规任务以跟踪补救进度
  • 生成可供审计的行动计划文档

适用场景:

  • GRC 问题需要制定正式补救计划时
  • 审计发现需要结构化响应计划时
  • 合规差距需要记录纠正措施时
  • 定期风险审查需要更新行动计划时
  • 管理层要求制定优先级问题解决路线图时

先决条件

  • 角色: sn_grc.manager、sn_compliance.manager 或 admin
  • 插件: com.sn_grc、com.sn_compliance、com.sn_risk
  • 访问权限: 对 sn_grc_issue、sn_compliance_task、sn_grc_risk 表具有读写权限
  • 知识: 了解组织的风险承受能力和合规框架

GRC 关键表

表用途关键字段
sn_grc_issueGRC 问题和发现number、short_description、state、priority、risk_rating、profile、item
sn_grc_risk风险记录number、short_description、risk_score、state、treatment、profile
sn_compliance_control合规控制措施number、short_description、state、control_objective、owner
sn_compliance_task合规补救任务number、short_description、state、assigned_to、due_date
sn_grc_itemGRC 内容项number、short_description、item_type、profile
sn_grc_profileGRC 实体档案number、short_description、profile_type、applies_to

流程

步骤 1:检索未解决的 GRC 问题

查询所有未解决的 GRC 问题,并按风险评级和优先级排序。

使用 MCP(Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sn_grc_issue
  query: active=true^stateIN1,2,3^ORDERBYDESCrisk_rating
  fields: sys_id,number,short_description,description,state,priority,risk_rating,profile,item,assigned_to,due_date,category,sys_created_on
  limit: 50

使用 REST API:

GET /api/now/table/sn_grc_issue?sysparm_query=active=true^stateIN1,2,3^ORDERBYDESCrisk_rating&sysparm_fields=sys_id,number,short_description,description,state,priority,risk_rating,profile,item,assigned_to,due_date,category&sysparm_limit=50
步骤 2:分析相关风险和控制措施

针对每个高优先级问题,检索相关风险和控制措施的背景信息。

获取相关风险:

Tool: SN-Query-Table
Parameters:
  table_name: sn_grc_risk
  query: profile=[issue_profile_sys_id]^active=true
  fields: sys_id,number,short_description,risk_score,state,treatment,residual_risk,inherent_risk,category
  limit: 20

获取相关控制措施:

Tool: SN-Query-Table
Parameters:
  table_name: sn_compliance_control
  query: profile=[issue_profile_sys_id]^active=true
  fields: sys_id,number,short_description,state,control_objective,owner,effectiveness,test_result
  limit: 20

使用 REST API:

GET /api/now/table/sn_grc_risk?sysparm_query=profile=[profile_sys_id]^active=true&sysparm_fields=sys_id,number,short_description,risk_score,state,treatment,residual_risk,inherent_risk&sysparm_limit=20
步骤 3:按风险和合规影响确定问题优先级

生成带评分的优先级问题列表:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var issues = [];
    var gr = new GlideRecord('sn_grc_issue');
    gr.addQuery('active', true);
    gr.addQuery('state', 'IN', '1,2,3');
    gr.orderByDesc('risk_rating');
    gr.query();

    while (gr.next()) {
      var riskScore = 0;
      var controlGaps = 0;

      // Get associated risk score
      var risk = new GlideRecord('sn_grc_risk');
      risk.addQuery('profile', gr.profile.toString());
      risk.addQuery('active', true);
      risk.query();
      while (risk.next()) {
        var score = parseInt(risk.risk_score.toString()) || 0;
        if (score > riskScore) riskScore = score;
      }

      // Count failing controls
      var ctrl = new GlideRecord('sn_compliance_control');
      ctrl.addQuery('profile', gr.profile.toString());
      ctrl.addQuery('state', 'NOT IN', 'compliant,passed');
      ctrl.query();
      controlGaps = ctrl.getRowCount();

      var compositeScore = (riskScore * 0.6) + (controlGaps * 10 * 0.2) + (parseInt(gr.risk_rating) || 0) * 20 * 0.2;

      issues.push({
        number: gr.number.toString(),
        description: gr.short_description.toString(),
        risk_rating: gr.risk_rating.toString(),
        priority: gr.priority.toString(),
        max_risk_score: riskScore,
        control_gaps: controlGaps,
        composite_score: Math.round(compositeScore),
        profile: gr.profile.getDisplayValue(),
        due_date: gr.due_date.toString()
      });
    }

    issues.sort(function(a, b) { return b.composite_score - a.composite_score; });
    gs.info('PRIORITIZED GRC ISSUES:\n' + JSON.stringify(issues.slice(0, 20), null, 2));
  description: "GRC: Prioritize issues by composite risk and compliance score"
步骤 4:为问题生成行动计划

制定全面的补救行动计划:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var issueNumber = 'ISSUE0001234'; // Replace with target issue
    var gr = new GlideRecord('sn_grc_issue');
    gr.addQuery('number', issueNumber);
    gr.query();

    if (gr.next()) {
      var plan = {
        issue: {
          number: gr.number.toString(),
          description: gr.short_description.toString(),
          detail: gr.description.toString(),
          risk_rating: gr.risk_rating.toString(),
          priority: gr.priority.toString(),
          profile: gr.profile.getDisplayValue(),
          current_state: gr.state.getDisplayValue()
        },
        related_risks: [],
        affected_controls: [],
        remediation_steps: [],
        timeline: {},
        success_criteria: []
      };

      // Gather related risks
      var risk = new GlideRecord('sn_grc_risk');
      risk.addQuery('profile', gr.profile.toString());
      risk.addQuery('active', true);
      risk.query();
      while (risk.next()) {
        plan.related_risks.push({
          number: risk.number.toString(),
          description: risk.short_description.toString(),
          score: risk.risk_score.toString(),
          treatment: risk.treatment.getDisplayValue()
        });
      }

      // Gather affected controls
      var ctrl = new GlideRecord('sn_compliance_control');
      ctrl.addQuery('profile', gr.profile.toString());
      ctrl.query();
      while (ctrl.next()) {
        plan.affected_controls.push({
          number: ctrl.number.toString(),
          description: ctrl.short_description.toString(),
          state: ctrl.state.getDisplayValue(),
          owner: ctrl.owner.getDisplayValue()
        });
      }

      // Define timeline based on risk rating
      var riskRating = parseInt(gr.risk_rating) || 3;
      if (riskRating >= 4) {
        plan.timeline = { target_days: 30, review_frequency: 'Weekly', escalation: 'Immediate executive notification' };
      } else if (riskRating >= 3) {
        plan.timeline = { target_days: 60, review_frequency: 'Bi-weekly', escalation: 'Management review within 48 hours' };
      } else {
        plan.timeline = { target_days: 90, review_frequency: 'Monthly', escalation: 'Standard reporting cycle' };
      }

      // Define success criteria
      plan.success_criteria = [
        'All related controls return to compliant state',
        'Residual risk score reduced below organizational threshold',
        'Remediation evidence documented and reviewed',
        'Control owner sign-off obtained',
        'Post-remediation testing completed successfully'
      ];

      gs.info('ACTION PLAN:\n' + JSON.stringify(plan, null, 2));
    }
  description: "GRC: Generate comprehensive action plan for a specific issue"
步骤 5:创建补救合规任务

创建与问题关联的结构化补救任务:

使用 MCP:

Tool: SN-Create-Record
Parameters:
  table_name: sn_compliance_task
  fields:
    short_description: "Remediate control gap identified in ISSUE0001234"
    description: "Implement corrective action for control failure. Review control design and operating effectiveness. Document remediation evidence."
    assigned_to: [responsible_user_sys_id]
    due_date: 2026-04-30
    priority: 2
    state: 1
    parent: [issue_sys_id]

使用 REST API:

POST /api/now/table/sn_compliance_task
Content-Type: application/json

{
  "short_description": "Remediate control gap identified in ISSUE0001234",
  "description": "Implement corrective action for control failure.",
  "assigned_to": "[user_sys_id]",
  "due_date": "2026-04-30",
  "priority": "2",
  "state": "1"
}
步骤 6:在问题中添加行动计划引用

使用 MCP:

Tool: SN-Update-Record
Parameters:
  table_name: sn_grc_issue
  sys_id: [issue_sys_id]
  fields:
    work_notes: |
      === ACTION PLAN GENERATED ===
      Composite Risk Score: 85/100
      Remediation Timeline: 30 days
      Review Frequency: Weekly
      Compliance Tasks Created: 3
      Responsible Party: [Control Owner Name]

      Success Criteria:
      1. All related controls return to compliant state
      2. Residual risk score reduced below threshold
      3. Evidence documented and reviewed
      4. Control owner sign-off obtained
    state: 2

使用 REST API:

PATCH /api/now/table/sn_grc_issue/[sys_id]
Content-Type: application/json

{
  "work_notes": "ACTION PLAN GENERATED - See compliance tasks for details",
  "state": "2"
}

工具用法

操作MCP 工具REST 端点
查询问题SN-Query-TableGET /api/now/table/sn_grc_issue
搜索问题SN-Natural-Language-SearchN/A
分析风险SN-Query-TableGET /api/now/table/sn_grc_risk
创建任务SN-Create-RecordPOST /api/now/table/sn_compliance_task
更新问题SN-Update-RecordPATCH /api/now/table/sn_grc_issue
复杂分析SN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
架构发现SN-Discover-Table-SchemaGET /api/now/table/sys_dictionary

最佳实践

  • 基于风险的优先级排序: 始终根据综合风险评分而非单个问题的优先级来安排行动计划
  • SMART 标准: 将成功标准定义为具体、可衡量、可实现、相关且有时限
  • 明确责任归属: 每个补救步骤都必须由一名明确负责的人员承担,而不是由一个群体负责
  • 证据要求: 明确必须收集哪些证据来证明补救工作已完成
  • 升级途径: 为逾期或停滞的补救工作制定明确的升级流程
  • 定期审查: 安排定期检查点,依据行动计划时间表核实进度
  • 审计跟踪: 在工作备注中记录所有计划变更和决策,以做好审计准备

故障排除

查询未返回问题

症状: 查询活跃的 GRC 问题时返回空结果 原因: 问题可能使用自定义状态,或者 GRC 插件尚未完全激活 解决方案:

Tool: SN-Discover-Table-Schema
Parameters:
  table_name: sn_grc_issue

确认 state 字段的选项,并相应调整查询筛选条件。

风险评级字段为空

症状: 问题缺少优先级排序所需的 risk_rating 值 原因: 尚未执行风险评估,或者 risk_rating 是一个计算字段 解决方案: 检查 risk_rating 是否通过风险评估工作流填充。查询 sn_risk_definition 表,以确认风险评分配置。

合规任务未关联到问题

症状: 创建的任务未显示在父问题下 原因: 父字段引用不正确,或者需要使用关系表 解决方案: 使用 sn_grc_item 作为中间表,或者检查问题与任务之间是否存在多对多关系表。

示例

示例 1:关键合规差距行动计划

场景: 审计发现揭示了影响 SOX 的关键访问控制故障

Tool: SN-Query-Table
Parameters:
  table_name: sn_grc_issue
  query: active=true^priority=1^risk_ratingIN1,2^123TEXTQUERY321=SOX
  limit: 10

生成的行动计划:

  • 问题: ISSUE0004521 - 财务审批中的职责分离违规
  • 风险评分: 92/100
  • 时间安排: 15 个工作日(加急)
  • 步骤:
    1. 立即撤销冲突的角色分配(第 1 天)
    2. 在过渡期间实施补偿性控制(第 1 至 3 天)
    3. 重新设计审批工作流,确保适当分离(第 3 至 10 天)
    4. 使用示例交易测试新的工作流(第 10 至 12 天)
    5. 获得内部审计签字确认(第 12 至 15 天)
  • 成功标准: 不存在冲突角色,所有测试交易均通过,并记录审计批准
示例 2:批量生成行动计划

场景: 季度风险审查后,为所有高优先级问题生成行动计划

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var gr = new GlideRecord('sn_grc_issue');
    gr.addQuery('active', true);
    gr.addQuery('priority', 'IN', '1,2');
    gr.addQuery('state', '1'); // New issues only
    gr.query();

    var planCount = 0;
    while (gr.next()) {
      var task = new GlideRecord('sn_compliance_task');
      task.initialize();
      task.short_description = 'Action Plan: ' + gr.short_description.toString();
      task.description = 'Remediation task for ' + gr.number.toString() + '. Review associated controls and implement corrective actions.';
      task.priority = gr.priority.toString();
      task.state = '1';

      var daysToAdd = (gr.priority == '1') ? 30 : 60;
      var dueDate = new GlideDateTime();
      dueDate.addDaysUTC(daysToAdd);
      task.due_date = dueDate;

      task.insert();
      planCount++;

      // Update issue state to In Progress
      gr.state = '2';
      gr.work_notes = 'Action plan generated. Compliance task created with ' + daysToAdd + '-day remediation window.';
      gr.update();
    }

    gs.info('Action plans generated for ' + planCount + ' issues');
  description: "GRC: Bulk generate action plans for high-priority issues"

相关技能

  • grc/issue-summarization - 汇总 GRC 问题,用于高管报告
  • grc/risk-assessment-summarization - 了解问题背后的风险背景
  • grc/control-objective-management - 管理与问题关联的控制措施
  • grc/regulatory-alert-analysis - 识别问题的监管驱动因素
  • security/audit-compliance - 分析 GRC 调查的审计跟踪

参考资料

评论

支持 Markdown