Docs

How Atlas MCP works.

Connect once. Then just tell your AI what to do.

1

Get your API key

Sign in at the dashboard and copy your Atlas API key. First 5 envelopes are free.

Get API key →
2

Connect Atlas to your AI

Choose your platform:

Claude Desktop or Claude.ai

Go to Settings → Connectors → Add custom connector and paste:

https://atlaswork.ai/api/mcp

ChatGPT

Atlas is not in the ChatGPT app store yet, so you need to add it manually via Developer mode.

  1. Go to Settings → Apps → Advanced settings and enable Developer mode. The toggle is marked “ELEVATED RISK” — that’s expected.
  2. Go back to Apps, click Add more, and paste:
https://atlaswork.ai/api/mcp
  1. When asked for a name, enter Atlas. When asked for authentication type, select OAuth.
  2. Sign in with your Atlas account when the consent page appears.

No API key needed. Atlas handles auth via OAuth.

Claude Code

claude mcp add --transport http atlas \
  https://atlaswork.ai/api/mcp \
  --header "Authorization: Bearer YOUR_KEY"

Cursor

Add to ~/.cursor/mcp.json

{
  "mcpServers": {
    "atlas": {
      "url": "https://atlaswork.ai/api/mcp",
      "headers": { "Authorization": "Bearer YOUR_KEY" }
    }
  }
}
3

Just say what you want

No code. No forms. Type what you want and your AI handles it.

Send a contract

Send this NDA to sarah@acme.com. Here's the link: https://drive.google.com/...

Check status

Has everyone signed the contract I sent yesterday?

List pending

Show me all contracts still waiting to be signed.

Void

Cancel the contract I sent to john@example.com.

Send reminder

Remind alice@example.com to sign. She hasn't responded.

Sending a document

Atlas accepts documents three ways. Use whichever fits your workflow.

Share link (any AI)

Send this NDA to sarah@acme.com. Here's the link: https://drive.google.com/...

Google Drive, Dropbox, S3, OneDrive, and Box all work.

AI-drafted contract (Claude or ChatGPT)

Send the contract you just wrote to sarah@acme.com for signing.

The AI passes the text directly. Atlas converts it to a PDF.

Local file (Claude Code or Cursor)

Send the contract at /Users/me/contracts/nda.pdf to sarah@acme.com for signing.

Claude Code reads and encodes the file automatically.

File uploaded to ChatGPT

Encode and send the contract I just uploaded for signing to sarah@acme.com.

ChatGPT uses Python to encode the file and passes it to Atlas.

No share link and using claude.ai

Upload your file at atlaswork.ai/upload to get a hosted URL, then paste that URL in your prompt.

4

Atlas handles the rest

Atlas fetches the PDF or DOCX, detects where signatures go, and emails the signer. You get a review link before anything goes out. To skip the review and send immediately, use auto_send: true.

Tools reference

Your AI calls these behind the scenes.

upload_document

Stage a PDF or DOCX at a stable URL so you can pass it to send_contract. Pass a public https:// link. Atlas fetches and hosts it.

send_contract

Send a PDF or DOCX for signing. Detects fields automatically. Pass a document_url or document_text along with signer_email. Have a local file? Call upload_document first to get a URL.

get_envelope

Check the status of a signing envelope. Pass envelope_id.

list_envelopes

List your envelopes filtered by status (pending, signed, declined, voided).

void_envelope

Cancel a pending envelope. The signer can no longer sign.

remind_signer

Send a reminder email to the next unsigned signer. Accepts an optional custom message.

get_signed_document

Get a download URL for the completed signed PDF. Only available after signing is complete.

Templates

Use templates when you send the same contract shape repeatedly. The schema (PDF, field positions, variables, party roles) is locked at creation. Only the variable values change per send. Sends with template_id skip the AI detection pipeline. Sub-200ms typical.

Templates default to status: draft. Activate before sending live. Each version snapshot is immutable. Editing a template creates a new version and demotes status back to draft.

Creating a template

Source must be one of from_envelope_id, from_pdf_path, or from_template_id.

curl -X POST https://atlaswork.ai/api/templates \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Standard Lease",
    "source": { "from_envelope_id": "env_abc123" },
    "variables_schema": [
      { "key": "tenant_name",  "label": "Tenant Name",  "type": "string",   "required": true },
      { "key": "monthly_rent", "label": "Monthly Rent", "type": "currency", "required": true },
      { "key": "start_date",   "label": "Start Date",   "type": "date",     "required": true }
    ],
    "parties_schema": [
      { "role_type": "tenant",   "role_label": "Tenant",   "required": true },
      { "role_type": "landlord", "role_label": "Landlord", "required": true }
    ]
  }'

→ { "success": true, "template_id": "tmpl_...", "status": "draft", "version": 1 }

Activating a template

Activation runs structural validation. If the report fails, fix the listed issues and try again. To override a failing report, pass { force: true, force_reason: "..." }.

curl -X POST https://atlaswork.ai/api/templates/tmpl_abc123/activate \
  -H "Authorization: Bearer $API_KEY"

→ { "success": true, "status": "active", "validation_report": { "passed": true, "issues": [] } }

Sending with a template

Pass template_id, variables, and parties to the standard envelope endpoint. No detection runs. Idempotency hash does not include template_version, so retries are safe across version bumps.

curl -X POST https://atlaswork.ai/api/envelope \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "tmpl_abc123",
    "variables": { "tenant_name": "John Smith", "monthly_rent": 2400, "start_date": "2026-06-01" },
    "parties": [
      { "role_type": "tenant",   "email": "tenant@example.com",   "name": "John Smith" },
      { "role_type": "landlord", "email": "landlord@example.com", "name": "Acme Properties" }
    ],
    "auto_send": false,
    "idempotency_key": "lease-2026-q2-7741"
  }'

→ {
  "success": true,
  "envelope_id": "env_...",
  "review_url": "https://atlaswork.ai/review/env_...",
  "template_id": "tmpl_abc123",
  "template_version": 1,
  "status": "draft"
}

TypeScript:

const res = await fetch('https://atlaswork.ai/api/envelope', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.ATLAS_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    template_id: 'tmpl_abc123',
    variables: { tenant_name: 'John Smith', monthly_rent: 2400 },
    parties: [
      { role_type: 'tenant',   email: 'tenant@example.com',   name: 'John Smith' },
      { role_type: 'landlord', email: 'landlord@example.com', name: 'Acme Properties' },
    ],
    idempotency_key: 'lease-2026-q2-7741',
  }),
});
const result = await res.json();

Handling missing info

When required variables or parties are missing, the API returns HTTP 200 with a structured needs_info body. No envelope row is created. No credit is consumed. Surface the missing fields to the user, collect their answers, and retry.

{
  "status": "needs_info",
  "template_id": "tmpl_abc123",
  "template_version": 1,
  "missing_required_variables": [
    { "key": "monthly_rent", "label": "Monthly Rent", "type": "currency", "required": true }
  ],
  "missing_optional_variables": [],
  "missing_parties": [
    { "role_type": "landlord", "role_label": "Landlord", "needs_fields": ["email"] }
  ],
  "validation_errors": [],
  "next_action": "Fill the listed required variables and parties, then POST /api/envelope again."
}

With auto_send: true, any missing required variable returns HTTP 400 instead. auto_send never silently falls back to a draft.

MCP tools

Seven new MCP tools cover the full template lifecycle. See the SDK page for end-to-end agent flows.

list_templates

List your templates. Optional search, status, limit, cursor.

get_template

Fetch a full template (variables_schema, parties_schema, current_version).

send_with_template

Send an envelope from an active template. Returns needs_info if required variables or parties are missing. No envelope is created until the gate passes.

create_template_from_envelope

Turn a finished envelope into a reusable template. Returns template_id in draft status.

activate_template

Flip a template from draft to active after structural validation passes. Required before live sends.

update_template

Patch name, description, or parties_schema. Field schema and version edits use dedicated endpoints.

archive_template

Soft-archive a template. Archived templates cannot be sent or reactivated.

Key parameters for send_contract

Your AI knows these automatically. Listed for reference.

ParameterWhat it does
document_urlLink to a PDF or DOCX. Google Drive, Dropbox, S3, OneDrive, and Box all work. Atlas fetches server-side. Have a local file? Call upload_document first to get a URL.
document_textFull contract text. Atlas converts it to a PDF with field detection. Use when Claude or ChatGPT drafted the contract.
signer_emailWho signs. If omitted, Atlas returns detected fields for your review.
signer_nameSigner's full name. Pre-fills name fields automatically.
auto_sendSkip review and email the signer immediately.
prefill_mapKey-value pairs to pre-fill fields by label. Fuzzy matched.
expires_in_daysDays until the signing link expires. Default: 7.
partiesMulti-signer flows. Each party has role, email, and order.

Ready to send your first contract?

5 free envelopes. No credit card.

Get started →

Sending at volume? Book a call →