issue-action-plan について
ServiceNow の GRC 課題に対する構造化された是正計画を作成するスキルです。GRC チームや監査対応向けに、リスク、統制、担当者を関連付け、コンプライアンスタスクと監査記録の作成を支援します。
主な機能
- 01未解決の GRC 課題を取得・分析
- 02リスクとコンプライアンス影響で優先順位付け
- 03手順、担当者、期限を含む計画の作成
- 04測定可能な完了基準の設定
- 05コンプライアンスタスクと計画記録の作成
活用シーン
- 01監査指摘への是正計画の策定
- 02コンプライアンス上の不足に対する対応
- 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_issue | GRC の問題と指摘 | 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_item | GRC コンテンツ項目 | number、short_description、item_type、profile |
sn_grc_profile | GRC エンティティプロファイル | 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-Table | GET /api/now/table/sn_grc_issue |
| 問題の検索 | SN-Natural-Language-Search | N/A |
| リスクの分析 | SN-Query-Table | GET /api/now/table/sn_grc_risk |
| タスクの作成 | SN-Create-Record | POST /api/now/table/sn_compliance_task |
| 問題の更新 | SN-Update-Record | PATCH /api/now/table/sn_grc_issue |
| 複雑な分析 | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
| スキーマの検出 | SN-Discover-Table-Schema | GET /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~3 日目)
- 適切な職務分掌を備えた承認ワークフローを再設計します(3~10 日目)
- サンプル取引で新しいワークフローをテストします(10~12 日目)
- 内部監査の承認を取得します(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 調査のために監査証跡を分析します