mcpField
T
tprm-issue-summarization

tprm-issue-summarization

github.com/happy-technologies-llcセキュリティ4141 回インストール2 日前に更新
リポジトリ

tprm-issue-summarization について

tprm-issue-summarizationは、第三者リスクチーム向けのServiceNowスキルです。TPRMの問題をベンダー別または全体で把握できるよう、問題、評価、是正、コンプライアンスの情報をまとめ、リスクレビューや報告に役立てます。

主な機能

  1. 01ベンダー・リスク区分別の問題集計
  2. 02期限超過または未完了の評価の特定
  3. 03是正状況と所要期間の要約
  4. 04問題とコンプライアンス要件の関連付け
  5. 05ベンダーリスク概要の作成

活用シーン

  1. 01ベンダーリスク委員会向け報告の準備
  2. 02ベンダー登録時のリスク確認
  3. 03ベンダーインシデント後のリスク把握
  4. 04規制当局の検査資料の作成

MCP 対応

SN-Query-Table、SN-Execute-Background-Script、SN-Natural-Language-Search、SN-Discover-Table-Schema、SN-Add-Work-NotesなどのServiceNow MCPツールで、TPRMの概要を取得・分析・記録します。

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/tprm-issue-summarizationを入力して読み込まれたか確認します。

詳細

TPRM イシューの要約

概要

このスキルは、ServiceNow のサードパーティリスク管理(TPRM)イシューの包括的な要約を生成します。以下の内容を扱います。

  • ベンダー、リスクティア、評価サイクルごとに TPRM イシューを集約する
  • セキュリティ、運用、財務、コンプライアンスの各側面からベンダーのリスクエクスポージャーを評価する
  • ベンダーの評価が最新でない、または不完全な評価ギャップを特定する
  • 未解決の指摘事項や期限超過の是正措置の修復状況を追跡する
  • ベンダーのイシューを規制要件に対応付け、コンプライアンスへの影響を測定する
  • ベンダーリスク委員会向けの、経営層に提示できるダッシュボードを作成する

次のような場合に使用します:

  • ベンダーリスク委員会の会議や取締役会への報告を準備するとき
  • 年次または定期的なサードパーティ評価レビューを行うとき
  • 新しいベンダーをオンボーディングし、リスク態勢を評価するとき
  • 迅速なエクスポージャー分析が必要となるベンダーのセキュリティインシデント発生後
  • サードパーティリスクの文書化が求められる規制当局の検査に備えるとき

前提条件

  • ロール: sn_tprm.viewer、sn_tprm.manager、sn_grc.manager、または admin
  • プラグイン: com.sn_tprm(サードパーティリスク管理)、com.sn_grc
  • アクセス権: sn_tprm_assessment、sn_tprm_issue、sn_tprm_vendor_assessment、sn_grc_profile、core_company テーブルへの読み取りアクセス
  • 知識: ベンダーリスクのティア分類方法と、組織のサードパーティリスク許容度に関する理解

主な TPRM テーブル

テーブル用途主なフィールド
sn_tprm_assessmentTPRM 評価レコードnumber, short_description, state, assessment_type, vendor, risk_tier, due_date, score
sn_tprm_issue評価中に見つかったイシューnumber, short_description, state, priority, vendor, assessment, remediation_plan, due_date
sn_tprm_vendor_assessmentベンダーレベルの評価集計vendor, assessment_status, overall_risk, last_assessment_date, next_assessment_date
core_companyベンダー/企業のマスターレコードname, sys_id, vendor_type, stock_symbol, city, state, country
sn_grc_profileベンダーに関連付けられた GRC プロファイルnumber, short_description, profile_type, applies_to
sn_grc_riskベンダープロファイルに関連付けられたリスクレコードnumber, risk_score, state, treatment, residual_risk, inherent_risk

手順

ステップ 1:未解決の TPRM イシューを取得する

すべてのアクティブな TPRM イシューをクエリし、現在のイシューの全体像を把握します。

MCP を使用する場合(Claude Code/Desktop):

Tool: SN-Query-Table
Parameters:
  table_name: sn_tprm_issue
  query: active=true^ORDERBYDESCpriority
  fields: sys_id,number,short_description,description,state,priority,vendor,assessment,remediation_plan,due_date,assigned_to,category,risk_rating,sys_created_on
  limit: 200

REST API を使用する場合:

GET /api/now/table/sn_tprm_issue?sysparm_query=active=true^ORDERBYDESCpriority&sysparm_fields=sys_id,number,short_description,description,state,priority,vendor,assessment,remediation_plan,due_date,assigned_to,category,risk_rating&sysparm_limit=200&sysparm_display_value=true
ステップ 2:ベンダー評価のコンテキストを収集する

イシューのある各ベンダーについて、評価履歴と現在のリスク態勢を取得します。

MCP を使用する場合:

Tool: SN-Query-Table
Parameters:
  table_name: sn_tprm_vendor_assessment
  query: vendor=[vendor_sys_id]
  fields: sys_id,vendor,assessment_status,overall_risk,last_assessment_date,next_assessment_date,risk_tier,assessment_score
  limit: 10

REST API を使用する場合:

GET /api/now/table/sn_tprm_vendor_assessment?sysparm_query=vendor=[vendor_sys_id]&sysparm_fields=sys_id,vendor,assessment_status,overall_risk,last_assessment_date,next_assessment_date,risk_tier,assessment_score&sysparm_limit=10&sysparm_display_value=true
ステップ 3:評価ギャップを特定する

期限超過または未実施の評価があるベンダーを見つけ、把握できていないリスク領域を明らかにします。

MCP を使用する場合:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var gaps = [];
    var va = new GlideRecord('sn_tprm_vendor_assessment');
    va.addQuery('next_assessment_date', '<', new GlideDateTime().toString());
    va.addOrCondition('assessment_status', 'incomplete');
    va.addOrCondition('assessment_status', 'not_started');
    va.query();

    while (va.next()) {
      var vendor = new GlideRecord('core_company');
      vendor.get(va.vendor);
      gaps.push({
        vendor_name: vendor.name.toString(),
        vendor_sys_id: va.vendor.toString(),
        assessment_status: va.assessment_status.getDisplayValue(),
        overall_risk: va.overall_risk.getDisplayValue(),
        risk_tier: va.risk_tier.getDisplayValue(),
        last_assessment: va.last_assessment_date.toString(),
        next_assessment: va.next_assessment_date.toString(),
        days_overdue: gs.dateDiff(va.next_assessment_date.toString(), new GlideDateTime().toString(), true)
      });
    }

    gs.info('ASSESSMENT GAPS (' + gaps.length + ' vendors):\n' + JSON.stringify(gaps, null, 2));
  description: "TPRM: Identify vendors with overdue or incomplete assessments"
ステップ 4:ベンダーのリスクエクスポージャーの要約を生成する

すべてのベンダーとリスクティアにわたる集計指標を作成します。

MCP を使用する場合:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var summary = {
      generated_date: new GlideDateTime().toString(),
      issue_overview: { total_open: 0, critical: 0, high: 0, medium: 0, low: 0, overdue: 0 },
      by_vendor: {},
      by_category: {},
      remediation_status: { with_plan: 0, without_plan: 0, plan_overdue: 0 },
      assessment_coverage: { total_vendors: 0, assessed_current: 0, assessed_overdue: 0, never_assessed: 0 },
      risk_tier_distribution: {}
    };

    var now = new GlideDateTime();

    // Issue metrics
    var gr = new GlideRecord('sn_tprm_issue');
    gr.addQuery('active', true);
    gr.query();
    while (gr.next()) {
      summary.issue_overview.total_open++;
      var pri = gr.priority.toString();
      if (pri == '1') summary.issue_overview.critical++;
      else if (pri == '2') summary.issue_overview.high++;
      else if (pri == '3') summary.issue_overview.medium++;
      else summary.issue_overview.low++;

      if (gr.due_date.toString() && new GlideDateTime(gr.due_date.toString()).compareTo(now) < 0) {
        summary.issue_overview.overdue++;
      }

      var vendorName = gr.vendor.getDisplayValue() || 'Unknown';
      summary.by_vendor[vendorName] = (summary.by_vendor[vendorName] || 0) + 1;

      var cat = gr.category.getDisplayValue() || 'Uncategorized';
      summary.by_category[cat] = (summary.by_category[cat] || 0) + 1;

      if (gr.remediation_plan.toString()) {
        summary.remediation_status.with_plan++;
        if (gr.due_date.toString() && new GlideDateTime(gr.due_date.toString()).compareTo(now) < 0) {
          summary.remediation_status.plan_overdue++;
        }
      } else {
        summary.remediation_status.without_plan++;
      }
    }

    // Assessment coverage
    var va = new GlideRecord('sn_tprm_vendor_assessment');
    va.query();
    while (va.next()) {
      summary.assessment_coverage.total_vendors++;
      var tier = va.risk_tier.getDisplayValue() || 'Untiered';
      summary.risk_tier_distribution[tier] = (summary.risk_tier_distribution[tier] || 0) + 1;

      if (!va.last_assessment_date.toString()) {
        summary.assessment_coverage.never_assessed++;
      } else if (va.next_assessment_date.toString() && new GlideDateTime(va.next_assessment_date.toString()).compareTo(now) < 0) {
        summary.assessment_coverage.assessed_overdue++;
      } else {
        summary.assessment_coverage.assessed_current++;
      }
    }

    gs.info('TPRM EXECUTIVE SUMMARY:\n' + JSON.stringify(summary, null, 2));
  description: "TPRM: Generate executive risk exposure summary"
ステップ 5:修復の有効性を分析する

ベンダーポートフォリオ全体で、イシューがどの程度効果的に修復されているかを評価します。

MCP を使用する場合:

Tool: SN-Execute-Background-Script
Parameters:
  script: |
    var remediation = {
      avg_days_to_close: 0,
      closed_on_time: 0,
      closed_late: 0,
      still_open_on_time: 0,
      still_open_overdue: 0,
      top_overdue_vendors: []
    };

    var now = new GlideDateTime();
    var closedDays = [];

    // Closed issues - resolution time
    var closed = new GlideRecord('sn_tprm_issue');
    closed.addQuery('active', false);
    closed.addQuery('closed_at', '>=', gs.daysAgo(180));
    closed.query();
    while (closed.next()) {
      var created = new GlideDateTime(closed.sys_created_on.toString());
      var closedAt = new GlideDateTime(closed.closed_at.toString());
      var days = gs.dateDiff(created.toString(), closedAt.toString(), true);
      closedDays.push(parseInt(days));

      if (closed.due_date.toString() && closedAt.compareTo(new GlideDateTime(closed.due_date.toString())) <= 0) {
        remediation.closed_on_time++;
      } else {
        remediation.closed_late++;
      }
    }

    if (closedDays.length > 0) {
      var total = 0;
      for (var i = 0; i < closedDays.length; i++) total += closedDays[i];
      remediation.avg_days_to_close = Math.round(total / closedDays.length);
    }

    // Open issues - on-time vs overdue
    var vendorOverdue = {};
    var open = new GlideRecord('sn_tprm_issue');
    open.addQuery('active', true);
    open.query();
    while (open.next()) {
      if (open.due_date.toString() && new GlideDateTime(open.due_date.toString()).compareTo(now) < 0) {
        remediation.still_open_overdue++;
        var v = open.vendor.getDisplayValue() || 'Unknown';
        vendorOverdue[v] = (vendorOverdue[v] || 0) + 1;
      } else {
        remediation.still_open_on_time++;
      }
    }

    // Sort vendors by overdue count
    var sorted = Object.keys(vendorOverdue).sort(function(a, b) { return vendorOverdue[b] - vendorOverdue[a]; });
    for (var j = 0; j < Math.min(5, sorted.length); j++) {
      remediation.top_overdue_vendors.push({ vendor: sorted[j], overdue_count: vendorOverdue[sorted[j]] });
    }

    gs.info('REMEDIATION ANALYSIS:\n' + JSON.stringify(remediation, null, 2));
  description: "TPRM: Analyze remediation effectiveness across vendor portfolio"
ステップ 6:コンプライアンスへの影響に関する説明を生成する

規制またはコンプライアンスに関わるイシューを検索します。

MCP を使用する場合:

Tool: SN-Query-Table
Parameters:
  table_name: sn_tprm_issue
  query: 123TEXTQUERY321=data privacy GDPR SOC 2 regulatory compliance security controls
  limit: 30

要約を作業メモとして投稿する:

Tool: SN-Add-Work-Notes
Parameters:
  table_name: sn_tprm_vendor_assessment
  sys_id: [vendor_assessment_sys_id]
  work_notes: |
    === TPRM ISSUE SUMMARY ===
    Vendor: [vendor_name]
    Report Date: [current_date]
    Risk Tier: [tier]

    OPEN ISSUES: [count] ([critical] critical, [high] high)
    OVERDUE ISSUES: [overdue_count]

    ASSESSMENT STATUS:
    - Last Completed: [date]
    - Next Due: [date]
    - Coverage Gaps: [gap_details]

    COMPLIANCE IMPACT:
    - Regulatory Findings: [count]
    - Affected Frameworks: [SOC 2, GDPR, HIPAA, etc.]
    - Remediation Timeline: [estimated_completion]

    RECOMMENDED ACTIONS:
    1. [action_1]
    2. [action_2]
    3. [action_3]

ツールの使用

操作MCP ツールREST エンドポイント
TPRM イシューのクエリSN-Query-TableGET /api/now/table/sn_tprm_issue
テーマ別のイシュー検索SN-Natural-Language-SearchN/A
評価のクエリSN-Query-TableGET /api/now/table/sn_tprm_assessment
ベンダー評価のクエリSN-Query-TableGET /api/now/table/sn_tprm_vendor_assessment
集計分析SN-Execute-Background-ScriptPOST /api/now/table/sys_trigger
スキーマの検出SN-Discover-Table-SchemaGET /api/now/table/sys_dictionary
要約メモの投稿SN-Add-Work-NotesPATCH /api/now/table/{table}/{sys_id}

ベストプラクティス

  • リスクの階層化: ベンダー分析は常にリスク階層(クリティカル、高、高、中、低)ごとに分類し、注意とリソースを適切に優先順位付けします
  • 評価の最新性: Tier 1 または Tier 2 のベンダーで、評価から 12 か月以上経過している場合は、早急に対処すべきギャップとして明示します
  • 是正の SLA: 問題の重大度に応じて、明確な是正期限を設定します:クリティカル(30 日)、高(60 日)、中(90 日)、低(180 日)
  • 傾向分析: ベンダーのリスク状況が改善しているか悪化しているかを示すため、四半期ごとの傾向を含めます
  • 集中リスク: 未解決の問題が不釣り合いに多いベンダーを明示します。これは、リスク管理における体系的な不備を示している可能性があります
  • 再委託先への認識: ベンダーの下請け業者または四次委託先への依存に起因する問題を記録します
  • 規制へのマッピング: 検査に備え、TPRM の問題を具体的な規制要件(OCC、FFIEC、GDPR)にマッピングします

トラブルシューティング

ベンダー評価レコードが空

症状: 既知のベンダーに対して sn_tprm_vendor_assessment が結果を返しません 原因: ベンダー評価で異なるリレーションシップモデルが使用されているか、ベンダーレコードが core_company に存在していても TPRM にリンクされていない可能性があります 解決策:

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

ベンダー参照フィールド名を確認します。構成によっては、vendor の代わりに entity または company が使用されています。

評価スコアフィールドが Null を返す

症状: 評価が完了しているにもかかわらず、評価スコアが空です 原因: スコアは評価レコードに保存されず、アンケート回答レベルで計算されている可能性があります 解決策: 評価の sys_id を使って sn_tprm_assessment をクエリし、計算済みスコアを保持する子アンケートレコードまたは asmt_metric_result エントリがないか確認します。

問題とベンダーのリンクがない

症状: クエリ結果で、問題にベンダーとの関連付けが表示されません 原因: 問題はベンダーに直接ではなく、評価レコードを介してリンクされている可能性があります 解決策: 評価参照を介して結合します。問題の assessment フィールドをクエリし、評価レコードを参照して vendor フィールドを確認します。

例

例 1:四半期ごとのベンダーリスク委員会レポート

シナリオ: リスク担当 VP が、四半期ごとの委員会会議に向けてポートフォリオ全体の TPRM サマリーを必要としています。

Tool: SN-Query-Table
Parameters:
  table_name: sn_tprm_issue
  query: active=true^priorityIN1,2^sys_updated_on>=javascript:gs.monthsAgoStart(3)
  limit: 50

生成されたサマリー:

  • 未解決の問題の合計: 34 社のベンダーに 83 件(前四半期の 91 件から減少)
  • クリティカル/高優先度: 早急な対応が必要な問題 18 件
  • 是正期限超過: 期限を過ぎた問題 12 件(期限超過率 14%)
  • 主なリスクカテゴリ: データセキュリティ(28 件、34%)
  • 評価カバレッジ: Tier 1 ベンダーの 92% は評価が最新。3 社の Tier 1 ベンダーは期限超過
  • 平均是正期間: 47 日(目標:クリティカルな問題は 30 日)
  • 推奨事項: 期限を超過したクリティカルな指摘がある Tier 1 ベンダー 3 社をエスカレーションし、年次レビューが近づいている 5 社のベンダーの再評価を開始します
例 2:インシデント発生後の特定ベンダーの詳細調査

シナリオ: クリティカルなベンダーからデータ侵害の報告があり、リスクエクスポージャーの概要を直ちに把握する必要があります。

Tool: SN-Query-Table
Parameters:
  table_name: sn_tprm_issue
  query: vendor=[vendor_sys_id]^active=true
  fields: sys_id,number,short_description,state,priority,category,due_date,remediation_plan
  limit: 50

生成された詳細:

  • ベンダー: DataCorp International(Tier 1 - クリティカル)
  • 未解決の問題: 7 件(クリティカル 2 件、高 3 件、中 2 件)
  • 既存のセキュリティ問題: アクセス制御と暗号化に関する問題 3 件
  • 最終評価: 2025-11-15(スコア:62/100 - 許容しきい値未満)
  • 是正期限超過: クリティカルな指摘 2 件が 90 日の SLA を超過
  • コンプライアンスへの影響: SOC 2 Type II の不備。GDPR 第 28 条の処理者要件を満たしていません
  • 推奨アクション: 契約上の監査権を行使し、30 日以内の是正計画を要求し、代替ベンダーを評価します

関連スキル

  • grc/issue-summarization - より広いリスクの文脈を把握するための、一般的なGRC課題の要約
  • grc/risk-assessment-summarization - ベンダーリスクスコアの背景にある詳細なリスク分析
  • grc/regulatory-alert-analysis - サードパーティ要件に影響する規制変更の監視
  • grc/control-objective-management - ベンダーリスク領域に対応付けられた統制の管理
  • security/audit-compliance - ベンダー評価の監査証跡とコンプライアンスレポート

参考資料

コメント