mcpField
C
contract-metadata-extraction

contract-metadata-extraction

github.com/happy-technologies-llc文档处理4141 次安装2 天前更新
代码仓库

关于 contract-metadata-extraction

该技能用于从 ServiceNow Contract Lifecycle Management 合同中提取并记录结构化元数据,适合处理新协议、合同组合审计、续约、尽调和迁移的合同经理与法律团队。

主要功能

  1. 01提取签约方、日期和联系人
  2. 02记录财务与续约条款
  3. 03识别管辖法律和争议条款
  4. 04整理义务与合规要求
  5. 05填充合同元数据字段

适用场景

  1. 01在上传合同后填充元数据
  2. 02审计合同组合中的缺失字段
  3. 03根据合同日期准备续约看板
  4. 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-RecordGET /api/now/table/ast_contract/{sys_id}
查询文档SN-Query-TableGET /api/now/table/clm_contract_doc
查询义务SN-Query-TableGET /api/now/table/clm_obligation
查询附件SN-Query-TableGET /api/now/table/sys_attachment
创建义务SN-Create-RecordPOST /api/now/table/clm_obligation
更新合同SN-Update-RecordPATCH /api/now/table/ast_contract/{sys_id}
批量提取SN-Execute-Background-ScriptPOST /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 - 从附件中提取文档内容

评论

支持 Markdown