health-safety-summarization について
ServiceNow HR Service Deliveryを使うEHSチーム向けに、職場の事故と調査、危険要因、是正措置をまとめるスキルです。OSHAの記録対象判定や、場所・部門・種類・期間別の傾向分析にも対応します。
主な機能
- 01負傷内容と事故の重大度の集約
- 02調査と関連する危険要因の紐付け
- 03OSHAの記録・報告要件の評価
- 04是正・予防措置の追跡
- 05分類別の安全傾向レポート
活用シーン
- 01月次・四半期の安全実績レポート作成
- 02重大事故の調査資料の整理
- 03OSHA監査用記録の収集
- 04安全委員会での拠点別傾向の確認
MCP 対応
ServiceNowのMCPツールで事故、調査、危険要因、是正措置を照会し、集計分析用のバックグラウンドスクリプトを実行します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill health-safety-summarizationインストール後、Claude Code で/health-safety-summarizationを入力して読み込まれたか確認します。
詳細
健康・安全インシデントの要約
概要
このスキルは、ServiceNow HR Service Delivery 内の健康・安全(H&S)インシデントの包括的な要約を生成します。以下を対象とします。
- 傷害の種類、重症度、影響を受けた身体部位など、職場のインシデントデータを集約する
- インシデントと根本原因調査、および寄与した危険要因を関連付ける
- OSHA の記録対象となるかどうか、および報告要件(Form 300、300A、301)を判定する
- 是正措置と予防措置を完了まで追跡する
- 場所、部門、インシデントの種類、期間別に安全性の傾向レポートを作成する
- EHS のリーダー向けに、安全性に関する経営層向けダッシュボードを生成する
次のような場合に使用します:
- 月次または四半期ごとの安全性パフォーマンスレポートを作成するとき
- 調査と根本原因分析が必要な職場インシデントの発生後
- 記録保存の証拠が必要な OSHA コンプライアンス監査の実施中
- 経営層が職場の安全状況を統合的に把握する必要があるとき
- インシデントの傾向データが必要な安全委員会の会議前
前提条件
- ロール:
sn_hr_hs.admin、sn_hr_hs.manager、sn_hr_core.manager、またはadmin - プラグイン:
com.sn_hr_health_safety(Health and Safety)、com.sn_hr_core(HR Core) - アクセス権: sn_hr_hs_incident、sn_hr_hs_hazard、sn_hr_hs_investigation テーブルへの読み取りアクセス
- 知識: OSHA の記録保存要件(29 CFR 1904)、インシデント分類、および組織の安全性報告手順への理解
主な H&S テーブル
| テーブル | 用途 | 主なフィールド |
|---|---|---|
sn_hr_hs_incident | 職場の安全インシデント | number, short_description, state, severity, incident_type, injury_type, body_part, location, incident_date, osha_recordable |
sn_hr_hs_hazard | 職場の危険要因 | number, short_description, hazard_type, risk_level, location, state, control_measures |
sn_hr_hs_investigation | インシデント調査 | number, incident, root_cause, contributing_factors, findings, investigator, state |
sn_hr_hs_corrective_action | 是正措置および予防措置 | number, short_description, incident, action_type, state, owner, due_date, completion_date |
cmn_location | 施設および場所のレコード | name, city, state, country, building, floor |
手順
Step 1: H&S インシデントを取得する
最近の職場インシデントを重症度順に並べ替えてクエリします。
MCP を使用する場合(Claude Code/Desktop):
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_hs_incident
query: active=true^ORDERBYDESCseverity
fields: sys_id,number,short_description,description,state,severity,incident_type,injury_type,body_part,location,incident_date,osha_recordable,days_away,restricted_duty,assigned_to,opened_by,sys_created_on
limit: 100
REST API を使用する場合:
GET /api/now/table/sn_hr_hs_incident?sysparm_query=active=true^ORDERBYDESCseverity&sysparm_fields=sys_id,number,short_description,description,state,severity,incident_type,injury_type,body_part,location,incident_date,osha_recordable,days_away,restricted_duty&sysparm_limit=100&sysparm_display_value=true
Step 2: 調査の詳細を取得する
各インシデントについて、根本原因調査を取得します。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_hs_investigation
query: incident=[incident_sys_id]
fields: sys_id,number,root_cause,contributing_factors,findings,investigator,state,methodology,completion_date
limit: 10
REST API を使用する場合:
GET /api/now/table/sn_hr_hs_investigation?sysparm_query=incident=[incident_sys_id]&sysparm_fields=sys_id,number,root_cause,contributing_factors,findings,investigator,state,methodology&sysparm_limit=10&sysparm_display_value=true
Step 3: 関連する危険要因を特定する
インシデントの場所または種類に関連する危険要因をクエリします。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_hs_hazard
query: location=[incident_location]^active=true
fields: sys_id,number,short_description,hazard_type,risk_level,location,state,control_measures,reported_date
limit: 20
REST API を使用する場合:
GET /api/now/table/sn_hr_hs_hazard?sysparm_query=location=[location_sys_id]^active=true&sysparm_fields=sys_id,number,short_description,hazard_type,risk_level,location,state,control_measures&sysparm_limit=20&sysparm_display_value=true
Step 4: 是正措置を追跡する
未解決のインシデントに対する是正措置と予防措置をクエリします。
MCP を使用する場合:
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_hs_corrective_action
query: incident=[incident_sys_id]
fields: sys_id,number,short_description,action_type,state,owner,due_date,completion_date,effectiveness_review
limit: 20
REST API を使用する場合:
GET /api/now/table/sn_hr_hs_corrective_action?sysparm_query=incident=[incident_sys_id]&sysparm_fields=sys_id,number,short_description,action_type,state,owner,due_date,completion_date&sysparm_limit=20&sysparm_display_value=true
Step 5: 安全性パフォーマンスの要約を生成する
包括的な安全性指標レポートを作成します:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var summary = {
generated_date: new GlideDateTime().toString(),
incident_metrics: { total_ytd: 0, recordable: 0, lost_time: 0, restricted_duty: 0, first_aid: 0, near_miss: 0 },
by_severity: { critical: 0, high: 0, medium: 0, low: 0 },
by_type: {},
by_location: {},
by_body_part: {},
osha_metrics: { trir: 0, dart: 0, total_hours_worked: 0 },
corrective_actions: { open: 0, overdue: 0, completed_ytd: 0 },
hazards: { open: 0, critical: 0 }
};
var now = new GlideDateTime();
var yearStart = new GlideDateTime(now.getYearUTC() + '-01-01 00:00:00');
// Incident aggregation (YTD)
var gr = new GlideRecord('sn_hr_hs_incident');
gr.addQuery('incident_date', '>=', yearStart.toString());
gr.query();
while (gr.next()) {
summary.incident_metrics.total_ytd++;
if (gr.osha_recordable.toString() == 'true') summary.incident_metrics.recordable++;
if (parseInt(gr.days_away.toString()) > 0) summary.incident_metrics.lost_time++;
if (gr.restricted_duty.toString() == 'true') summary.incident_metrics.restricted_duty++;
var sev = gr.severity.getDisplayValue() || 'Unknown';
if (sev.match(/critical/i)) summary.by_severity.critical++;
else if (sev.match(/high/i)) summary.by_severity.high++;
else if (sev.match(/medium/i)) summary.by_severity.medium++;
else summary.by_severity.low++;
var iType = gr.incident_type.getDisplayValue() || 'Other';
summary.by_type[iType] = (summary.by_type[iType] || 0) + 1;
var loc = gr.location.getDisplayValue() || 'Unknown';
summary.by_location[loc] = (summary.by_location[loc] || 0) + 1;
var bodyPart = gr.body_part.getDisplayValue() || 'Not Specified';
summary.by_body_part[bodyPart] = (summary.by_body_part[bodyPart] || 0) + 1;
}
// Open corrective actions
var ca = new GlideAggregate('sn_hr_hs_corrective_action');
ca.addQuery('active', true);
ca.addAggregate('COUNT');
ca.query();
if (ca.next()) summary.corrective_actions.open = parseInt(ca.getAggregate('COUNT'));
// Overdue corrective actions
var overdueCa = new GlideAggregate('sn_hr_hs_corrective_action');
overdueCa.addQuery('active', true);
overdueCa.addQuery('due_date', '<', now.toString());
overdueCa.addAggregate('COUNT');
overdueCa.query();
if (overdueCa.next()) summary.corrective_actions.overdue = parseInt(overdueCa.getAggregate('COUNT'));
// Open hazards
var hz = new GlideAggregate('sn_hr_hs_hazard');
hz.addQuery('active', true);
hz.addAggregate('COUNT');
hz.query();
if (hz.next()) summary.hazards.open = parseInt(hz.getAggregate('COUNT'));
gs.info('SAFETY PERFORMANCE SUMMARY:\n' + JSON.stringify(summary, null, 2));
description: "H&S: Generate YTD safety performance summary with OSHA metrics"
Step 6: OSHA の報告要件を判定する
インシデントが OSHA の記録保存基準に該当するか評価します:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var incNumber = 'HS0001234'; // Replace with target incident
var gr = new GlideRecord('sn_hr_hs_incident');
gr.addQuery('number', incNumber);
gr.query();
if (gr.next()) {
var osha = {
incident: gr.number.toString(),
title: gr.short_description.toString(),
incident_date: gr.incident_date.toString(),
recordable: false,
form_300_required: false,
form_301_required: false,
immediate_report_required: false,
reporting_deadline: '',
criteria_met: []
};
// OSHA recordability criteria (29 CFR 1904.7)
var daysAway = parseInt(gr.days_away.toString()) || 0;
var restrictedDuty = gr.restricted_duty.toString() == 'true';
var injuryType = gr.injury_type.getDisplayValue().toLowerCase();
if (daysAway > 0) { osha.criteria_met.push('Days away from work: ' + daysAway); osha.recordable = true; }
if (restrictedDuty) { osha.criteria_met.push('Restricted duty/job transfer'); osha.recordable = true; }
if (injuryType.match(/fracture|amputation|hospitalization|loss of consciousness/)) {
osha.criteria_met.push('Significant injury: ' + injuryType);
osha.recordable = true;
}
// Immediate reporting (29 CFR 1904.39): fatality within 8 hrs, amputation/eye loss/hospitalization within 24 hrs
if (injuryType.match(/fatality|death/)) {
osha.immediate_report_required = true;
osha.reporting_deadline = '8 hours from employer knowledge';
} else if (injuryType.match(/amputation|eye loss|hospitalization/)) {
osha.immediate_report_required = true;
osha.reporting_deadline = '24 hours from employer knowledge';
}
if (osha.recordable) {
osha.form_300_required = true;
osha.form_301_required = true;
}
gs.info('OSHA REPORTING ASSESSMENT:\n' + JSON.stringify(osha, null, 2));
}
description: "H&S: Evaluate OSHA recordability and reporting requirements"
ツールの使用
| 操作 | MCP ツール | REST エンドポイント |
|---|---|---|
| インシデントのクエリ | SN-Query-Table | GET /api/now/table/sn_hr_hs_incident |
| インシデントの検索 | SN-Natural-Language-Search | N/A |
| 調査のクエリ | SN-Query-Table | GET /api/now/table/sn_hr_hs_investigation |
| 危険要因のクエリ | SN-Query-Table | GET /api/now/table/sn_hr_hs_hazard |
| 是正措置のクエリ | SN-Query-Table | GET /api/now/table/sn_hr_hs_corrective_action |
| 集計分析 | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
| スキーマの検出 | SN-Discover-Table-Schema | GET /api/now/table/sys_dictionary |
ベストプラクティス
- 適時性: 根本原因を正確に調査できるよう、インシデント発生から24時間以内に概要をまとめます
- OSHAへの準拠: インシデントをクローズする前に、必ず記録対象となる基準を評価します。記録漏れには重大な罰則が科されます
- 根本原因の掘り下げ: 調査が直接的な原因だけにとどまらず、システム上の寄与要因を特定できるようにします
- 是正措置の追跡: 期限超過した是正措置に対し、明確な期限とエスカレーション手順を設定します
- 先行指標: TRIRやDARTなどの遅行指標に加え、ヒヤリハットや危険報告の件数も含めます
- 場所別分析: インシデントデータを場所別に分類し、リスクが高い施設を特定します
- プライバシー保護: 経営幹部向け概要から、負傷者を特定できる詳細情報を削除し、集計データのみを使用します
- 季節的傾向: 傾向を解釈する際は、季節的なパターン(例:夏の熱中症、冬の滑倒・転倒)を考慮します
トラブルシューティング
Incident Type フィールドが空の値を返す
症状: インシデント種別の内訳がすべて「Other」と表示されます
原因: incident_type フィールドでカスタム選択肢リストが使われているか、フィールド名が異なる可能性があります
解決策:
Tool: SN-Discover-Table-Schema
Parameters:
table_name: sn_hr_hs_incident
インシデントを分類する type、category、classification などのフィールドがないか確認します。
OSHA Recordable フラグが設定されない
症状: 記録対象の基準を満たすインシデントで、osha_recordable が false と表示されます
原因: 記録対象かどうかの判定が手動で行われるか、ビジネスルールのトリガーが必要な可能性があります
解決策: sn_hr_hs_incident のビジネスルールで、記録対象の基準が評価されていることを確認します。別の OSHA ログテーブルが存在するか確認します。
調査記録がリンクされない
症状: 既知のインシデントについて調査クエリを実行しても結果が返されません
原因: 関連フィールドに incident ではなく、parent、source、またはカスタム参照が使われている可能性があります
解決策: sys_dictionary を検索して、sn_hr_hs_investigation 上で sn_hr_hs_incident を参照するフィールドを確認します。
例
例 1:月次安全レポート
シナリオ: EHS ディレクターが安全委員会向けの月次安全概要を必要としています
Tool: SN-Query-Table
Parameters:
table_name: sn_hr_hs_incident
query: sys_created_on>=javascript:gs.daysAgoStart(30)
limit: 50
生成された概要:
- インシデント総数(3月): 12件(2月の15件から減少)
- OSHA 記録対象: 3件(TRIR:2.1、2.8から減少)
- 休業災害: 1件(倉庫での滑倒・転倒、休業5日)
- ヒヤリハット: 4件(フォークリフト接近:2件、電気関連:1件、化学物質の流出:1件)
- 最多発生場所: A棟倉庫(5件、42%)
- 最多の負傷種別: 筋違い/捻挫(4件)
- 是正措置: 未完了8件、期限超過2件
- 推奨事項: A棟倉庫で安全に関する重点的な作業停止ミーティングを実施し、期限超過している2件の是正措置を優先します
例 2:単一インシデントの詳細分析
シナリオ: 調査チームが重大な負傷事故について、インシデント一式の記録を必要としています
Tool: SN-Get-Record
Parameters:
table_name: sn_hr_hs_incident
sys_id: [incident_sys_id]
fields: sys_id,number,short_description,description,severity,incident_type,injury_type,body_part,location,incident_date,osha_recordable,days_away,restricted_duty,root_cause,work_notes
生成された詳細情報:
- インシデント: HS0001456 - 従業員が高所作業台から転落
- 日時: 2026-03-15、午前10:30、C棟、2階
- 重大度: 高 | OSHA 記録対象:はい
- 負傷: 右手首の骨折、休業15日
- 根本原因: 仮設作業台に手すりがなく、墜落防止器具が未着用
- 寄与要因: 作業前の安全点検が不十分、墜落防止訓練の期限切れ
- 是正措置: 3件を割り当て済み(手すりの設置、訓練の再実施、点検チェックリストの更新)
- OSHA への報告: Form 300 と 301 が必要。即時報告は不要(入院/切断/死亡ではない)
関連スキル
hrsd/case-summarization- 一般的な HR ケースの要約hrsd/sentiment-analysis- 安全文化に関連する従業員の感情分析grc/issue-summarization- 安全コンプライアンスに関する GRC 問題の分析security/audit-compliance- 監査およびコンプライアンスのレポート作成admin/workflow-creation- 安全インシデントのワークフローを自動化