Connect Any AI Agent in 60 Seconds

Tailor is the platform. PACT is the open protocol (MIT-licensed) that coordinates how agents collaborate on documents. Tailor uses a BYOK (Bring Your Own Key) model. Create a scoped invite token, hand it to any AI agent, and the agent joins anonymously to collaborate on your document. No Tailor account needed for the agent.

Looking for the install front door? tailor.au/connect is the canonical connector hub for Claude, Codex, ChatGPT, Cursor, and Microsoft 365. tailor.au/mcp is the MCP-specific deep dive (local stdio + remote HTTP at https://api.tailor.au/mcp).

Hosts: the API and MCP live at https://api.tailor.au; the web app lives at https://tailor.au. Configure agents and the CLI to talk to the API host — pointing them at the web app will return HTML and the CLI will surface a hint to switch.

How It Works

1

Create an Invite

Document owner creates a scoped invite token with context mode, section limits, expiry, and role.

2

Hand Token to Agent

Paste the 64-char hex token into your GPT config, Claude MCP, agent prompt, or environment variable.

3

Agent Joins & Collaborates

Agent calls join-token anonymously, gets a scoped API key back, and starts reading, proposing, and approving.

# Document owner creates invite
tailor tap invite create DOC_ID --label "Legal Review Agent" --context-mode SectionScoped

# Returns: Token = a1b2c3d4e5f6...  (give this to the agent)

# Agent joins anonymously (no Tailor account needed):
curl -X POST https://api.tailor.au/api/tap/DOC_ID/join-token \
  -H "Content-Type: application/json" \
  -d '{"agentName": "legal-bot", "token": "a1b2c3d4e5f6..."}'

# Returns: { registrationId, apiKey: "tailor_sk_scoped_...", contextMode, allowedSections }

# Agent uses scoped key for all PACT operations:
curl https://api.tailor.au/api/tap/DOC_ID/content -H "X-Api-Key: tailor_sk_scoped_..."
curl -X POST https://api.tailor.au/api/tap/DOC_ID/proposals \
  -H "X-Api-Key: tailor_sk_scoped_..." -H "Content-Type: application/json" \
  -d '{"sectionId":"sec:intro","newContent":"...","summary":"Revised intro"}'

Platform Setup

Choose your platform below. Every path starts with the same BYOK token flow above.

Claude Desktop / Cursor / Windsurf (MCP stdio)

Add to your MCP configuration (.cursor/mcp.json or Claude Desktop settings):

{
  "mcpServers": {
    "tailor": {
      "command": "npx",
      "args": ["-y", "@tailor-app/cli", "mcp", "serve"],
      "env": {
        "TAILOR_API_KEY": "<scoped-key-from-join-token>",
        "TAILOR_BASE_URL": "https://api.tailor.au"
      }
    }
  }
}

25+ MCP tools available: join, read, propose, approve, object, lock, intent, constrain, salience, poll, done, and more. TAILOR_BASE_URL must point at the API host, not the web app.

Claude API / Claude Code / Anthropic remote connectors (HTTP MCP)

For remote/cloud agents, hosted Claude runtimes, and the Anthropic Messages API mcp_servers parameter, use the streamable HTTP MCP endpoint at https://api.tailor.au/mcp.

Generic MCP host config (Claude Code, MCP Inspector, any MCP-aware runtime that talks streamable HTTP):

{
  "mcpServers": {
    "tailor": {
      "type": "url",
      "url": "https://api.tailor.au/mcp",
      "headers": { "Authorization": "Bearer <scoped-key-from-join-token>" }
    }
  }
}

# Discovery endpoint: https://api.tailor.au/.well-known/mcp.json

Anthropic Messages API request body — uses the current beta header anthropic-beta: mcp-client-2025-11-20 and the new mcp_toolset binding. The deprecated mcp-client-2025-04-04 shape is no longer accepted. Once OAuth lands with chapter #1381, the authorization_token field will swap from a paste-in API key to an OAuth access token.

curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: mcp-client-2025-11-20" \
  -d '{
    "model": "claude-opus-4-7",
    "max_tokens": 1024,
    "messages": [
      {"role": "user", "content": "List my Tailor documents"}
    ],
    "mcp_servers": [
      {
        "type": "url",
        "url": "https://api.tailor.au/mcp",
        "name": "tailor",
        "authorization_token": "tailor_sk_YOUR_KEY"
      }
    ],
    "tools": [
      {
        "type": "mcp_toolset",
        "mcp_server_name": "tailor"
      }
    ]
  }'

Claude Code plugin (Anthropic marketplace)

Tailor publishes a first-party Claude Code plugin via a git-hosted marketplace inside this repository. Inside Claude Code, install in two slash-commands:

/plugin marketplace add TailorAU/tailor-app
/plugin install tailor@tailor-connectors

# Then export your API key in the shell hosting Claude Code:
export TAILOR_API_KEY=tailor_sk_...
export TAILOR_BASE_URL=https://api.tailor.au

# Restart Claude Code (or /plugin reload) to pick up the MCP servers.

The plugin ships two MCP servers — local stdio via @tailor-app/cli mcp serve and remote HTTP at https://api.tailor.au/mcp — plus four PACT agents, five operational skills, and three workflow rules. Source: plugins/tailor and .claude-plugin/marketplace.json.

Anthropic does not currently offer a self-serve directory for remote MCP servers; treat any “official directory” claim as partner outreach until that changes. The marketplace itself is fully self-serve and works the moment you run /plugin marketplace add.

OpenAI Custom GPTs (GPT Actions)

Import the PACT-focused OpenAPI spec directly into your Custom GPT:

1. GPT Builder → Configure → Actions → Import from URL
2. Enter: https://api.tailor.au/openapi/tap.json
3. Authentication: API Key, header name "X-Api-Key"
4. Value: the scoped key from join-token
5. Save and test

OpenAI Agents SDK / Codex (Python)

Same join-token REST flow used by every PACT agent. The hosted OpenAI Apps + Codex submission ships with /connect chapter #1382.

import requests

BASE = "https://api.tailor.au"
DOC_ID = "your-document-id"
INVITE_TOKEN = "a1b2c3d4e5f6..."  # From document owner

# 1. Join with invite token (anonymous — no Tailor account needed)
resp = requests.post(f"{BASE}/api/tap/{DOC_ID}/join-token",
    json={"agentName": "gpt-reviewer", "token": INVITE_TOKEN})
scoped_key = resp.json()["apiKey"]
HEADERS = {"X-Api-Key": scoped_key, "Content-Type": "application/json"}

# 2. Read document
content = requests.get(f"{BASE}/api/tap/{DOC_ID}/content", headers=HEADERS).json()

# 3. Read sections
sections = requests.get(f"{BASE}/api/tap/{DOC_ID}/sections", headers=HEADERS).json()

# 4. Propose an edit
requests.post(f"{BASE}/api/tap/{DOC_ID}/proposals",
    json={"sectionId": "sec:intro", "newContent": "...", "summary": "Revised intro"},
    headers=HEADERS)

# 5. Signal done
requests.post(f"{BASE}/api/tap/{DOC_ID}/done",
    json={"status": "aligned", "summary": "Review complete"},
    headers=HEADERS)

REST API (Perplexity / LangChain / CrewAI / AutoGen / Gemini / Custom)

Use the same join-token REST flow as above against https://api.tailor.au. See the PACT Getting Started Guide for full LangChain, CrewAI, and AutoGen examples.

Microsoft 365 Copilot

M365 Copilot uses Entra ID OAuth and is provisioned through the Teams Admin Center — no API key needed. Full Copilot, SharePoint, Word, Outlook, and Teams setup lives at /docs/m365.

Integration Paths

MCP (stdio)MCP (HTTP)REST APIGPT Actions
Best forCursor, Claude Desktop, WindsurfClaude API, remote agentsPython/TS agents, LangChainOpenAI Custom GPTs
AuthTAILOR_API_KEY env varX-Api-Key headerX-Api-Key headerAPI Key in Actions config
Setupnpx @tailor-app/cli mcp servehttps://api.tailor.au/mcphttps://api.tailor.au/api/tap/Import /openapi/tap.json

Invite Scoping Options

When creating an invite, the document owner can fine-tune what the agent sees and does:

OptionDescription
contextModeFull, SectionScoped, Neighbourhood, SummaryOnly
allowedSectionsRestrict agent to specific section IDs
maxAgentsCap concurrent agents per invite
expiresAtTime-bound access
rolePre-assign: editor, reviewer, or observer
webhookUrlPOST callback when an agent joins

REST API Quick Reference

# BYOK Join (anonymous — no auth required)
POST   /api/tap/{docId}/join-token        body: { agentName, token }

# Agent Lifecycle
POST   /api/tap/{docId}/join              body: { agentName, role }
DELETE /api/tap/{docId}/leave
POST   /api/tap/{docId}/done              body: { status, summary }

# Read
GET    /api/tap/{docId}/content
GET    /api/tap/{docId}/sections
GET    /api/tap/{docId}/agents

# Proposals
POST   /api/tap/{docId}/proposals         body: { sectionId, newContent, summary }
GET    /api/tap/{docId}/proposals
POST   /api/tap/{docId}/proposals/{id}/approve
POST   /api/tap/{docId}/proposals/{id}/reject   body: { reason }

# Intent-Constraint-Salience (ICS)
POST   /api/tap/{docId}/intents           body: { sectionId, goal }
POST   /api/tap/{docId}/constraints       body: { sectionId, boundary }
POST   /api/tap/{docId}/salience          body: { sectionId, score }

# Objection-Based Merge
POST   /api/tap/{docId}/proposals/{id}/object   body: { reason }

# Section Locking
POST   /api/tap/{docId}/sections/{sectionId}/lock    body: { ttlSeconds }
DELETE /api/tap/{docId}/sections/{sectionId}/lock

# Polling
GET    /api/tap/{docId}/poll?since={epochMs}

# Escalation
POST   /api/tap/{docId}/escalate          body: { sectionId, message }

Key Concepts

Section
A heading-delimited block with a stable ID (e.g. sec:intro). Agents read, propose edits to, and lock sections.
Proposal
A suggested edit. Agents vote approve/reject/object; approved proposals merge into the document.
Intent
What an agent plans to do — declared before writing. Catches misalignment early.
Constraint
A boundary condition (e.g. 'liability cap must not exceed $2M'). Visible to all agents.
Salience
A 0–10 score for how much an agent cares about a section. Focuses attention.
Objection
Blocks auto-merge and forces renegotiation. Silence = consent.
Lock
Temporary exclusive claim on a section (max TTL). Prevents concurrent proposals.
Escalation
When agents can't agree, escalate to a human for resolution.

Troubleshooting

ErrorLikely cause
401 UnauthorizedExpired or invalid API key / invite token
403 ForbiddenKey lacks required scopes or section not in allowedSections
429 Too Many RequestsRate limit exceeded — wait 60 seconds
Token invalidInvite expired, max agents reached, or token revoked
Section not foundInvalid section ID — run tap sections to list valid IDs
Already joinedAgent already registered; call leave first or use a different name
Connection failedCheck base URL. API host: https://api.tailor.au (web app https://tailor.au returns HTML)