mcpField
R
risk-event-summarization

risk-event-summarization

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

关于 risk-event-summarization

用于 ServiceNow GRC 的风险事件总结技能,面向需要梳理事件影响和后续响应的利益相关者。它结合事件背景、控制缺口、成因和历史模式,形成影响评估与缓解建议。

主要功能

  1. 01汇总事件背景与时间线
  2. 02评估财务及其他影响
  3. 03分析失效或缺失的控制
  4. 04识别根本原因与促成因素
  5. 05按优先级提出缓解行动
  6. 06检测相关事件的历史模式

适用场景

  1. 01为风险委员会准备事件简报
  2. 02开展事件复盘与经验总结
  3. 03支持运营风险监管报告

MCP 相关

使用 SN-Get-Record 和 SN-Query-Table 获取事件、风险、控制及相关问题数据,并通过 SN-Execute-Background-Script 生成分析和管理层叙述。

安装

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

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

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

详细介绍

GRC 风险事件摘要

概述

此技能可生成 ServiceNow GRC 风险事件的综合摘要,为利益相关者完整呈现事件经过、发生原因、受影响范围以及应采取的应对措施。

主要功能:

  • 事件背景: 汇总风险事件详情,包括时间线、类别和触发条件
  • 影响评估: 量化风险事件对财务、运营、声誉和监管方面的影响
  • 控制分析: 确定事件发生时哪些控制措施失效、被绕过或缺失
  • 促成因素分析: 确定导致事件发生的根本原因和促成因素
  • 缓解建议: 根据事件严重程度和控制缺口生成并排序缓解措施
  • 趋势检测: 识别相关风险事件中的模式,以发现系统性问题

适用场景:

  • 风险事件发生后,利益相关者需要结构化简报时
  • 需要汇总事件的风险委员会会议期间
  • 构建风险事件登记册或损失事件数据库时
  • 报告运营风险事件以满足监管要求时
  • 开展事件后审查或经验总结会议时

前提条件

  • 角色: sn_grc.manager、sn_risk.manager 或 admin
  • 插件: com.sn_grc、com.sn_risk、com.sn_compliance
  • 访问权限: 对 sn_risk_event、sn_grc_risk、sn_compliance_control、sn_grc_issue、sn_grc_profile 具有读取权限
  • 知识: 了解组织风险分类体系和事件分类标准

主要 GRC 表

表用途主要字段
sn_risk_event风险事件/损失事件number, short_description, state, category, event_date, impact, likelihood, financial_impact, risk, profile
sn_grc_risk关联风险记录number, risk_score, residual_risk, inherent_risk, treatment, state, category
sn_compliance_control本应缓解该事件的控制措施number, state, effectiveness, test_result, control_objective, owner
sn_grc_issue从事件生成的问题number, state, priority, risk_rating, source
sn_risk_definition风险定义和类别number, short_description, risk_type, category
sn_grc_profile实体档案number, profile_type, applies_to

流程

第 1 步:检索风险事件详情

获取目标风险事件及其完整背景字段。

使用 MCP(Claude Code/Desktop):

Tool: SN-Get-Record
Parameters:
  table_name: sn_risk_event
  sys_id: [EVENT_SYS_ID]
  fields: sys_id,number,short_description,description,state,category,subcategory,event_date,discovered_date,impact,likelihood,financial_impact,operational_impact,reputational_impact,regulatory_impact,risk,profile,assigned_to,assignment_group,root_cause,contributing_factors,sys_created_on

使用 REST API:

GET /api/now/table/sn_risk_event?sysparm_query=number=[EVENT_NUMBER]&sysparm_fields=sys_id,number,short_description,description,state,category,subcategory,event_date,discovered_date,impact,likelihood,financial_impact,operational_impact,reputational_impact,regulatory_impact,risk,profile,assigned_to,root_cause,contributing_factors&sysparm_limit=1&sysparm_display_value=all
第 2 步:收集关联风险背景

提取与事件关联的风险记录,以了解更广泛的风险情况。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_grc_risk
  query: sys_id=[event_risk_sys_id]
  fields: sys_id,number,short_description,risk_score,state,treatment,residual_risk,inherent_risk,category,owner,risk_appetite,risk_tolerance
  limit: 1

获取同一档案下的所有风险:

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

使用 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,residual_risk,inherent_risk,treatment,category&sysparm_limit=25&sysparm_display_value=all
第 3 步:识别受影响的控制措施

查询与风险档案关联的控制措施,确定哪些措施本应防止该事件发生。

使用 MCP:

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

使用 REST API:

GET /api/now/table/sn_compliance_control?sysparm_query=profile=[profile_sys_id]^active=true&sysparm_fields=sys_id,number,short_description,state,control_objective,owner,effectiveness,test_result,test_date&sysparm_limit=50&sysparm_display_value=all
第 4 步:检索工作备注和调查历史

提取调查备注,以了解分析人员的发现和促成因素分析。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sys_journal_field
  query: name=sn_risk_event^element_id=[EVENT_SYS_ID]^element=work_notes^ORDERBYDESCsys_created_on
  fields: value,sys_created_on,sys_created_by
  limit: 25

使用 REST API:

GET /api/now/table/sys_journal_field?sysparm_query=name=sn_risk_event^element_id=[event_sys_id]^element=work_notes^ORDERBYDESCsys_created_on&sysparm_fields=value,sys_created_on,sys_created_by&sysparm_limit=25
第 5 步:检查相关问题和历史事件

识别由该事件引发的 GRC 问题以及类似的历史事件。

使用 MCP:

Tool: SN-Query-Table
Parameters:
  table_name: sn_grc_issue
  query: source_record=[EVENT_SYS_ID]^ORprofile=[event_profile_sys_id]
  fields: sys_id,number,short_description,state,priority,risk_rating,source,sys_created_on
  limit: 20

进行历史模式分析:

Tool: SN-Query-Table
Parameters:
  table_name: sn_risk_event
  query: category=[event_category]^sys_id!=[EVENT_SYS_ID]^event_date>=javascript:gs.daysAgo(365)^ORDERBYDESCevent_date
  fields: sys_id,number,short_description,category,event_date,financial_impact,state
  limit: 25
第 6 步:生成综合风险事件摘要

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var eventNumber = 'RE0001234'; // Replace with target event
    var gr = new GlideRecord('sn_risk_event');
    gr.addQuery('number', eventNumber);
    gr.query();

    if (!gr.next()) { gs.info('Event not found'); return; }

    var summary = {
      event: {
        number: gr.number.toString(),
        title: gr.short_description.toString(),
        description: gr.description.toString(),
        state: gr.state.getDisplayValue(),
        category: gr.category.getDisplayValue(),
        event_date: gr.event_date.getDisplayValue(),
        discovered_date: gr.discovered_date.getDisplayValue(),
        detection_lag_days: 0
      },
      impact_assessment: {
        overall_impact: gr.impact.getDisplayValue(),
        financial: gr.financial_impact.toString() || 'Not quantified',
        operational: gr.operational_impact.getDisplayValue() || 'Not assessed',
        reputational: gr.reputational_impact.getDisplayValue() || 'Not assessed',
        regulatory: gr.regulatory_impact.getDisplayValue() || 'Not assessed'
      },
      affected_controls: [],
      contributing_factors: [],
      related_issues: [],
      historical_pattern: { similar_events_12mo: 0, total_financial_loss: 0 },
      mitigation_recommendations: []
    };

    // Detection lag
    if (gr.event_date.toString() && gr.discovered_date.toString()) {
      var evtDate = new GlideDateTime(gr.event_date.toString());
      var discDate = new GlideDateTime(gr.discovered_date.toString());
      summary.event.detection_lag_days = parseInt(gs.dateDiff(evtDate.toString(), discDate.toString(), true)) || 0;
    }

    // Contributing factors from record
    if (gr.root_cause.toString()) summary.contributing_factors.push('Root Cause: ' + gr.root_cause.toString());
    if (gr.contributing_factors.toString()) summary.contributing_factors.push('Factors: ' + gr.contributing_factors.toString());

    var profileId = gr.profile.toString();

    // Affected controls
    var ctrl = new GlideRecord('sn_compliance_control');
    ctrl.addQuery('profile', profileId);
    ctrl.addQuery('active', true);
    ctrl.query();
    while (ctrl.next()) {
      var ctrlStatus = ctrl.state.getDisplayValue();
      var wasEffective = (ctrlStatus == 'Compliant' || ctrlStatus == 'Passed');
      summary.affected_controls.push({
        control: ctrl.number.toString(),
        title: ctrl.short_description.toString(),
        state: ctrlStatus,
        effectiveness: ctrl.effectiveness.getDisplayValue(),
        prevented_event: wasEffective,
        owner: ctrl.owner.getDisplayValue()
      });
      if (!wasEffective) {
        summary.contributing_factors.push('Control failure: ' + ctrl.number.toString() + ' (' + ctrlStatus + ')');
      }
    }

    // Related issues
    var issue = new GlideRecord('sn_grc_issue');
    issue.addQuery('profile', profileId);
    issue.addQuery('active', true);
    issue.query();
    while (issue.next()) {
      summary.related_issues.push({
        number: issue.number.toString(),
        title: issue.short_description.toString(),
        priority: issue.priority.getDisplayValue(),
        state: issue.state.getDisplayValue()
      });
    }

    // Historical pattern
    var hist = new GlideRecord('sn_risk_event');
    hist.addQuery('category', gr.category.toString());
    hist.addQuery('sys_id', '!=', gr.sys_id.toString());
    hist.addQuery('event_date', '>=', gs.daysAgo(365));
    hist.query();
    while (hist.next()) {
      summary.historical_pattern.similar_events_12mo++;
      summary.historical_pattern.total_financial_loss += parseFloat(hist.financial_impact.toString()) || 0;
    }

    // Generate mitigation recommendations
    var failedControls = summary.affected_controls.filter(function(c) { return !c.prevented_event; });
    if (failedControls.length > 0) {
      summary.mitigation_recommendations.push('IMMEDIATE: Remediate ' + failedControls.length + ' failed controls identified during event analysis');
    }
    if (summary.event.detection_lag_days > 7) {
      summary.mitigation_recommendations.push('SHORT-TERM: Improve detection capabilities - ' + summary.event.detection_lag_days + ' day detection lag exceeds acceptable threshold');
    }
    if (summary.historical_pattern.similar_events_12mo >= 3) {
      summary.mitigation_recommendations.push('STRATEGIC: Investigate systemic root cause - ' + summary.historical_pattern.similar_events_12mo + ' similar events in past 12 months indicates pattern');
    }
    summary.mitigation_recommendations.push('ONGOING: Update risk assessment to reflect materialized event and adjust residual risk scores');

    gs.info('RISK EVENT SUMMARY:\n' + JSON.stringify(summary, null, 2));
  description: "GRC: Generate comprehensive risk event summary with impact assessment"
第 7 步:生成高管叙述

使用 MCP:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var narrative = [];
    narrative.push('=== RISK EVENT EXECUTIVE SUMMARY ===');
    narrative.push('');

    var agg = new GlideAggregate('sn_risk_event');
    agg.addQuery('event_date', '>=', gs.daysAgo(90));
    agg.addAggregate('COUNT');
    agg.groupBy('category');
    agg.query();

    narrative.push('RISK EVENTS - LAST 90 DAYS BY CATEGORY:');
    while (agg.next()) {
      narrative.push('  ' + agg.category.getDisplayValue() + ': ' + agg.getAggregate('COUNT') + ' events');
    }
    narrative.push('');

    // Top events by financial impact
    narrative.push('TOP EVENTS BY FINANCIAL IMPACT:');
    var top = new GlideRecord('sn_risk_event');
    top.addQuery('event_date', '>=', gs.daysAgo(90));
    top.addNotNullQuery('financial_impact');
    top.orderByDesc('financial_impact');
    top.setLimit(5);
    top.query();
    var idx = 1;
    while (top.next()) {
      narrative.push('  ' + idx + '. ' + top.number + ' - ' + top.short_description);
      narrative.push('     Financial Impact: $' + top.financial_impact + ' | Category: ' + top.category.getDisplayValue());
      idx++;
    }

    gs.info(narrative.join('\n'));
  description: "GRC: Generate quarterly risk event narrative for leadership"

工具使用

操作MCP 工具REST 端点
读取事件SN-Get-RecordGET /api/now/table/sn_risk_event/{sys_id}
查询事件SN-Query-TableGET /api/now/table/sn_risk_event
查询控制措施SN-Query-TableGET /api/now/table/sn_compliance_control
查询风险SN-Query-TableGET /api/now/table/sn_grc_risk
聚合分析SN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
搜索事件SN-Natural-Language-SearchN/A

最佳实践

  • 及时性: 在发现事件后的 24 小时内生成摘要,以免遗漏新鲜细节
  • 量化影响: 始终尝试量化财务影响,即使只是带有置信区间的估算
  • 深入分析根本原因: 区分直接原因和系统性促成因素
  • 映射控制措施: 明确指出哪些控制措施本应阻止或检测到该事件
  • 历史背景: 纳入趋势数据,以区分偶发事件和系统性模式
  • 可执行的建议: 每份摘要都应以具体且可分派的缓解措施结尾
  • 监管意识: 标记可能触发监管通知要求的事件

故障排除

未找到风险事件表

症状: sn_risk_event 无结果返回,或提示未找到表 原因: 不同 ServiceNow 版本中的风险事件表名称可能不同;有些版本使用 sn_risk_event,而其他版本使用 sn_grc_loss_event 解决方案:

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

如果未找到,请在 sys_db_object 中搜索包含 "risk_event" 或 "loss_event" 的表。

财务影响字段为空

症状: 尽管已知事件存在相关成本,财务影响数据仍始终为 null 原因: 财务影响可能记录在相关损失记录中,而非事件本身 解决方案: 检查 sn_risk_loss 等相关表,或检查通过引用字段关联的自定义财务影响评估记录。

事件配置文件未关联控制措施

症状: 对事件配置文件进行控制分析时返回空结果 原因: 事件可能未关联 GRC 配置文件,或者控制措施使用了不同的关联路径 解决方案: 检查事件上的 item 字段,而不是 profile,或者查询 sn_grc_m2m_item_profile 以查看关联映射。

示例

示例 1:运营风险事件摘要

场景: 影响支付处理的系统中断事件 RE0002345

  • 事件: 支付网关意外中断,持续 4 小时
  • 检测延迟: 15 分钟(自动监控告警)
  • 财务影响: 交易收入损失 $180,000
  • 失效的控制措施: 2 项——灾难恢复测试(14 个月未测试)、容量监控阈值(设置过高)
  • 促成因素: 基础设施变更未经适当测试,支付路由存在单点故障
  • 类似事件(12 个月): 此前发生 2 起事件,损失总计 $95,000
  • 建议: 更新灾难恢复测试计划、降低容量阈值、实施冗余支付路由
示例 2:合规风险事件摘要

场景: 涉及客户 PII 泄露的数据泄露事件 RE0003001

  • 事件: 攻击者通过被盗用的服务账户未经授权访问客户数据库
  • 检测延迟: 12 天(由外部安全研究人员发现并报告)
  • 受影响记录: 15,000 条客户记录
  • 监管影响: 根据 GDPR 第 33 条,必须在 72 小时内发出通知
  • 失效的控制措施: 3 项——特权访问审查、服务账户轮换、数据库活动监控
  • 建议: 立即轮换凭据、部署数据库活动监控、建立 72 小时通知流程

相关技能

  • grc/issue-summarization - 总结由风险事件生成的 GRC 问题
  • grc/risk-assessment-summarization - 更广泛的风险评估背景
  • grc/suggest-remediation-tasks - 为与事件相关的控制差距生成整改任务
  • grc/regulatory-alert-analysis - 识别风险事件的监管影响
  • grc/control-objective-management - 管理受事件影响的控制措施

评论

支持 Markdown