version90 DEVELOPERS

MCP server

One URL. Your contracts, agent-ready.

version90 ships a remote MCP server — nothing to install or host. Point any MCP-capable agent (Claude Code, claude.ai, Cursor, …) at the endpoint with a bearer token and it gets six tools over your organization's contracts. Stateless Streamable HTTP: every request self-contained, plain JSON responses, batch requests accepted. Tool results are returned as MCP text content containing JSON with the exact shapes documented below.

Endpoint: https://app.version90.com/api/v1/mcp
Auth: Authorization: Bearer v90_… (mint in Settings → API tokens)
Protocol: MCP 2025-06-18 · capabilities: tools

Claude Code
claude mcp add version90 https://app.version90.com/api/v1/mcp \
  --transport http \
  --header "Authorization: Bearer $V90_TOKEN"
Cursor / generic mcp.json
{
  "mcpServers": {
    "version90": {
      "url": "https://app.version90.com/api/v1/mcp",
      "headers": { "Authorization": "Bearer v90_..." }
    }
  }
}

Tool reference

search_archive #

Search executed agreements on extracted facts. All filters optional and AND-combined; query is a substring match over title, counterparty, summary and filename.

arguments
{
  "query": "renewal",              // optional free text
  "counterparty": "Meridian",      // optional, substring
  "agreement_type": "MSA",         // optional, substring
  "date_from": "2024-01-01",       // optional, effective_date >=
  "date_to": "2026-12-31",         // optional, effective_date <=
  "limit": 25                      // optional, max 100
}
returns (JSON in text content)
{
  "count": 2,
  "results": [{
    "id": "9d2f4c1a-…",
    "title": "Master Services Agreement",
    "filename": "Meridian_MSA_signed.pdf",
    "counterparty": "Meridian Robotics, Inc.",
    "agreement_type": "Master Services Agreement",
    "effective_date": "2024-09-02",     // or null
    "expiration_date": "2026-09-01",    // or null
    "governing_law": "Delaware",
    "status": "ready",                  // received | analyzing | ready | failed
    "summary": "Two-year MSA with auto-renewal…"
  }]
}
get_archived_contract #

Everything extracted from one document — the payload for answering detailed questions with citations.

arguments
{ "archive_id": "9d2f4c1a-…" }   // required
returns (JSON in text content)
{
  …all search_archive fields, plus:
  "executed_date": "2024-08-28",
  "key_terms":   [ { "field": "payment_terms", "value": "Net 60" } ],
  "key_clauses": [ { "clause_type": "limitation_of_liability",
                     "title": "Limitation of Liability",
                     "snippet": "…liable for all damages arising…" } ],
  "risks":       [ { "title": "Liability is uncapped",
                     "description": "No aggregate cap…",
                     "severity": "high" } ],
  "error": null
}
upload_to_archive #

File an executed contract (PDF or DOCX, base64-encoded). Returns immediately; extraction runs in the background — fetch with get_archived_contract after a few seconds.

arguments
{
  "filename": "signed_nda.pdf",           // required
  "content_base64": "JVBERi0xLjcK…"       // required
}
returns (JSON in text content)
{
  "id": "7c8d9e0f-…",
  "status": "received",
  "message": "Stored. Extraction runs in the background — fetch it with get_archived_contract in a few seconds."
}
list_contracts #

Active negotiations with lifecycle status and whose turn it is.

arguments
{
  "query": "Meridian",     // optional, substring on title/counterparty
  "status": "with_counterparty",  // optional lifecycle status
  "limit": 25              // optional, max 100
}
returns (JSON in text content)
{
  "count": 1,
  "results": [{
    "id": "1f7a9e42-…",
    "title": "MSA — Meridian Robotics",
    "counterparty": "Meridian Robotics, Inc.",
    "status": "with_counterparty",
    "turn": "counterparty",          // "internal" = waiting on your team
    "updated_at": "2026-07-11T09:41:37+00:00"
  }]
}
get_contract #

One negotiation in depth: the immutable version chain and open AI findings. Read-only — no editing tool exists over MCP.

arguments
{ "workspace_id": "1f7a9e42-…" }   // required
returns (JSON in text content)
{
  "id": "1f7a9e42-…",
  "title": "MSA — Meridian Robotics",
  "counterparty": "Meridian Robotics, Inc.",
  "status": "with_counterparty",
  "turn": "counterparty",
  "versions": [{
    "id": "e8d1b2c3-…",
    "filename": "MSA_Meridian_v3.docx",
    "source": "counterparty_return",   // upload | internal_edit | …
    "created_at": "2026-07-11T09:41:35+00:00"
  }],
  "open_findings": [{
    "title": "Liability is uncapped",
    "type": "nonstandard",
    "severity_note": "Your standard caps liability at 12 months of fees…"
  }]
}
get_usage_meter #

This month's plan usage — lets an agent warn before running out.

arguments
{}
returns (JSON in text content)
{
  "contracts_used": 6,   "contracts_included": 10,
  "ai_credits_used": 84, "ai_credits_included": 300,
  "archive_used": 41,    "archive_capacity": 100
}

Note what's absent: there is no editing tool. That's not a permission setting — the capability doesn't exist over MCP, so no prompt injection, agent bug, or over-eager automation can redline a contract. Humans edit; agents read, file, and answer. Tool errors come back as isError: true with a message in the text content — the request itself still returns 200.

On the wire

tools/call — raw JSON-RPC (what your MCP client does for you)
curl -X POST https://app.version90.com/api/v1/mcp \
  -H "Authorization: Bearer $V90_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0", "id": 1, "method": "tools/call",
    "params": { "name": "search_archive",
                "arguments": { "counterparty": "Meridian" } }
  }'
# → { "jsonrpc":"2.0", "id":1, "result": {
#      "content": [{ "type":"text", "text":"{\"count\":2,\"results\":[…]}" }],
#      "isError": false } }

Prompts that just work

  • "Which of our agreements auto-renew in the next 90 days, and what notice does each require?"
  • "Summarize every contract we have with Meridian Robotics, newest first."
  • "File the attached signed NDA into the archive and tell me what it says about data retention."
  • "Do any of our archived contracts have uncapped liability? List them with the clause."
  • "What's waiting on us right now across active negotiations?"