approval-summarization について
ServiceNowの承認者が、判断に必要な背景情報とともに保留中の申請を要約するスキルです。申請内容、申請者プロフィール、過去の承認データを組み合わせ、コスト、リスク、コンプライアンス上の観点を整理します。
主な機能
- 01保留中の承認と申請項目の取得
- 02カタログフォームの変数値抽出
- 03申請者と組織の情報追加
- 04類似申請の承認履歴分析
- 05承認要約とリスク警告の作成
- 06承認ダイジェストの一括作成
活用シーン
- 01保留中の承認の迅速な確認
- 02定期的な承認ダイジェストの作成
- 03背景情報付き承認ダッシュボードの構築
- 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から過去の承認パターンを分析し、類似した申請を確認する- 推奨を示す情報を含む、構造化された承認サマリーを生成する
- 各承認について、コスト、リスク、コンプライアンス上の考慮事項を特定する
使用するタイミング: 承認者が保留中の承認について、すばやく包括的なサマリーを必要とするとき、承認ダイジェスト通知を作成するとき、またはコンテキストデータを含む承認ダッシュボードを作成するときです。
価値: 関連するすべてのコンテキストを1つの画面にまとめることで承認判断にかかる時間を短縮し、承認のボトルネックを軽減するとともに、過去の事例やリスク要因を提示して判断の質を高めます。
前提条件
- ロール:
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_approver | GET | 保留中の承認をクエリする |
/api/now/table/sc_request | GET | 親申請の詳細を取得する |
/api/now/table/sc_req_item | GET | 申請項目の詳細と変数を取得する |
/api/now/table/sc_cat_item | GET | カタログ項目の定義を確認する |
/api/now/table/sc_item_option_mtom | GET | 申請から変数の値を抽出する |
/api/now/table/sys_user | GET | 申請者のプロフィール情報を取得する |
ベストプラクティス
- ビジネス上の正当性を目立つ位置に記載する: 正当性を示す変数は承認者にとって最も重要なフィールドです。必ず最初に表示してください
- 合計コストを明確に示す: 商品価格、数量、継続的に発生するコスト、および変動価格を含めてください
- 過去の状況を提示する: 承認率と過去の前例に関するデータは、意思決定の不確実性を大幅に軽減します
- 異常を警告する: 申請が通常と異なる場合(初めての品目、通常のコストを超過、VIP の申請者)は強調してください
- 待ち時間を計算する: 承認が保留されている期間を示し、緊急性を認識できるようにしてください
- 優先度ごとにグループ化する: 承認ダイジェストは作成日ではなく、経過時間、コスト、ビジネス上の重要度で並べ替えてください
- データアクセスを尊重する: 承認者が閲覧権限を持つ情報のみを含めてください
- ダイジェストを自動化する: 承認件数が多いマネージャー向けに、毎日または 1 日 2 回の承認ダイジェスト生成をスケジュールしてください
トラブルシューティング
変数値が見つからない
原因: sc_item_option_mtom の結合で、想定される変数値が取得できていません
解決策: sc_item_option を直接使用する品目もあります。代わりに request_item=[ritm_sys_id] を指定して sc_item_option をクエリしてみてください。古い申請では、変数の保存方法が異なる場合があります。
承認レコードに誤った申請が表示される
原因: 承認レコードの sysapproval フィールドは、要求品目(RITM)ではなく要求(REQ)を参照している場合があります
解決策: 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- 承認ワークフローのロジックを構築する