关于 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)中的合同提取结构化元数据。涵盖:
- 从合同记录中识别签约方、签署人和关键联系人
- 提取生效日期、到期日期和续约窗口
- 获取财务条款,包括总金额、付款计划和费用递增情况
- 解析自动续约条款,包括通知期限要求和选择退出窗口
- 识别管辖法律、争议解决方式和审理地点条款
- 汇总义务及其责任方、截止日期和合规要求
- 在合同记录中填充元数据字段,以便在整个合同组合范围内生成报告
适用场景:
- 上传需要填充元数据的新合同后
- 审计合同组合,确保所有记录的元数据一致
- 准备续约仪表板并需要准确提取日期和条款时
- 在需要快速盘点合同的并购尽职调查之前
- 将合同从旧系统迁移到 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 记录,但内容字段为空
原因: 合同内容可能存储为附件,而非直接存放在内容字段中
解决方案: 使用 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 份有效合同的元数据不完整。优先事项:有 8 份将在 6 个月内到期的合同缺少通知期限数据。
相关技能
legal/contract-analysis- 全面的合同风险分析legal/contract-obligation-extraction- 深度义务提取与跟踪legal/contracts-query-enhancer- 增强合同搜索能力legal/legal-matter-summarization- 合同相关法律事务的背景信息document/document-extraction- 从附件中提取文档内容