contract-metadata-extraction について
ServiceNow Contract Lifecycle Managementの契約から構造化メタデータを抽出・記録するスキルです。新規契約、契約ポートフォリオの監査、更新、デューデリジェンス、移行を扱う契約管理者や法務チーム向けです。
主な機能
- 01契約当事者、日付、連絡先の抽出
- 02財務条件と更新条件の記録
- 03準拠法と紛争条項の特定
- 04義務とコンプライアンス要件の整理
- 05契約メタデータ項目の入力
活用シーン
- 01契約のアップロード後にメタデータを入力
- 02ポートフォリオ内の欠落項目を監査
- 03契約日付に基づく更新ダッシュボードの準備
- 04デューデリジェンスや移行用の契約一覧作成
MCP 対応
ServiceNow MCPツールによる契約・文書の取得、義務の照会、レコード作成、契約メタデータの更新方法を説明します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ happy-technologies-llc/ happy-platform-skills --skill contract-metadata-extractionインストール後、Claude Code で/contract-metadata-extractionを入力して読み込まれたか確認します。
詳細
契約メタデータの抽出
概要
このスキルでは、ServiceNow Contract Lifecycle Management(CLM)の契約から構造化メタデータを抽出します。以下の内容を扱います。
- 契約レコードから契約当事者、署名者、主要な連絡先を特定する
- 発効日、満了日、更新期間を抽出する
- 総額、支払いスケジュール、料金の引き上げなどの金銭条件を記録する
- 通知期間の要件や解約可能期間を含む自動更新条項を解析する
- 準拠法の管轄、紛争解決、裁判地に関する規定を特定する
- 責任者、期限、コンプライアンス要件とともに義務を一覧化する
- ポートフォリオ全体のレポート作成に向けて、契約レコードのメタデータフィールドに値を設定する
次の場合に使用します:
- 新しい契約をアップロードした後、メタデータを設定する必要がある場合
- すべてのレコードで一貫したメタデータが求められる契約ポートフォリオ監査の実施時
- 更新ダッシュボードを作成する際に、日付や契約期間を正確に抽出する必要がある場合
- M&A のデューデリジェンスに向けて、契約の一覧を迅速に作成する場合
- レガシーシステムから ServiceNow に契約を移行する場合
前提条件
- ロール:
contract_manager、sn_clm.admin、sn_legal_case_manager、またはadmin - プラグイン:
com.sn_clm(Contract Lifecycle Management)、com.snc.contract_management(Contract Management) - アクセス権: ast_contract、clm_contract_doc、clm_obligation、sys_attachment テーブルへの読み取り/書き込みアクセス
- 知識: 契約の構成、法律用語、組織の契約メタデータ分類体系に関する理解
主な CLM テーブル
| テーブル | 用途 | 主なフィールド |
|---|---|---|
ast_contract | マスター契約レコード | number、short_description、vendor、contract_type、starts、ends、renewal_date、payment_amount、total_cost、auto_renew、notice_period、governing_law |
clm_contract_doc | 契約文書のバージョン | contract、document_version、status、doc_type、effective_date、content |
clm_obligation | 契約上の義務 | contract、short_description、obligation_type、responsible_party、due_date、state、compliance_status、clause_reference |
clm_clause | 契約条項ライブラリ | name、clause_type、content、category、standard、risk_level |
sys_attachment | 文書の添付ファイル | table_name、table_sys_id、file_name、content_type、size_bytes |
core_company | 当事者/ベンダーのレコード | name、vendor_type、primary_contact、city、state、country |
手順
ステップ 1:契約レコードを取得する
既存のメタデータを含む基本契約レコードを取得します。
MCP を使用(Claude Code/Desktop):
Tool: SN-Get-Record
Parameters:
table_name: ast_contract
sys_id: [contract_sys_id]
fields: sys_id,number,short_description,description,contract_type,vendor,starts,ends,renewal_date,payment_amount,total_cost,state,terms_and_conditions,auto_renew,notice_period,assigned_to,department,contract_administrator,parent_contract,governing_law,currency,payment_terms,subcontracting_allowed
REST API を使用:
GET /api/now/table/ast_contract/[contract_sys_id]?sysparm_fields=sys_id,number,short_description,description,contract_type,vendor,starts,ends,renewal_date,payment_amount,total_cost,state,terms_and_conditions,auto_renew,notice_period,assigned_to,department,contract_administrator,parent_contract,governing_law,currency,payment_terms&sysparm_display_value=true
ステップ 2:契約文書を取得する
内容分析のため、関連する契約文書と添付ファイルを取得します。
MCP を使用:
Tool: SN-Query-Table
Parameters:
table_name: clm_contract_doc
query: contract=[contract_sys_id]^ORDERBYDESCdocument_version
fields: sys_id,document_version,status,doc_type,effective_date,content,file_name
limit: 10
REST API を使用:
GET /api/now/table/clm_contract_doc?sysparm_query=contract=[contract_sys_id]^ORDERBYDESCdocument_version&sysparm_fields=sys_id,document_version,status,doc_type,effective_date,content,file_name&sysparm_limit=10
添付ファイルを取得:
Tool: SN-Query-Table
Parameters:
table_name: sys_attachment
query: table_name=ast_contract^table_sys_id=[contract_sys_id]
fields: sys_id,file_name,content_type,size_bytes,sys_created_on
limit: 20
ステップ 3:当事者情報を抽出する
すべての契約当事者、署名者、主要な連絡先を特定します。
MCP を使用:
Tool: SN-Query-Table
Parameters:
table_name: core_company
query: sys_id=[vendor_sys_id]
fields: sys_id,name,vendor_type,primary_contact,street,city,state,country,phone,website,stock_symbol,parent
limit: 1
REST API を使用:
GET /api/now/table/core_company/[vendor_sys_id]?sysparm_fields=sys_id,name,vendor_type,primary_contact,street,city,state,country,phone,website&sysparm_display_value=true
ステップ 4:義務を抽出して一覧化する
既存の義務を照会するか、契約の分析結果から作成します。
MCP を使用:
Tool: SN-Query-Table
Parameters:
table_name: clm_obligation
query: contract=[contract_sys_id]^active=true
fields: sys_id,short_description,obligation_type,responsible_party,due_date,state,compliance_status,clause_reference,frequency,penalty
limit: 50
REST API を使用:
GET /api/now/table/clm_obligation?sysparm_query=contract=[contract_sys_id]^active=true&sysparm_fields=sys_id,short_description,obligation_type,responsible_party,due_date,state,compliance_status,clause_reference,frequency&sysparm_limit=50&sysparm_display_value=true
ステップ 5:メタデータ抽出レポートを作成する
包括的なメタデータ抽出を生成する:
Tool: SN-Execute-Background-Script
Parameters:
script: |
var contractNumber = 'CON0045678'; // Replace with target contract
var gr = new GlideRecord('ast_contract');
gr.addQuery('number', contractNumber);
gr.query();
if (gr.next()) {
var metadata = {
extraction_date: new GlideDateTime().toString(),
contract_id: gr.number.toString(),
parties: {
buyer: {
name: gs.getProperty('glide.servlet.uri', 'Your Organization'),
contact: gr.contract_administrator.getDisplayValue()
},
vendor: {
name: gr.vendor.getDisplayValue(),
contact: ''
}
},
dates: {
effective_date: gr.starts.toString(),
expiration_date: gr.ends.toString(),
renewal_date: gr.renewal_date.toString(),
execution_date: gr.sys_created_on.toString()
},
financials: {
total_value: gr.total_cost.toString(),
payment_amount: gr.payment_amount.toString(),
currency: gr.currency.getDisplayValue() || 'USD',
payment_terms: gr.payment_terms.getDisplayValue() || 'Not specified'
},
renewal: {
auto_renew: gr.auto_renew.toString() == 'true',
notice_period_days: gr.notice_period.toString() || 'Not specified',
notice_deadline: ''
},
governing_law: gr.governing_law.getDisplayValue() || 'Not specified',
contract_type: gr.contract_type.getDisplayValue(),
state: gr.state.getDisplayValue(),
obligations: [],
metadata_completeness: 0
};
// Calculate notice deadline
if (metadata.renewal.auto_renew && gr.ends.toString() && gr.notice_period.toString()) {
var endDate = new GlideDateTime(gr.ends.toString());
var noticeDays = parseInt(gr.notice_period.toString()) || 0;
endDate.addDaysUTC(-noticeDays);
metadata.renewal.notice_deadline = endDate.toString();
}
// Get vendor contact
var vendor = new GlideRecord('core_company');
if (vendor.get(gr.vendor.toString())) {
metadata.parties.vendor.contact = vendor.primary_contact.getDisplayValue();
}
// Get obligations
var obl = new GlideRecord('clm_obligation');
obl.addQuery('contract', gr.sys_id.toString());
obl.addQuery('active', true);
obl.query();
while (obl.next()) {
metadata.obligations.push({
description: obl.short_description.toString(),
type: obl.obligation_type.getDisplayValue(),
responsible: obl.responsible_party.getDisplayValue(),
due_date: obl.due_date.toString(),
status: obl.compliance_status.getDisplayValue()
});
}
// Metadata completeness score
var fields = ['total_cost', 'starts', 'ends', 'vendor', 'contract_type', 'governing_law', 'notice_period', 'payment_terms'];
var filled = 0;
for (var i = 0; i < fields.length; i++) {
if (gr.getValue(fields[i])) filled++;
}
metadata.metadata_completeness = Math.round((filled / fields.length) * 100);
gs.info('CONTRACT METADATA EXTRACTION:\n' + JSON.stringify(metadata, null, 2));
}
description: "CLM: Extract comprehensive metadata from a contract record"
ステップ 6:分析結果から不足している義務を作成する
抽出中に見つかった義務レコードを作成する:
Tool: SN-Create-Record
Parameters:
table_name: clm_obligation
fields:
contract: [contract_sys_id]
short_description: "Annual SOC 2 Type II report delivery"
obligation_type: vendor_obligation
responsible_party: [vendor_sys_id]
due_date: 2026-06-30
frequency: annual
clause_reference: "Section 9.3 - Audit and Compliance"
state: active
compliance_status: pending
REST API を使用:
POST /api/now/table/clm_obligation
Content-Type: application/json
{
"contract": "[contract_sys_id]",
"short_description": "Annual SOC 2 Type II report delivery",
"obligation_type": "vendor_obligation",
"responsible_party": "[vendor_sys_id]",
"due_date": "2026-06-30",
"frequency": "annual",
"clause_reference": "Section 9.3",
"state": "active"
}
ステップ 7:抽出したメタデータで契約レコードを更新する
契約レコードの未入力フィールドに値を設定する:
Tool: SN-Update-Record
Parameters:
table_name: ast_contract
sys_id: [contract_sys_id]
data:
governing_law: "State of Delaware, United States"
payment_terms: "Net 30"
notice_period: 90
work_notes: "Metadata extraction completed. Completeness: 88%. 5 obligations cataloged. Notice deadline: 2026-09-01."
ツールの使用
| 操作 | MCP ツール | REST エンドポイント |
|---|---|---|
| 契約を読み取る | SN-Get-Record | GET /api/now/table/ast_contract/{sys_id} |
| 文書をクエリする | SN-Query-Table | GET /api/now/table/clm_contract_doc |
| 義務をクエリする | SN-Query-Table | GET /api/now/table/clm_obligation |
| 添付ファイルをクエリする | SN-Query-Table | GET /api/now/table/sys_attachment |
| 義務を作成する | SN-Create-Record | POST /api/now/table/clm_obligation |
| 契約を更新する | SN-Update-Record | PATCH /api/now/table/ast_contract/{sys_id} |
| 一括抽出 | SN-Execute-Background-Script | POST /api/now/table/sys_trigger |
ベストプラクティス
- 一貫した分類体系: 標準化された義務の種類と条項カテゴリーを使用して、ポートフォリオ全体の分析を可能にします
- 完全性のスコアリング: 各契約のメタデータ完全率を追跡します。有効な契約では90%以上を目標にします
- 更新カレンダー: 抽出した日付を基に一元化された更新カレンダーを作成し、通知期限の90日前にアラートを送信します
- 取引先の正規化: 取引先の重複登録を防ぐため、ベンダー名が
core_companyレコードに関連付けられていることを確認します - バージョン管理: 常に、契約文書のうち最新の締結済みバージョンからメタデータを抽出します
- 義務の担当者: 各義務について、責任を負う当事者(買い手またはベンダー)を明確に割り当てます
- 財務データの標準化: ポートフォリオのレポート用に、すべての金額を単一の通貨に統一します
- 監査証跡: 抽出を実行した担当者と日時を記録し、前提条件や曖昧な点を記載します
トラブルシューティング
契約文書の内容が空です
症状: clm_contract_docレコードは存在しますが、コンテンツフィールドがnullです
原因: 契約内容がコンテンツフィールドにインラインで格納されず、添付ファイルとして保存されている可能性があります
解決策: table_name=clm_contract_doc^table_sys_id=[doc_sys_id]を指定してsys_attachmentをクエリし、実際の文書ファイルを見つけます。
準拠法フィールドがありません
症状: ast_contractにgoverning_lawフィールドが存在しません
原因: このフィールドはカスタムで追加されたものか、jurisdictionやapplicable_lawなどの別の名前が使われている可能性があります
解決策:
Tool: SN-Discover-Table-Schema
Parameters:
table_name: ast_contract
要素名またはラベルに「law」、「jurisdiction」、「govern」を含むフィールドを検索します。
義務の種類が想定値と一致しません
症状: 義務の種類の選択肢に、想定されるカテゴリーが含まれていません
原因: 選択肢の値は組織ごとに異なり、デフォルトとは異なる場合があります
解決策: name=clm_obligation^element=obligation_typeを指定してsys_choiceをクエリし、利用可能な選択肢を確認します。必要に応じてカスタム選択肢を追加します。
例
例1:新規契約のメタデータ入力
シナリオ: 法務アシスタントが新しいベンダー契約をアップロードし、メタデータの抽出を必要としています
Tool: SN-Get-Record
Parameters:
table_name: ast_contract
sys_id: abc123def456
fields: sys_id,number,short_description,vendor,starts,ends,total_cost,auto_renew,notice_period,governing_law
抽出されたメタデータ:
- 当事者: Acme Corp(買い手)/CloudVault Inc.(ベンダー)
- 発効日: 2026-04-01 | 満了日: 2029-03-31
- 総額: $450,000(年間$150,000)
- 自動更新: あり、1年単位 | 通知期間: 60日
- 通知期限: 2029-01-30
- 準拠法: カリフォルニア州法
- 主な連絡先: Jane Smith(買い手)、Bob Chen(ベンダー)
- 登録済みの義務: 7件(ベンダー4件、買い手3件)
- 完全率: 94%
例2:ポートフォリオ全体のメタデータ監査
シナリオ: CLM管理者がメタデータの不足している契約を特定する必要があります
Tool: SN-Query-Table
Parameters:
table_name: ast_contract
query: active=true^governing_lawISEMPTY^ORnotice_periodISEMPTY^ORtotal_costISEMPTY
fields: number,short_description,vendor,starts,ends,governing_law,notice_period,total_cost
limit: 50
結果: メタデータが不完全な有効な契約が23件あります。優先事項:6か月以内に満了し、通知期間のデータが不足している契約が8件です。
関連スキル
legal/contract-analysis- 契約の包括的なリスク分析legal/contract-obligation-extraction- 義務の詳細な抽出と追跡legal/contracts-query-enhancer- 契約検索機能の強化legal/legal-matter-summarization- 契約に関する法務案件のコンテキストdocument/document-extraction- 添付ファイルからの文書内容の抽出