Die Oberfläche ist lokalisiert; Skill-Beschreibungen und -Dokumente werden per KI automatisch in Ihre Sprache übersetzt. Code, Befehle, Pfade und Fachbegriffe bleiben im Original, maßgeblich ist das Dokument des Autors.
Skills entdecken
Entwicklung · SKILL.md

contract-lifecycle-management

contract-lifecycle-management

Automate contract workflows using legal tech platforms like Clio, Ironclad, and DocuSign. Covers contract creation, review, approval, e-signature, obligation tracking, and compliance monitoring.

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill-Dokumentation

GitHub

name: contract-lifecycle-management description: "Automate contract workflows using legal tech platforms like Clio, Ironclad, and DocuSign. Covers contract creation, review, approval, e-signature, obligation tracking, and compliance monitoring." license: Apache 2.0 tags: ["clm", "legal-tech", "contracts", "clio", "ironclad", "docusign", "compliance", "e-signature"] difficulty: intermediate time_to_master: "8-14 weeks" version: "1.0.0"

Contract Lifecycle Management

Overview

Contract Lifecycle Management (CLM) encompasses the entire journey of a contract: drafting, negotiation, approval, execution, obligation tracking, and renewal. Legal tech platforms like Ironclad, Clio, DocuSign CLM, and Juro provide APIs that enable AI agents to automate contract workflows — from generating first drafts to extracting key terms to flagging expiring agreements.

When to Use This Skill

  • Building AI agents that draft, review, or summarize contracts
  • Automating contract approval workflows with routing and escalation
  • Implementing obligation tracking and renewal alerts
  • Extracting key terms (dates, amounts, clauses) from existing contracts
  • Integrating e-signature workflows into business processes

Core Concepts

Contract Lifecycle Stages

┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│  Draft   │───►│ Review & │───►│ Approval │───►│ Execute  │
│ (Create) │    │Negotiate │    │ (Route)  │    │ (Sign)   │
└──────────┘    └──────────┘    └──────────┘    └──────────┘
                                                      │
┌──────────┐    ┌──────────┐    ┌──────────┐         │
│  Renew/  │◄───│ Monitor  │◄───│  Store   │◄────────┘
│ Terminate│    │(Obligate)│    │(Archive) │
└──────────┘    └──────────┘    └──────────┘

Platform Landscape

PlatformFocusMarketAPI
IroncladEnterprise CLMMid-enterpriseREST, Workflows
DocuSign CLME-signature + CLMEnterpriseREST
ClioLegal practice mgmtLaw firmsREST
JuroContract collaborationSMB-midREST
PandaDocProposals + contractsSMBREST
Westlaw/LexisNexisLegal researchLaw firmsREST

Key Contract Data Points

FieldDescriptionExtraction Method
PartiesWho is boundNER, header parsing
Effective DateWhen contract startsDate extraction
Termination DateWhen contract expiresDate extraction
Payment TermsNet 30, Net 60Clause classification
Auto-RenewalDoes it auto-renew?Boolean clause detection
Governing LawJurisdictionClause classification
Liability CapMaximum liabilityAmount extraction
IndemnificationWho indemnifies whomClause analysis

Implementation Guide

Contract Data Extraction

class ContractExtractor:
    """Extract key terms from contract text using pattern matching and NLP."""

    PATTERNS = {
        "effective_date": r"effective\s+(?:as\s+of\s+)?(\w+\s+\d{1,2},?\s+\d{4})",
        "termination_date": r"(?:expires?|terminat\w+)\s+(?:on\s+)?(\w+\s+\d{1,2},?\s+\d{4})",
        "payment_terms": r"(net\s+\d+|due\s+within\s+\d+\s+days)",
        "auto_renewal": r"(auto(?:matically)?\s*renew|shall\s+renew\s+automatically)",
        "governing_law": r"govern(?:ed|ing)\s+(?:by\s+)?(?:the\s+)?laws?\s+of\s+(?:the\s+)?(?:State\s+of\s+)?(\w[\w\s]+)",
        "liability_cap": r"(?:aggregate|total|maximum)\s+liability[^.]*\$\s*([\d,]+(?:\.\d{2})?)",
    }

    def extract(self, contract_text):
        results = {}
        for field, pattern in self.PATTERNS.items():
            match = re.search(pattern, contract_text, re.IGNORECASE)
            results[field] = match.group(1).strip() if match else None
        return results

E-Signature Integration (DocuSign)

import docusign from "docusign-esign";

async function sendForSignature(document, signers) {
  const apiClient = new docusign.ApiClient();
  apiClient.setBasePath(process.env.DOCUSIGN_BASE_PATH);
  apiClient.addDefaultHeader("Authorization", `Bearer ${accessToken}`);

  const envelopesApi = new docusign.EnvelopesApi(apiClient);

  const envelope = {
    emailSubject: "Please sign: " + document.title,
    documents: [{
      documentBase64: document.base64Content,
      name: document.title,
      fileExtension: "pdf",
      documentId: "1",
    }],
    recipients: {
      signers: signers.map((signer, i) => ({
        email: signer.email,
        name: signer.name,
        recipientId: String(i + 1),
        routingOrder: String(signer.order || i + 1),
        tabs: {
          signHereTabs: signer.signatureLocations,
          dateSignedTabs: signer.dateLocations,
        },
      })),
    },
    status: "sent",
  };

  const result = await envelopesApi.createEnvelope(accountId, { envelopeDefinition: envelope });
  return result.envelopeId;
}

CLM MCP Server

server.tool(
  "search_contracts",
  "Search contracts by party name, type, status, or expiration date range",
  {
    query: z.string().optional(),
    status: z.enum(["draft", "in_review", "pending_signature", "active", "expired", "terminated"]).optional(),
    expiringWithinDays: z.number().optional().describe("Find contracts expiring within N days"),
    limit: z.number().default(10),
  },
  async ({ query, status, expiringWithinDays, limit }) => {
    const contracts = await clmClient.searchContracts({
      query, status, expiringWithinDays, limit,
    });

    return {
      content: [{
        type: "text",
        text: contracts.map(c =>
          `${c.title} | ${c.counterparty} | Status: ${c.status} | ` +
          `Expires: ${c.expirationDate} | Value: ${c.totalValue?.toLocaleString() || "N/A"}`
        ).join("\n"),
      }],
    };
  }
);

server.tool(
  "get_expiring_contracts",
  "Get contracts expiring soon that need renewal decisions",
  {
    days: z.number().default(90).describe("Look ahead window in days"),
  },
  async ({ days }) => {
    const expiring = await clmClient.getExpiringContracts(days);

    const byUrgency = {
      critical: expiring.filter(c => c.daysUntilExpiry <= 30),
      warning: expiring.filter(c => c.daysUntilExpiry > 30 && c.daysUntilExpiry <= 60),
      upcoming: expiring.filter(c => c.daysUntilExpiry > 60),
    };

    return {
      content: [{
        type: "text",
        text: `Contracts expiring within ${days} days:\n\n` +
          `🔴 Critical (≤30 days): ${byUrgency.critical.length}\n` +
          byUrgency.critical.map(c => `  - ${c.title} (${c.counterparty}): ${c.daysUntilExpiry} days | ${c.value}`).join("\n") +
          `\n\n🟡 Warning (31-60 days): ${byUrgency.warning.length}\n` +
          byUrgency.warning.map(c => `  - ${c.title} (${c.counterparty}): ${c.daysUntilExpiry} days`).join("\n") +
          `\n\n🟢 Upcoming (61-${days} days): ${byUrgency.upcoming.length}`,
      }],
    };
  }
);

Obligation Tracking

class ObligationTracker:
    """Track and alert on contract obligations and deadlines."""

    def extract_obligations(self, contract):
        """Parse contract for trackable obligations."""
        obligations = []
        for clause in contract.clauses:
            if clause.has_deadline or clause.has_deliverable:
                obligations.append({
                    "contract_id": contract.id,
                    "description": clause.summary,
                    "due_date": clause.deadline,
                    "responsible_party": clause.obligated_party,
                    "type": clause.obligation_type,  # payment, delivery, report, notice
                    "status": "pending",
                })
        return obligations

    def get_upcoming_obligations(self, days=30):
        """Get obligations due within N days."""
        cutoff = datetime.utcnow() + timedelta(days=days)
        return [
            ob for ob in self.obligations
            if ob["status"] == "pending" and ob["due_date"] <= cutoff
        ]

Best Practices

  1. Version every draft — maintain full revision history for audit trails
  2. Require dual approval for high-value contracts — two approvers for contracts > $100K
  3. Auto-alert 90 days before expiry — prevent unwanted auto-renewals
  4. Standardize templates — use clause libraries to maintain consistency
  5. Never store contracts without encryption — contracts contain sensitive business terms
  6. Audit access logs — track who viewed and downloaded each contract

Resources

Changelog

VersionDateChanges
1.0.02026-03-31Initial documentation
Gespeicherte Skills