# Contract Analysis

> Analyze contracts for key terms, obligations, risks, renewal dates, and compliance requirements with metadata extraction and clause flagging

- Skill: `happy-technologies-llc/contract-analysis` (Agent Skill)
- Install (CLI): `npx skillmds@latest add happy-technologies-llc/contract-analysis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/happy-technologies-llc/contract-analysis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Happy-Technologies-LLC (https://skillmd.com/u/happy-technologies-llc)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/happy-technologies-llc/contract-analysis

---


# Contract Analysis

## Overview

This skill provides a structured approach to analyzing contracts within ServiceNow Legal Service Delivery and Contract Lifecycle Management. It helps you:

- Retrieve contract records from `ast_contract` and associated legal cases from `sn_legal_case`
- Extract and catalog key terms including payment, liability, indemnification, and termination provisions
- Identify obligations and deadlines for both parties across the contract lifecycle
- Flag high-risk clauses such as unlimited liability, automatic renewal, broad IP assignment, or non-standard terms
- Track renewal dates, expiration windows, and notice period requirements
- Assess compliance requirements including regulatory, data privacy, and industry-specific mandates
- Generate structured analysis reports for legal review and business stakeholder consumption

**When to use:** When a new contract needs legal review, during contract renewal assessments, for portfolio-wide risk audits, or when business stakeholders need a plain-language summary of contractual obligations.

**Plugin required:** `com.sn_legal_service_delivery`

## Prerequisites

- **Roles:** `sn_legal_case_user`, `sn_legal_case_manager`, `contract_manager`, or `sn_legal_admin`
- **Access:** Read access to `ast_contract`, `sn_legal_case`, `sn_legal_task`, and `sys_attachment` tables
- **Knowledge:** Understanding of contract law fundamentals, your organization's standard contract terms, and risk tolerance thresholds
- **Plugin:** Legal Service Delivery (`com.sn_legal_service_delivery`) must be activated. Optional: Contract Lifecycle Management for enhanced contract metadata.

## Procedure

### Step 1: Retrieve the Contract Record

Query the contract to obtain its core metadata and current status.

**Using MCP (Claude Code/Desktop):**
```
Tool: SN-Get-Record
Parameters:
  table_name: ast_contract
  sys_id: [contract_sys_id]
  fields: sys_id,number,short_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
```

**Using REST API:**
```bash
GET /api/now/table/ast_contract/[contract_sys_id]?sysparm_fields=sys_id,number,short_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&sysparm_display_value=true
```

### Step 2: Retrieve the Contract Document

Fetch attachments to access the actual contract text for analysis.

**Using MCP:**
```
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,sys_created_by
  limit: 20
  order_by: sys_created_on
```

**Using REST API:**
```bash
GET /api/now/table/sys_attachment?sysparm_query=table_name=ast_contract^table_sys_id=[contract_sys_id]^ORDERBYDESCsys_created_on&sysparm_fields=sys_id,file_name,content_type,size_bytes,sys_created_on,sys_created_by&sysparm_limit=20
```

To download the attachment content:
```bash
GET /api/now/attachment/[attachment_sys_id]/file
```

### Step 3: Extract Key Contract Terms

Analyze the contract for the following term categories:

| Term Category | Key Fields to Extract | Risk Indicators |
|--------------|----------------------|-----------------|
| **Payment Terms** | Amount, frequency, net days, late fees, escalation | Net 15 or shorter; annual escalation > 5% |
| **Liability** | Cap amount, exclusions, consequential damages | Unlimited liability; no mutual cap |
| **Indemnification** | Scope, carve-outs, defense obligations | Broad indemnity without IP carve-out |
| **Termination** | For cause triggers, convenience period, wind-down | No termination for convenience; > 12-month lock-in |
| **Renewal** | Auto-renew, notice period, price adjustment | Auto-renew with < 60-day notice window |
| **Confidentiality** | Duration, scope, permitted disclosures | Perpetual confidentiality; no carve-outs |
| **IP Rights** | Ownership, license grants, work product | Broad IP assignment to vendor; no license-back |
| **Data Privacy** | Data handling, breach notification, DPA | No DPA; breach notification > 72 hours |
| **SLA/Performance** | Uptime, response times, credits, remedies | No SLA credits; no termination for chronic failure |
| **Governing Law** | Jurisdiction, dispute resolution, venue | Foreign jurisdiction; mandatory arbitration |

### Step 4: Assess Risk Level

Score each term category and compute an overall contract risk level:

**Risk scoring framework:**
- **Low (1):** Term aligns with organizational standards, no deviation
- **Medium (2):** Minor deviation from standard; acceptable with documentation
- **High (3):** Significant deviation; requires senior counsel approval
- **Critical (4):** Unacceptable term; must be renegotiated before execution

**Overall risk calculation:**
- Any single Critical (4) score = Overall Critical
- Average score >= 3.0 = Overall High
- Average score >= 2.0 = Overall Medium
- Average score < 2.0 = Overall Low

### Step 5: Check for Related Legal Cases and Matters

Query for any existing legal activity related to this contract or vendor.

**Using MCP:**
```
Tool: SN-Query-Table
Parameters:
  table_name: sn_legal_case
  query: short_descriptionLIKE[vendor_name]^ORdescriptionLIKE[contract_number]
  fields: sys_id,number,short_description,state,case_type,priority,assigned_to,resolution_notes
  limit: 10
```

**Using REST API:**
```bash
GET /api/now/table/sn_legal_case?sysparm_query=short_descriptionLIKE[vendor_name]^ORdescriptionLIKE[contract_number]&sysparm_fields=sys_id,number,short_description,state,case_type,priority,assigned_to,resolution_notes&sysparm_limit=10&sysparm_display_value=true
```

### Step 6: Flag Concerning Clauses

Create legal tasks for each clause that requires attention or renegotiation.

**Using MCP:**
```
Tool: SN-Create-Record
Parameters:
  table_name: sn_legal_task
  fields:
    short_description: "Review unlimited liability clause - Section 8.2"
    description: "Contract [contract_number] contains an unlimited liability provision in Section 8.2. Organization standard requires liability cap at 12 months of fees. Recommend renegotiation to add mutual liability cap."
    legal_case: [case_sys_id]
    priority: 2
    task_type: contract_review
    assigned_to: [counsel_sys_id]
    due_date: [review_deadline]
    state: 1
```

**Using REST API:**
```bash
POST /api/now/table/sn_legal_task
Content-Type: application/json

{
  "short_description": "Review unlimited liability clause - Section 8.2",
  "description": "Contract contains unlimited liability. Standard requires cap at 12 months of fees.",
  "legal_case": "[case_sys_id]",
  "priority": "2",
  "task_type": "contract_review",
  "assigned_to": "[counsel_sys_id]",
  "due_date": "[review_deadline]",
  "state": "1"
}
```

### Step 7: Generate the Contract Analysis Report

Document the complete analysis as work notes on the legal case.

**Using MCP:**
```
Tool: SN-Add-Work-Notes
Parameters:
  table_name: sn_legal_case
  sys_id: [case_sys_id]
  work_notes: |
    === CONTRACT ANALYSIS REPORT ===
    Contract: [contract_number] - [short_description]
    Vendor: [vendor_name]
    Analyst: AI Contract Analyst
    Date: [current_date]

    CONTRACT OVERVIEW:
    - Type: [contract_type]
    - Effective: [start_date] to [end_date]
    - Total Value: $[total_cost]
    - Auto-Renewal: [Yes/No] | Notice Period: [notice_period] days
    - Governing Law: [jurisdiction]

    KEY TERMS SUMMARY:
    1. Payment: [payment_summary]
    2. Liability Cap: [liability_summary]
    3. Indemnification: [indemnity_summary]
    4. Termination: [termination_summary]
    5. Data Privacy: [privacy_summary]
    6. IP Rights: [ip_summary]
    7. SLA/Performance: [sla_summary]

    RISK ASSESSMENT:
    - Overall Risk Level: [HIGH/MEDIUM/LOW]
    - Critical Issues: [count]
    - High-Risk Items: [count]

    FLAGGED CLAUSES:
    1. [CRITICAL] Section 8.2 - Unlimited liability (standard: 12-month cap)
    2. [HIGH] Section 12.1 - Auto-renew with 30-day notice (standard: 90 days)
    3. [HIGH] Section 15.3 - No DPA attached (required for data processing)
    4. [MEDIUM] Section 6.4 - IP assignment broader than industry standard

    COMPLIANCE REQUIREMENTS:
    - GDPR: [compliant/non-compliant] - [details]
    - SOC 2: [compliant/non-compliant] - [details]
    - Industry-specific: [details]

    RECOMMENDED ACTIONS:
    1. Renegotiate liability cap to 12 months of annual fees
    2. Extend auto-renewal notice period to 90 days
    3. Execute Data Processing Agreement before contract signing
    4. Narrow IP assignment clause to deliverables only

    RENEWAL CALENDAR:
    - Contract Expires: [end_date]
    - Renewal Decision Deadline: [notice_date]
    - Days Until Notice Required: [days_remaining]
```

### Step 8: Update Contract Metadata

Record analysis results back to the contract record for portfolio tracking.

**Using MCP:**
```
Tool: SN-Update-Record
Parameters:
  table_name: ast_contract
  sys_id: [contract_sys_id]
  data:
    risk_level: high
    review_date: [current_date]
    short_description: "[original_description] [REVIEWED]"
    work_notes: "Legal analysis completed. Risk level: HIGH. 4 flagged clauses require renegotiation. See legal case [case_number] for full analysis."
```

**Using REST API:**
```bash
PATCH /api/now/table/ast_contract/[contract_sys_id]
Content-Type: application/json

{
  "risk_level": "high",
  "review_date": "[current_date]",
  "work_notes": "Legal analysis completed. Risk level: HIGH. 4 flagged clauses."
}
```

## Tool Usage

### MCP Tools Reference

| Tool | When to Use |
|------|-------------|
| `SN-Natural-Language-Search` | Find contracts by vendor name, type, or description |
| `SN-Query-Table` | Structured queries for contracts, cases, tasks, attachments |
| `SN-Get-Record` | Retrieve a single contract or case by sys_id |
| `SN-Create-Record` | Create legal tasks for flagged clauses |
| `SN-Update-Record` | Update contract risk level and review metadata |
| `SN-Add-Work-Notes` | Post the analysis report to the legal case |

### REST API Reference

| Endpoint | Method | Purpose |
|----------|--------|---------|
| `/api/now/table/ast_contract` | GET | Query contracts |
| `/api/now/table/ast_contract/{sys_id}` | GET/PATCH | Read or update a contract |
| `/api/now/table/sn_legal_case` | GET/POST | Query or create legal cases |
| `/api/now/table/sn_legal_task` | POST | Create review tasks for flagged clauses |
| `/api/now/table/sys_attachment` | GET | Retrieve contract document attachments |
| `/api/now/attachment/{sys_id}/file` | GET | Download attachment content |

## Best Practices

- **Use playbooks:** Maintain standard analysis templates for each contract type (SaaS, professional services, NDA, license) to ensure consistency
- **Compare to standards:** Always compare terms against your organization's approved contract templates and fallback positions
- **Track deviations:** Document every deviation from standard terms, even if accepted, for portfolio-wide risk visibility
- **Set renewal alerts:** Create calendar reminders at least 90 days before auto-renewal notice deadlines
- **Cross-reference vendors:** Check for other active contracts with the same vendor to identify aggregate exposure
- **Privilege protection:** Mark all analysis work notes as Attorney-Client Privileged; do not share raw analysis with non-legal staff
- **Regulatory awareness:** Always check for jurisdiction-specific requirements (GDPR for EU vendors, CCPA for California, etc.)
- **Version tracking:** Note which version of the contract was analyzed; flag if amendments or side letters exist

## Troubleshooting

### "Contract record not found in ast_contract"

**Cause:** The contract may be stored in a different table depending on your CLM configuration
**Solution:** Check `clm_contract_document`, `sn_sm_contract`, or custom contract tables. Query `sys_db_object` with `nameLIKEcontract` to find all contract-related tables.

### "Cannot access contract attachment"

**Cause:** Attachment ACLs restrict access, or the document is stored externally
**Solution:** Verify you have the `itil` or `contract_manager` role. Check if the contract references an external URL field for document storage.

### "Risk level field not available on ast_contract"

**Cause:** The field may be a custom addition or part of an optional plugin
**Solution:** Query `sys_dictionary` with `name=ast_contract^elementLIKErisk` to find available risk-related fields. Create a custom field if needed.

### "Renewal date calculation seems incorrect"

**Cause:** Auto-renewal logic may depend on custom business rules or the `notice_period` field format
**Solution:** Verify the `notice_period` field stores days (not months). Check business rules on `ast_contract` that compute renewal dates: `sys_script` with `collection=ast_contract^scriptLIKErenewal`.

## Examples

### Example 1: SaaS Vendor Agreement Review

**Input:** Contract CON0045678 - "Enterprise SaaS Platform - 3-year agreement with DataCorp"

**Analysis:**
- Total value: $1.2M over 3 years
- Auto-renew: Yes, 30-day notice (flagged: below 90-day standard)
- Liability: Capped at 12 months fees (acceptable)
- SLA: 99.9% uptime with credits (acceptable)
- Data privacy: No DPA included (critical: required for GDPR)
- Overall risk: HIGH (missing DPA)

**Action:** Create legal task to draft and execute DPA before contract signing.

### Example 2: NDA Review

**Input:** Contract CON0045679 - "Mutual NDA with AcquiCo for M&A due diligence"

**Analysis:**
- Duration: 3 years with 2-year survival after termination
- Scope: Appropriately limited to transaction evaluation
- Residual knowledge clause: Present (medium risk)
- Non-solicitation: 18-month rider attached (needs review)
- Overall risk: MEDIUM

**Action:**
```
Tool: SN-Update-Record
Parameters:
  table_name: ast_contract
  sys_id: def456abc...
  data:
    risk_level: medium
    review_date: 2026-03-19
    work_notes: "NDA reviewed. Medium risk. Residual knowledge clause and non-solicitation rider flagged for counsel review."
```

### Example 3: Contract Portfolio Risk Audit

**Input:** "Analyze all contracts expiring in the next 90 days"

**Query:**
```
Tool: SN-Query-Table
Parameters:
  table_name: ast_contract
  query: active=true^endsBETWEENjavascript:gs.beginningOfToday()@javascript:gs.daysAgoEnd(-90)
  fields: sys_id,number,short_description,vendor,ends,auto_renew,notice_period,total_cost,risk_level
  limit: 50
  order_by: ends
```

**Result:** 12 contracts expiring, 4 with auto-renew requiring notice within 30 days, 2 with no documented risk assessment. Prioritize these 6 for immediate review.

## Related Skills

- `legal/legal-request-triage` - Triage incoming contract review requests
- `legal/contract-obligation-extraction` - Extract specific obligations from contracts
- `legal/legal-matter-summarization` - Summarize legal matters linked to contracts
- `document/document-extraction` - Extract structured data from contract documents
- `document/smart-documents` - Manage contract templates and generation

