task-analysis について
ServiceNow のタスクデータを分析するスキルです。チームの作業負荷、SLA リスク、運用上のボトルネックを把握したい管理者向けに、タスクの推移や個人別負荷を分析し、再配分案を示します。
主な機能
- 01タスク件数と状態の推移分析
- 02割り当てグループのボトルネック特定
- 03SLA 違反リスクの検出
- 04個人別作業負荷の分析
- 05作業負荷の再配分案
活用シーン
- 01週次運用レビュー用データの準備
- 02SLA 違反が迫るタスクの特定
- 03チームの現在の作業状況の把握
MCP 対応
ServiceNow MCP ツールでタスク、SLA、割り当て情報を検索し、集計や傾向計算を実行して、分析レポートと提案をレコードに記録します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill task-analysisインストール後、Claude Code で/task-analysisを入力して読み込まれたか確認します。
詳細
タスク分析
概要
このスキルでは、ServiceNow 全体のタスクデータを包括的に分析し、運用パターンを特定して作業配分を最適化します。次の内容を扱います。
task、sc_task、planned_taskテーブル全体のタスク量の傾向を分析する- ボトルネックとなっている割り当てグループや、過剰な作業負荷を抱える個人を特定する
task_slaレコードと現在のタスク経過時間を分析して、SLA 違反を予測する- キャパシティとスキルの適合度に基づき、作業負荷の再配分を提案する
- 主要業績評価指標を含むタスク健全性ダッシュボードを生成する
- タスクの再割り当て、エスカレーション、解決時間のパターンを検出する
使用する場面: マネージャーがチームの作業負荷の分布を把握する必要がある場合、SLA 遵守率が低下傾向にある場合、今後のプロジェクトに向けてキャパシティを計画する場合、またはタスク処理における全体的なボトルネックを特定する場合です。
価値提案: タスクを事前に分析することで、SLA 違反を防ぎ、チーム間の作業負荷のバランスを整え、人員配置やプロセス改善の判断にデータに基づく情報を提供します。
前提条件
- ロール:
itil、task_admin、assignment_group_manager、またはadmin - アクセス権:
task、sc_task、planned_task、task_sla、sys_user_group、sys_userテーブルへの読み取りアクセス - 知識: タスクのライフサイクル状態、SLA の定義、組織内の割り当てグループ構成についての理解
手順
ステップ 1:現在のタスク量と状態の分布を評価する
すべてのタスク種別にわたるアクティブなタスクのスナップショットを取得します。
MCP を使用する場合(Claude Code/Desktop):
Tool: SN-Execute-Background-Script
Parameters:
description: Task volume snapshot by type and state
script: |
var snapshot = { timestamp: new GlideDateTime().getDisplayValue(), task_types: [] };
var tables = ['incident', 'sc_task', 'change_request', 'problem', 'sc_req_item'];
tables.forEach(function(tableName) {
var typeData = { table: tableName, states: {} };
var ga = new GlideAggregate(tableName);
ga.addQuery('active', true);
ga.addAggregate('COUNT');
ga.groupBy('state');
ga.query();
var total = 0;
while (ga.next()) {
var state = ga.state.getDisplayValue();
var count = parseInt(ga.getAggregate('COUNT'));
typeData.states[state] = count;
total += count;
}
typeData.total_active = total;
snapshot.task_types.push(typeData);
});
gs.info(JSON.stringify(snapshot, null, 2));
REST API を使用する場合(特定のタスク種別):
GET /api/now/table/sc_task?sysparm_query=active=true&sysparm_fields=sys_id,number,state,assignment_group,assigned_to,priority,opened_at,sla_due&sysparm_limit=100&sysparm_display_value=true
ステップ 2:割り当てグループのボトルネックを特定する
タスク量や経過時間の長いタスクが不釣り合いに多いグループを見つけます。
MCP を使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Identify bottleneck assignment groups
script: |
var bottlenecks = [];
var ga = new GlideAggregate('task');
ga.addQuery('active', true);
ga.addQuery('assignment_group', 'ISNOTEMPTY', '');
ga.addAggregate('COUNT');
ga.addAggregate('AVG', 'reassignment_count');
ga.groupBy('assignment_group');
ga.orderByAggregate('COUNT', 'DESC');
ga.query();
while (ga.next()) {
var groupId = ga.assignment_group.toString();
var count = parseInt(ga.getAggregate('COUNT'));
// Get average age of active tasks
var ageGa = new GlideAggregate('task');
ageGa.addQuery('active', true);
ageGa.addQuery('assignment_group', groupId);
ageGa.addAggregate('AVG', 'sys_mod_count');
ageGa.query();
var avgAge = 0;
if (ageGa.next()) {
avgAge = parseInt(ageGa.getAggregate('AVG', 'sys_mod_count'));
}
// Get group member count
var members = new GlideAggregate('sys_user_grmember');
members.addQuery('group', groupId);
members.addQuery('user.active', true);
members.addAggregate('COUNT');
members.query();
var memberCount = 0;
if (members.next()) memberCount = parseInt(members.getAggregate('COUNT'));
bottlenecks.push({
group: ga.assignment_group.getDisplayValue(),
active_tasks: count,
active_members: memberCount,
tasks_per_person: memberCount > 0 ? (count / memberCount).toFixed(1) : 'N/A',
avg_reassignments: parseFloat(ga.getAggregate('AVG', 'reassignment_count')).toFixed(1)
});
}
// Sort by tasks per person descending
bottlenecks.sort(function(a, b) {
return parseFloat(b.tasks_per_person) - parseFloat(a.tasks_per_person);
});
gs.info(JSON.stringify(bottlenecks.slice(0, 20), null, 2));
ステップ 3:SLA 違反を予測する
タスクの SLA レコードを分析し、違反のリスクがあるタスクを特定します。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: task_sla
query: stage=in_progress^has_breached=false^planned_end_time<=javascript:gs.hoursAgoEnd(-24)
fields: sys_id,task,task.number,task.short_description,task.assignment_group,task.assigned_to,task.priority,sla,planned_end_time,percentage,business_percentage,stage
limit: 50
order_by: planned_end_time
REST API を使用する場合:
GET /api/now/table/task_sla?sysparm_query=stage=in_progress^has_breached=false^planned_end_time<=javascript:gs.hoursAgoEnd(-24)&sysparm_fields=sys_id,task,task.number,task.short_description,task.assignment_group,task.assigned_to,task.priority,sla,planned_end_time,percentage,business_percentage&sysparm_limit=50&sysparm_display_value=true
グループ別に違反リスクを分析する:
Tool: SN-Execute-Background-Script
Parameters:
description: SLA breach risk analysis by assignment group
script: |
var riskAnalysis = [];
var ga = new GlideAggregate('task_sla');
ga.addQuery('stage', 'in_progress');
ga.addQuery('has_breached', false);
ga.addQuery('business_percentage', '>=', 75);
ga.addAggregate('COUNT');
ga.groupBy('task.assignment_group');
ga.orderByAggregate('COUNT', 'DESC');
ga.query();
while (ga.next()) {
var group = ga.getValue('task.assignment_group');
var atRisk = parseInt(ga.getAggregate('COUNT'));
// Count already breached
var breached = new GlideAggregate('task_sla');
breached.addQuery('stage', 'in_progress');
breached.addQuery('has_breached', true);
breached.addQuery('task.assignment_group', group);
breached.addAggregate('COUNT');
breached.query();
var breachedCount = 0;
if (breached.next()) breachedCount = parseInt(breached.getAggregate('COUNT'));
riskAnalysis.push({
group: ga.getDisplayValue('task.assignment_group'),
at_risk_75_plus: atRisk,
already_breached: breachedCount,
total_exposure: atRisk + breachedCount
});
}
gs.info(JSON.stringify(riskAnalysis, null, 2));
ステップ 4:個人ごとの作業負荷の分布を分析する
割り当てグループ内のチームメンバーごとの作業負荷を調べます。
MCP を使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Individual workload analysis for assignment group
script: |
var groupId = '[group_sys_id]';
var workload = [];
var ga = new GlideAggregate('task');
ga.addQuery('active', true);
ga.addQuery('assignment_group', groupId);
ga.addQuery('assigned_to', 'ISNOTEMPTY', '');
ga.addAggregate('COUNT');
ga.groupBy('assigned_to');
ga.orderByAggregate('COUNT', 'DESC');
ga.query();
while (ga.next()) {
var userId = ga.assigned_to.toString();
// Get priority breakdown
var priorities = {};
var pa = new GlideAggregate('task');
pa.addQuery('active', true);
pa.addQuery('assigned_to', userId);
pa.addAggregate('COUNT');
pa.groupBy('priority');
pa.query();
while (pa.next()) {
priorities['P' + pa.priority.toString()] = parseInt(pa.getAggregate('COUNT'));
}
// Count tasks with SLA at risk
var slaRisk = new GlideAggregate('task_sla');
slaRisk.addQuery('task.assigned_to', userId);
slaRisk.addQuery('stage', 'in_progress');
slaRisk.addQuery('business_percentage', '>=', 75);
slaRisk.addAggregate('COUNT');
slaRisk.query();
var riskCount = 0;
if (slaRisk.next()) riskCount = parseInt(slaRisk.getAggregate('COUNT'));
workload.push({
user: ga.assigned_to.getDisplayValue(),
active_tasks: parseInt(ga.getAggregate('COUNT')),
priorities: priorities,
sla_at_risk: riskCount
});
}
// Unassigned tasks
var unassigned = new GlideAggregate('task');
unassigned.addQuery('active', true);
unassigned.addQuery('assignment_group', groupId);
unassigned.addQuery('assigned_to', 'ISEMPTY', '');
unassigned.addAggregate('COUNT');
unassigned.query();
var unassignedCount = 0;
if (unassigned.next()) unassignedCount = parseInt(unassigned.getAggregate('COUNT'));
var result = {
group: '[group_name]',
members: workload,
unassigned_tasks: unassignedCount
};
gs.info(JSON.stringify(result, null, 2));
ステップ 5:タスクの経時的な傾向を分析する
タスクの作成、完了、バックログ増加の傾向を追跡します。
MCP を使用する場合:
Tool: SN-Execute-Background-Script
Parameters:
description: Weekly task trend analysis
script: |
var trends = [];
for (var i = 7; i >= 0; i--) {
var weekStart = gs.daysAgoStart(i * 7);
var weekEnd = gs.daysAgoEnd((i - 1) * 7);
var week = { period: 'Week -' + i, created: 0, closed: 0, backlog: 0 };
// Created
var created = new GlideAggregate('task');
created.addQuery('opened_at', '>=', weekStart);
created.addQuery('opened_at', '<=', weekEnd);
created.addAggregate('COUNT');
created.query();
if (created.next()) week.created = parseInt(created.getAggregate('COUNT'));
// Closed
var closed = new GlideAggregate('task');
closed.addQuery('closed_at', '>=', weekStart);
closed.addQuery('closed_at', '<=', weekEnd);
closed.addAggregate('COUNT');
closed.query();
if (closed.next()) week.closed = parseInt(closed.getAggregate('COUNT'));
week.net_change = week.created - week.closed;
trends.push(week);
}
// Current backlog
var backlog = new GlideAggregate('task');
backlog.addQuery('active', true);
backlog.addAggregate('COUNT');
backlog.query();
var currentBacklog = 0;
if (backlog.next()) currentBacklog = parseInt(backlog.getAggregate('COUNT'));
var result = {
current_backlog: currentBacklog,
weekly_trends: trends
};
gs.info(JSON.stringify(result, null, 2));
ステップ 6:作業負荷の再配分に関する推奨事項を作成する
分析結果に基づいて、実行可能な推奨事項を提示します。
MCP を使用する場合:
Tool: SN-Add-Work-Notes
Parameters:
table_name: sys_user_group
sys_id: [group_sys_id]
work_notes: |
=== TASK ANALYSIS & WORKLOAD REPORT ===
Group: Service Desk Team A
Date: 2026-03-19
CURRENT STATE:
- Active tasks: 87
- Unassigned: 12
- Members: 8 active
- Average per person: 10.9 tasks
WORKLOAD DISTRIBUTION:
- Alice Johnson: 18 tasks (5 P1/P2) - OVERLOADED
- Bob Smith: 15 tasks (3 P1/P2)
- Carol Davis: 12 tasks (2 P1/P2)
- Dan Wilson: 11 tasks (1 P1/P2)
- Eve Martinez: 10 tasks (2 P1/P2)
- Frank Lee: 8 tasks (0 P1/P2)
- Grace Chen: 7 tasks (1 P1/P2)
- Henry Patel: 6 tasks (0 P1/P2) - CAPACITY AVAILABLE
SLA RISK:
- 14 tasks at 75%+ SLA consumption (breach within 24 hours)
- 3 tasks already breached
- Highest risk: Alice Johnson (5 tasks at risk)
TRENDS (8 weeks):
- Creation rate: 45/week average (trending up +8%)
- Closure rate: 41/week average (stable)
- Backlog growing at ~4 tasks/week
RECOMMENDATIONS:
1. IMMEDIATE: Redistribute 5 tasks from Alice to Henry/Grace (capacity available)
2. IMMEDIATE: Assign 12 unassigned tasks prioritizing SLA-at-risk items
3. SHORT-TERM: Backlog growing - request 1 additional team member or cross-train
4. PROCESS: Investigate high reassignment rate (avg 2.3 per task) - routing rules may need tuning
ツールの使用方法
MCP ツールのリファレンス
| ツール | 使用する場面 |
|---|---|
SN-Query-Table | タスク、SLA、グループ、割り当てを照会する |
SN-Get-Record | 個々のタスクやグループの詳細を取得する |
SN-Natural-Language-Search | 自然言語による説明に一致するタスクを検索する |
SN-Execute-Background-Script | 複雑な集計、傾向分析、作業負荷の計算を行う |
SN-Add-Work-Notes | 分析レポートや推奨事項を投稿する |
REST API のリファレンス
| エンドポイント | メソッド | 目的 |
|---|---|---|
/api/now/table/task | GET | すべての種別のタスクを照会する |
/api/now/table/sc_task | GET | カタログタスクを個別に照会する |
/api/now/table/planned_task | GET | 計画済みタスク/プロジェクトタスクを照会する |
/api/now/table/task_sla | GET | SLA のステータスと違反リスクを分析する |
/api/now/table/sys_user_group | GET | 割り当てグループの詳細を取得する |
/api/now/stats/task | GET | Stats API を使用してサーバー側で集計する |
ベストプラクティス
- 適切なレベルで分析する: タイプ固有の分析には専用のタスクテーブル(
incident、sc_task)を使用し、タイプをまたいだビューにはtaskを使用します - チームの規模に合わせて標準化する: 真のボトルネックを特定するため、合計件数と併せて必ず担当者あたりのタスク数を表示します
- 営業時間を考慮する: SLA の分析には、暦上の経過時間ではなく
task_slaのbusiness_percentageを使用します - 再割り当てのパターンを確認する: 再割り当て回数が多い場合、振り分けやスキルの不一致が問題となっている可能性があります
- 未割り当てのタスクを別途追跡する: 未割り当てのタスクは見えにくいボトルネックになるため、必ず明らかにします
- しきい値アラートを設定する: 自動アラートのために、明確なしきい値(例:担当者あたり15件超、SLA 消費率80%超)を定義します
- キャパシティの状況を含める: 作業負荷を分析する際は、休暇、研修日、パートタイム勤務のスケジュールを考慮します
- 具体的なアクションにつなげる: すべての分析から、少なくとも1つの具体的で実行可能な推奨事項を導き出します
トラブルシューティング
タスク件数がダッシュボードと一致しない
原因: ダッシュボードで異なるフィルターが使用されている可能性があります(例:特定の状態やタスクタイプを除外している) 解決策: ダッシュボードウィジェットで使用されている正確なクエリと、分析クエリを比較します。ユーザーごとに異なる形で結果を絞り込むアクセス制御がないか確認します。
SLA データに予期しない値が表示される
原因: SLA 定義が変更されたか、遡及的な SLA の関連付けが計算に影響している可能性があります
解決策: task_sla.slaの参照先を確認し、正しい SLA 定義が関連付けられていることを検証します。正確なステータスを把握するため、has_breachedとstageを確認します。
割り当てグループのメンバー数が正しくない
原因: 非アクティブなユーザーが引き続きグループメンバーになっているか、ユーザーが複数のグループに所属している可能性があります
解決策: sys_user_grmemberをuser.active=trueでフィルタリングし、重複した所属がないか確認します。
トレンドデータに抜けがある
原因: 特定の期間にタスクが作成またはクローズされなかったか、データのアーカイブによって過去のレコードが削除された可能性があります 解決策: トレンドの出力に件数ゼロの期間も含めます。タスクテーブルにテーブルローテーションまたはアーカイブが設定されているか確認します。
例
例 1:週次運用レビュー用データ
入力: 「週次運用レビュー会議用のタスク分析データを準備してください」
プロセス: ステップ1、2、5、6を実行し、件数、ボトルネック、トレンド、推奨事項を含む包括的なスナップショットを生成します。
例 2:SLA 違反の防止
入力: 「今後24時間以内に SLA 違反となりそうなタスクはどれですか?」
Tool: SN-Query-Table
Parameters:
table_name: task_sla
query: stage=in_progress^has_breached=false^planned_end_time<=javascript:gs.hoursAgoEnd(-24)^planned_end_time>=javascript:gs.beginningOfToday()
fields: task.number,task.short_description,task.assigned_to,task.assignment_group,planned_end_time,business_percentage
limit: 30
order_by: planned_end_time
例 3:新任マネージャーのオンボーディング
入力: 「Team B を引き継いだばかりです。チームの現在の作業状況を見せてください」
プロセス: 特定のグループに絞り込んでステップ2、4、5を実行し、担当者別の内訳、SLA リスク、8週間のトレンドを含む包括的な作業負荷プロファイルを生成します。
関連スキル
reporting/sla-analysis- 詳細な SLA パフォーマンス分析reporting/trend-analysis- 一般的なトレンド分析機能reporting/executive-dashboard- 経営層向けレポートitsm/incident-lifecycle- インシデント固有のタスク管理catalog/request-fulfillment- カタログタスクの履行ワークフローadmin/workflow-creation- タスクの振り分けとエスカレーションの自動化