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).
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
Create an Invite
Document owner creates a scoped invite token with context mode, section limits, expiry, and role.
Hand Token to Agent
Paste the 64-char hex token into your GPT config, Claude MCP, agent prompt, or environment variable.
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.jsonAnthropic 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 API | GPT Actions | |
|---|---|---|---|---|
| Best for | Cursor, Claude Desktop, Windsurf | Claude API, remote agents | Python/TS agents, LangChain | OpenAI Custom GPTs |
| Auth | TAILOR_API_KEY env var | X-Api-Key header | X-Api-Key header | API Key in Actions config |
| Setup | npx @tailor-app/cli mcp serve | https://api.tailor.au/mcp | https://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:
| Option | Description |
|---|---|
| contextMode | Full, SectionScoped, Neighbourhood, SummaryOnly |
| allowedSections | Restrict agent to specific section IDs |
| maxAgents | Cap concurrent agents per invite |
| expiresAt | Time-bound access |
| role | Pre-assign: editor, reviewer, or observer |
| webhookUrl | POST 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
| Error | Likely cause |
|---|---|
| 401 Unauthorized | Expired or invalid API key / invite token |
| 403 Forbidden | Key lacks required scopes or section not in allowedSections |
| 429 Too Many Requests | Rate limit exceeded — wait 60 seconds |
| Token invalid | Invite expired, max agents reached, or token revoked |
| Section not found | Invalid section ID — run tap sections to list valid IDs |
| Already joined | Agent already registered; call leave first or use a different name |
| Connection failed | Check base URL. API host: https://api.tailor.au (web app https://tailor.au returns HTML) |