@tailor-app/cli
v0.14.3
Published
Tailor CLI — AI intelligence platform for documents, legislation, education, and healthcare. Upload, review, sign, and collaborate with AI agents using PACT protocol.
Downloads
777
Maintainers
Readme
Tailor CLI
Command-line tool for uploading, sharing, and managing documents on Tailor.
@tailor-app/cli is also the canonical local MCP connector for
Tailor: running tailor mcp serve (or invoking it via npx -y
@tailor-app/cli mcp serve) gives any MCP-capable agent runtime the full
set of Tailor document, review, signing, PACT/TAP, pages, and Baink
tools. See Connector Install Quickstart
below.
Quickstart
npm install -g @tailor-app/cli
tailor login --email [email protected]
tailor upload ./my-document.docx --shareConnector Install Quickstart
For agent runtimes (Cursor, Claude Desktop, Windsurf, Codex, Claude
remote connectors, Microsoft 365 / Copilot), use the snippets below.
The full decision tree, M365 surface taxonomy, and tool parity status
live in docs/agents/TAILOR_CONNECTORS.md.
Easy Connect — tailor connect
The fastest way to install Tailor in your AI runtime:
tailor login # one-time
tailor connect platforms # see what's supported
tailor connect cursor --write # auto-installs into ~/.cursor/mcp.json
tailor connect claude-desktop --write # auto-installs into Claude config
tailor connect codex --write # auto-installs into ~/.codex/config.toml
tailor connect claude-api # prints HTTP MCP URL + Bearer token--write asks for confirmation if the runtime config already has a Tailor
entry. Use --yes to overwrite.
Cursor — .cursor/mcp.json
{
"mcpServers": {
"tailor": {
"command": "npx",
"args": ["-y", "@tailor-app/cli", "mcp", "serve"],
"env": {
"TAILOR_API_KEY": "tailor_sk_YOUR_KEY",
"TAILOR_BASE_URL": "https://api.tailor.au"
}
}
}
}Claude Desktop — claude_desktop_config.json
Path: %APPDATA%\Claude\claude_desktop_config.json (Windows) or
~/Library/Application Support/Claude/claude_desktop_config.json (macOS).
{
"mcpServers": {
"tailor": {
"command": "npx",
"args": ["-y", "@tailor-app/cli", "mcp", "serve"],
"env": {
"TAILOR_API_KEY": "tailor_sk_YOUR_KEY",
"TAILOR_BASE_URL": "https://api.tailor.au"
}
}
}
}Restart Claude Desktop. Tailor tools should appear in the tool picker.
Codex / OpenAI Codex CLI (local)
If your local Codex shell supports MCP stdio servers, point it at the
same npx -y @tailor-app/cli mcp serve command with TAILOR_API_KEY
and TAILOR_BASE_URL in the environment. If your Codex deployment can
only call REST endpoints, use X-Api-Key: tailor_sk_... against
https://api.tailor.au directly — see REST API examples.
Claude Remote Connectors / Hosted Agents — HTTP MCP
URL: https://api.tailor.au/mcp
Auth: Authorization: Bearer tailor_sk_YOUR_KEY
(or X-Api-Key: tailor_sk_YOUR_KEY)
Discovery: https://api.tailor.au/.well-known/mcp.json
Transport: streamable-httpRemote HTTP MCP now tracks the local stdio tool set, except for multipart document upload. Track parity at
docs/agents/mcp-tool-parity.mdand runnpm run check:mcp-parityfrom this folder to print the current diff.
Microsoft 365 / Copilot
The Microsoft 365 story is four distinct surfaces — Add-in, Copilot
Plugin, Graph Ingestion, future Graph Search Connector — with different
auth models and packaging. See
docs/guides/m365-integration.md
for end-to-end setup and
docs/agents/TAILOR_CONNECTORS.md
for the taxonomy.
Tailor MCP vs PACT MCP vs Source MCP
These three MCP surfaces are distinct — do not install one expecting another:
- Tailor MCP (this CLI's
mcp serve, orhttps://api.tailor.au/mcp) — full Tailor automation: documents, review, signing, share, PACT/TAP, pages, Baink. - PACT MCP (
@pact-protocol/mcp) — vendor-neutral coordination only. - Source MCP (
@source-tailor/mcp) — verified external knowledge graph atsource.tailor.au.
Installation
From npm (recommended)
npm install -g @tailor-app/cli
tailor --helpRequires Node.js 20+.
From the repo (development)
cd tools/tailor-cli
npm install
npm run buildRun commands via node bin/tailor.js <command> or set up a shell alias.
PACT Protocol vs Tailor CLI
The PACT protocol has its own standalone CLI (@pact-protocol/cli) for vendor-neutral coordination. Here's how it relates to the Tailor CLI:
| Package | Scope | When to use |
|---------|-------|-------------|
| @pact-protocol/cli | Coordination only: join, intent, constrain, object, poll, done, escalate | Building framework-agnostic PACT integrations that work with any PACT-compliant server |
| @tailor-app/cli | Everything: PACT coordination + document content + platform features | Working on the Tailor platform — uploads, reviews, sharing, signing, plus PACT via tailor tap |
The Tailor CLI is a superset. It includes everything @pact-protocol/cli does (via tailor tap) plus Tailor-specific content and platform operations. If you're building on Tailor, use @tailor-app/cli. If you're building a framework-agnostic PACT integration, use @pact-protocol/cli.
tailor tap Command Classification
Coordination (also available in @pact-protocol/cli):
tap join, tap leave, tap agents, tap intent, tap intents, tap constrain, tap constraints, tap salience, tap salience-map, tap object, tap poll, tap watch, tap done, tap completions, tap lock, tap unlock, tap escalate, tap ask-human, tap resolve
Content operations (Tailor-specific):
tap get, tap sections, tap propose, tap proposals, tap approve, tap reject, tap events, tap diff
Platform operations (Tailor-specific):
upload, download, share, sign, list, status, docs, reviews, comments, changes, tag, keys, admin, attach, pages
Product Modules
Tailor has grown beyond documents into vertical product modules. The CLI currently covers the core platform; module-specific commands are planned.
| Module | Backend | CLI Status | MCP Status | Notes |
|--------|---------|-----------|------------|-------|
| Core (Documents) | src/WebApi/Features/ | 21 commands, 40 MCP tools | Available | Full coverage |
| Source | sites/source/ | Planned | Planned | Verified knowledge graph — source.tailor.au/api/... (REST only today) |
| Spark | src/WebApi/Features/Spark/ | Planned | Planned | Early learning CCMS — NQF evidence, learning stories, parent portal |
| Praxis | src/WebApi/Features/Praxis/ | Planned (low) | Planned (low) | GP practice management — consultations, patients, MBS coding |
| Voice | src/WebApi/Features/TailorVoice/ | N/A | N/A | AI phone agent — real-time telephony, webhook-driven |
| PACT (open protocol) | github.com/TailorAU/pact | N/A | N/A | Spec + npm packages; public home is the GitHub repo |
Planned CLI Commands
tailor source search --jurisdiction QLD --query "workplace safety"
tailor source facts --id fact_abc123
tailor source ingest --url "https://legislation.qld.gov.au/..."
tailor spark students --school <schoolId>
tailor spark stories --student <studentId>
tailor spark nqf evidence --student <studentId>Planned MCP Tools
| Tool | Module | Purpose |
|------|--------|---------|
| tailor_source_search | Source | Search verified legislation by jurisdiction/keyword |
| tailor_source_fact | Source | Retrieve a specific verified fact by ID |
| tailor_source_ingest | Source | Submit legislation for ingestion |
| tailor_spark_students | Spark | List/manage students for a school |
| tailor_spark_story | Spark | Generate or read learning stories |
Authentication
The CLI uses API keys for authentication. Keys are prefixed with tailor_sk_ and sent as X-Api-Key headers.
For AI agents and CI/CD (recommended)
Set an environment variable — no tailor login needed:
export TAILOR_API_KEY=tailor_sk_your_key
tailor list # works immediatelyOptionally set the base URL (defaults to https://api.tailor.au):
export TAILOR_BASE_URL=https://api.tailor.auEnvironment variables take precedence over stored configuration.
Store a key to disk
tailor login --key tailor_sk_your_key --url https://api.tailor.auVerify current auth
tailor login --checkInteractive login (humans only)
tailor login --email [email protected]Note:
tailor loginwithout flags is interactive and requires a terminal. In non-TTY environments (CI, AI agents), it prints guidance and exits.
Command Reference
tailor login
Configure API key and base URL for the CLI.
tailor login --key tailor_sk_abc123 # Store API key
tailor login --key tailor_sk_abc123 --url https://api.tailor.au
tailor login --check # Verify current auth
tailor login --email [email protected] # Interactive magic link
tailor login # Fully interactive (TTY only)Non-interactive two-step login (for AI agents):
tailor login --email [email protected] # Step 1: sends code, exits
tailor login --email [email protected] --code 874653 # Step 2: verifies, saves tokenOptions:
| Flag | Description | Default |
|------|-------------|---------|
| --key <apiKey> | API key (must start with tailor_sk_) | — |
| --url <baseUrl> | Base URL for the Tailor API | https://api.tailor.au |
| --check | Validate current auth and exit (no prompts) | — |
| --email <email> | Account email for magic link auth | — |
| --code <code> | Verification code (use with --email for non-interactive login) | — |
| --code-only | Skip browser auth, use code entry only | — |
tailor upload <files...>
Upload one or more documents. Supports files, folders, and glob patterns.
tailor upload ./report.docx
tailor upload ./report.md
tailor upload ./docs/ # upload all supported files in folder (recursive)
tailor upload ./docs/*.docx
tailor upload ./deliverables/*.docx --share --public
tailor upload ./budget.xlsx --share --permission CommentOnly
tailor upload ./docs/*.docx --json
tailor upload --stdin --title "Pitch Deck" < one-pager.html
cat one-pager.html | tailor upload --stdin --title "Pitch Deck" --format html
python build.py | tailor upload --stdin --title "Generated Report" --jsonWhen a folder is passed, it is scanned recursively for supported file types (.docx, .pdf, .html, .htm, .md).
Arguments:
| Argument | Description |
|----------|-------------|
| <files...> | One or more file paths, folder paths, or glob patterns |
Options:
| Flag | Description | Default |
|------|-------------|---------|
| --share | Create shareable links after upload | false |
| --permission <perm> | Share permission: ReadOnly, CommentOnly, FullReview | ReadOnly |
| --public | Public links (no email verification) | false |
| --stdin | Read file content from stdin (pipe-friendly) | false |
| --title <title> | Override document title after upload | — |
| --format <fmt> | Content format for stdin: html, md, docx | html |
| --json | Output results as JSON (suppresses human UI) | false |
tailor share — Share Links
Create and manage shareable document links.
tailor share create <documentId>
Create a shareable link for a document.
tailor share create a1b2c3d4 --permission FullReview
tailor share create a1b2c3d4 --public --json
tailor share a1b2c3d4 # shortcut for share create| Flag | Description | Default |
|------|-------------|---------|
| --permission <perm> | ReadOnly, CommentOnly, FullReview | FullReview |
| --public | No email verification required | false |
| --access <mode> | open, closed-individual, closed-org | open |
| --reviewers <emails> | Comma-separated emails (for closed-individual) | — |
| --domain <domain> | Allowed email domain (for closed-org) | — |
| --json | Output raw JSON | false |
tailor share list <documentId>
Show document info for a given document.
tailor share list a1b2c3d4
tailor share list a1b2c3d4 --jsontailor share delete <documentId>
Revoke the share link for a document.
tailor share delete a1b2c3d4
tailor share delete a1b2c3d4 --jsontailor share engagement <documentId> (#1328)
Show share-link engagement for a document — opens, unique sessions, named viewers, anonymous traffic, and a recent timeline. Read-only; only the document creator or an assigned reviewer (matched by the API key's user) can read it. Privacy-safe: no raw IPs, no raw share tokens, country only.
tailor share engagement a1b2c3d4 # human-readable rendering
tailor share engagement a1b2c3d4 --json # raw projection (pipe to jq / a dashboard)
tailor share engagement a1b2c3d4 --limit 50 # widen the timeline window| Flag | Description | Default |
|------|-------------|---------|
| --limit <n> | Max timeline entries to render (1–100) | 20 |
| --json | Output raw JSON | false |
The same data is exposed to MCP clients via the tailor_share_engagement
tool.
tailor fabric — Public Fabric Share Links (#1158)
Replace a list of 14 individual document share URLs with a single read-only Fabric graph view. The public viewer renders document nodes + supporting-doc edges; clicking a node opens that document's own share link in a new tab. Nodes without a public share render as locked.
Scope either by tag (portfolio) or by explicit document IDs.
tailor fabric share create
# Portfolio tag scope — most common
tailor fabric share create --tag qgov-pilot --public --json
# Explicit document set
tailor fabric share create --docs <id1>,<id2>,<id3> --public
# Closed to a specific domain (email verification required)
tailor fabric share create --tag qgov-pilot --access closed-org --domain qld.gov.au| Flag | Description | Default |
|------|-------------|---------|
| --tag <tag> | Portfolio tag scope (mutually exclusive with --docs) | — |
| --docs <ids> | Comma-separated document IDs (mutually exclusive with --tag) | — |
| --public | No email verification required | verification on |
| --access <mode> | open, closed-individual, closed-org | open |
| --reviewers <emails> | Comma-separated reviewer emails (for closed-individual) | — |
| --domain <domain> | Allowed email domain (for closed-org) | — |
| --json | Output raw JSON | — |
tailor fabric share list
tailor fabric share list
tailor fabric share list --include-revoked --jsontailor fabric share delete <token>
tailor fabric share delete <token>tailor sign — Document Signing
Request and manage document signatures. When all parties sign, a signed PDF is generated and all parties receive a "Consensus Reached" email.
tailor sign request <documentId>
Request signatures on a finalised document.
tailor sign request a1b2c3d4 --signatories "Rick:[email protected],Alice:[email protected]"
tailor sign request a1b2c3d4 --signatories "Rick:[email protected]" --order sequential --message "Please sign the extension letter" --deadline 2026-04-01| Flag | Description | Default |
|------|-------------|---------|
| --signatories <list> | Required. Comma-separated Name:email pairs | — |
| --order <order> | parallel or sequential | parallel |
| --message <msg> | Message to include in the signing email | — |
| --deadline <date> | Deadline (ISO date) | — |
| --json | Output raw JSON | — |
tailor sign status <requestId>
Check the status of a signature request.
tailor sign status f8e7d6c5-b4a3-2109-8765-432109876543tailor sign cancel <requestId>
Cancel a pending signature request.
tailor sign cancel f8e7d6c5-b4a3-2109-8765-432109876543tailor sign submit <accessToken>
Submit a signature using the access token from the email link.
tailor sign submit abc123def456 --name "Rick Johnson"tailor sign decline <accessToken>
Decline to sign a document.
tailor sign decline abc123def456 --reason "Need legal review first"tailor sign view <accessToken>
View signing page details for an access token.
tailor sign view abc123def456tailor docs — Document Content
Read, update, and list document content.
tailor docs get <documentId>
Read document content as Markdown (pipe-friendly).
tailor docs get a1b2c3d4 # prints markdown to stdout
tailor docs get a1b2c3d4 > doc.md # save to file
tailor docs get a1b2c3d4 --json # wrap in JSON envelope
tailor docs get a1b2c3d4 --format json # same as --json| Flag | Description | Default |
|------|-------------|---------|
| --format <fmt> | markdown, json | markdown |
| --json | Wrap output in JSON envelope | false |
tailor docs update <documentId>
Update document content from a file or stdin.
tailor docs update a1b2c3d4 --file report.html
tailor docs update a1b2c3d4 --file report.docx --replace
cat report.html | tailor docs update a1b2c3d4
tailor docs update a1b2c3d4 --file report.html --json| Flag | Description | Default |
|------|-------------|---------|
| --file <path> | Path to file (HTML, MD, DOCX) | — |
| --html | Treat content as HTML | false |
| --replace | Replace the entire document file (multipart) | false |
| --json | Output raw JSON | false |
tailor docs list
List your documents (alias for tailor list with extra options).
tailor docs list
tailor docs list --tag regulation --json
tailor docs list --per-page 10 --page 2| Flag | Description | Default |
|------|-------------|---------|
| --page <n> | Page number | 1 |
| --per-page <n> | Results per page | 50 |
| --tag <tag> | Filter by tag (repeatable) | — |
| --json | Output raw JSON | false |
tailor list
List all your documents.
tailor list
tailor list --jsonOptions:
| Flag | Description | Default |
|------|-------------|---------|
| --json | Output as JSON | false |
tailor keys create
Create a new API key.
tailor keys create --name "CI Pipeline"
tailor keys create --name "LCC Upload" --scopes "documents:read,documents:write"
tailor keys create --name "Temp Key" --expires 30
tailor keys create --name "claude-code" --jsonOptions:
| Flag | Description | Default |
|------|-------------|---------|
| --name <name> | Key name (required) | — |
| --json | Output raw JSON | false |
| --scopes <scopes> | Comma-separated scopes | documents:read,documents:write |
| --expires <days> | Days until expiry | 365 |
tailor keys list
List all active API keys.
tailor keys list
tailor keys list --json| Flag | Description | Default |
|------|-------------|---------|
| --json | Output raw JSON | false |
tailor keys revoke
Revoke an API key.
tailor keys revoke key_abc123
tailor keys revoke key_abc123 --json| Flag | Description | Default |
|------|-------------|---------|
| --json | Output raw JSON | false |
tailor tap — PACT Protocol
Soft-deprecation notice: the
tailor tap *group will be deprecated in a future major release in favour of@pact-protocol/clifor vendor-neutral PACT coordination. Tailor-specific content operations (read/update Tailor documents, attach review evidence) will remain in this CLI. Tracking: TailorAU/pact#6.
Collaborate on documents at machine speed. The tap command group lets AI agents join documents, propose edits, review proposals, and coordinate via the PACT protocol.
Command Reference
| Command | Description |
|---------|-------------|
| tailor tap join <docId> --as <name> | Register as an agent on a document |
| tailor tap leave <docId> | Unregister from a document |
| tailor tap get <docId> | Get document content (Markdown, HTML, or DOCX text) |
| tailor tap sections <docId> | Show section tree with stable IDs (.md, .html, .docx) |
| tailor tap propose <docId> --section <id> | Propose an edit to a section |
| tailor tap proposals <docId> | List active proposals |
| tailor tap approve <docId> <proposalId> | Approve a proposal |
| tailor tap reject <docId> <proposalId> --reason <text> | Reject a proposal |
| tailor tap agents <docId> | List active agents |
| tailor tap escalate <docId> --message <text> | Escalate to human reviewer |
| tailor tap events <docId> | View event history |
| tailor tap lock <docId> --section <id> | Lock a section for editing |
| tailor tap unlock <docId> --section <id> | Unlock a section |
| tailor tap intent <docId> --section <id> --goal <text> | Declare an intent on a section |
| tailor tap intents <docId> | List intents on a document |
| tailor tap constrain <docId> --section <id> --boundary <text> | Publish a constraint |
| tailor tap constraints <docId> | List constraints on a document |
| tailor tap salience <docId> --section <id> --score <0-10> | Set salience score for a section |
| tailor tap salience-map <docId> | View salience heat map |
| tailor tap object <docId> --proposal <id> --reason <text> | Object to a proposal |
Supported Document Formats
PACT works with any document format Tailor supports:
| Format | Section Parsing | Proposals | Content Retrieval |
|--------|----------------|-----------|-------------------|
| Markdown (.md) | ✅ ATX headings | ✅ Full | ✅ Raw Markdown |
| HTML (.html) | ✅ <h1>–<h6> tags | ✅ Full | ✅ Raw HTML |
| DOCX (.docx) | ✅ Word heading styles | ✅ Full | ✅ Text projection |
| PDF (.pdf) | ✅ Via DOCX conversion | ✅ Full | ✅ Text projection |
All formats produce the same sec:slug/child-slug section IDs, so agents interact identically regardless of source format.
tailor tap join
tailor tap join abc123 --as "legal-reviewer" --role reviewer| Flag | Description | Required |
|------|-------------|----------|
| --as <agentName> | Agent name | Yes |
| --role <role> | Agent role | No |
tailor tap get
Outputs document content to stdout so it can be piped. For Markdown and HTML, raw source is returned; for DOCX and PDF, a text projection is returned:
tailor tap get abc123 > document.md
tailor tap get abc123 --section sec_01 | head -20| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Get single section | No |
tailor tap propose
Propose a change using a file or inline content:
# From a file
tailor tap propose abc123 --section sec_01 --file ./revised-intro.md --summary "Tightened intro"
# Inline content
tailor tap propose abc123 --section sec_01 --content "New paragraph text" --summary "Fixed typo"| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Target section | Yes |
| --file <path> | Read content from file | One of --file / --content |
| --content <text> | Inline content | One of --file / --content |
| --summary <text> | Change summary | No |
| --reasoning <text> | Reasoning for change | No |
tailor tap proposals
tailor tap proposals abc123
tailor tap proposals abc123 --section sec_01 --status pending --json| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Filter by section | No |
| --status <status> | Filter by status | No |
| --json | Output as JSON | No |
tailor tap lock / unlock
tailor tap lock abc123 --section sec_01 --ttl 60
tailor tap unlock abc123 --section sec_01| Flag | Description | Default |
|------|-------------|---------|
| --section <sectionId> | Section to lock/unlock | Required |
| --ttl <seconds> | Lock time-to-live | 30 |
tailor tap intent
Declare what you want to achieve in a section — before writing any text:
tailor tap intent abc123 --section sec:liability --goal "Add currency risk language" --category compliance| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Target section | Yes |
| --goal <text> | What you want to achieve | Yes |
| --category <category> | e.g. compliance, clarity, structure | No |
tailor tap intents
tailor tap intents abc123
tailor tap intents abc123 --section sec:liability --json| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Filter by section | No |
| --json | Output as JSON | No |
tailor tap constrain
Publish a boundary condition — what must or must not happen:
tailor tap constrain abc123 --section sec:liability --boundary "Liability cap must not exceed $2M" --category commercial| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Target section | Yes |
| --boundary <text> | Boundary condition | Yes |
| --category <category> | e.g. regulatory, commercial, technical | No |
tailor tap constraints
tailor tap constraints abc123
tailor tap constraints abc123 --section sec:liability --json| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Filter by section | No |
| --json | Output as JSON | No |
tailor tap salience
Signal how much you care about a section (0 = don't care, 10 = critical):
tailor tap salience abc123 --section sec:liability --score 9| Flag | Description | Required |
|------|-------------|----------|
| --section <sectionId> | Target section | Yes |
| --score <0-10> | Salience score | Yes |
tailor tap salience-map
View the salience heat map showing where agent attention is concentrated:
tailor tap salience-map abc123
tailor tap salience-map abc123 --json| Flag | Description | Required |
|------|-------------|----------|
| --json | Output as JSON | No |
tailor tap object
Object to a proposal (objection-based merge — silence = consent):
tailor tap object abc123 --proposal prop_xyz --reason "Violates liability cap constraint"| Flag | Description | Required |
|------|-------------|----------|
| --proposal <proposalId> | Proposal to object to | Yes |
| --reason <text> | Reason for objection | Yes |
Agent Workflow Example
# 1. Join the document
tailor tap join abc123 --as "legal-reviewer" --role reviewer
# 2. Read the document
tailor tap get abc123 > doc.md
# 3. View sections
tailor tap sections abc123
# 4. Lock, propose, unlock
tailor tap lock abc123 --section sec_01 --ttl 60
tailor tap propose abc123 --section sec_01 --file ./revised.md --summary "Compliance fix"
tailor tap unlock abc123 --section sec_01
# 5. Another agent approves
tailor tap approve abc123 prop_abc
# 6. Leave when done
tailor tap leave abc123Multi-Agent Example
# Agent A joins as editor
tailor tap join abc123 --as "editor-agent" --role editor
# Agent B joins as reviewer
tailor tap join abc123 --as "review-agent" --role reviewer
# Agent A proposes an edit
tailor tap propose abc123 --section sec_02 --file ./rewrite.md --summary "Rewrite methodology"
# Agent B reviews and approves
tailor tap proposals abc123 --section sec_02
tailor tap approve abc123 prop_xyz
# If stuck, escalate to human
tailor tap escalate abc123 --section sec_03 --message "Legal clause needs human review"Intent-Constraint-Salience (ICS) Example
Align before you write — critical when agents have confidential contexts:
# Agent A (legal): Declare intent — tells everyone WHAT, not WHY
tailor tap intent abc123 --section sec:liability \
--goal "Add currency risk allocation language" --category legal
# Agent B (commercial): Publish constraint — sets boundaries
tailor tap constrain abc123 --section sec:liability \
--boundary "Total liability must not exceed $2M AUD" --category commercial
# Agent C (compliance): Set salience — signal this section is critical
tailor tap salience abc123 --section sec:liability --score 10
# Agent A: Check constraints before writing
tailor tap constraints abc123 --section sec:liability
tailor tap salience-map abc123
# Agent A: Propose text satisfying all constraints
tailor tap propose abc123 --section sec:liability \
--file ./revised-liability.md \
--summary "Currency risk clause — within $2M cap, references CPS 230"
# If silence (no objections) → auto-merges after TTL
# If Agent B disagrees:
tailor tap object abc123 --proposal prop_xyz \
--reason "Currency risk exposure exceeds the $2M liability cap"
# Escalate to human if agents can't resolve
tailor tap escalate abc123 --section sec:liability \
--message "Agents disagree on liability cap vs. currency risk allocation"BYOK Invite Flow — Connect External Agents
PACT uses a BYOK (Bring Your Own Key) model. Document owners create scoped invite tokens for external AI agents. Agents join anonymously — no Tailor account needed.
# 1. Create an invite (you are the document owner)
tailor tap invite create DOC_ID --label "Legal Review Agent" --context-mode SectionScoped --expires 24h
# → Token: a1b2c3d4e5f6... (give this to the external agent)
# 2. External agent joins anonymously:
curl -X POST https://api.tailor.au/api/pact/DOC_ID/join-token \
-H "Content-Type: application/json" \
-d '{"agentName": "legal-bot", "token": "a1b2c3d4e5f6..."}'
# → { registrationId, apiKey: "tailor_sk_scoped_...", contextMode, allowedSections }
# 3. Agent uses the scoped key for all PACT operationsInvite options:
| Flag | Description | Default |
|------|-------------|---------|
| --label <name> | Human-readable label | Required |
| --context-mode <mode> | Full, SectionScoped, Neighbourhood, SummaryOnly | Full |
| --allowed-sections <ids> | Comma-separated section IDs | All |
| --max-agents <n> | Max concurrent agents per invite | Unlimited |
| --expires <duration> | Expiry (e.g., 24h, 7d) | None |
| --role <role> | Pre-assigned role (editor, reviewer, observer) | None |
| --webhook <url> | POST callback when an agent joins | None |
MCP Server (stdio)
For MCP-compatible agents (Cursor, Claude Desktop, Windsurf):
{
"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"
}
}
}
}HTTP MCP Endpoint
For remote/cloud agents (Claude API, server-side agents):
- Endpoint:
https://api.tailor.au/mcp(streamable HTTP) - Discovery:
https://api.tailor.au/.well-known/mcp.json - Auth:
X-Api-Keyheader with scoped key fromjoin-token
OpenAI GPT Actions
Import the PACT-focused OpenAPI spec into a Custom GPT:
- GPT Builder > Configure > Actions > Import from URL
- Enter:
https://api.tailor.au/openapi/tap.json - Auth: API Key, header
X-Api-Key, value = scoped key fromjoin-token
tailor comments
Add and manage comments on a document. The --para flag accepts PACT section IDs from tailor tap sections.
# List comments
tailor comments list <docId>
tailor comments list <docId> --json --unresolved
# Add a comment (use section IDs from `tap sections` as --para values)
tailor tap sections <docId> # get section IDs first
tailor comments add <docId> --para "sec:my-doc/introduction" --text "This section needs a date reference."
# Resolve a comment
tailor comments resolve <commentId>Tip for agents: Run
tailor tap sections <docId>to discover section IDs, then use those as--paravalues when adding comments.
Examples
LCC Quickstart: Upload 26 deliverables with shareable links
# Configure for production
tailor login --key tailor_sk_lcc_production_key
# Upload all DOCX files and generate public share links
tailor upload ./deliverables/*.docx --share --public
# Output:
# Uploading 26 file(s)...
#
# ✓ LCC-Policy-Report.docx → a1b2c3d4
# https://tailor.au/share/abc123...
# ✓ LCC-Budget-Analysis.docx → e5f6g7h8
# https://tailor.au/share/def456...
# ...
# ✓ 26/26 uploaded successfully
#
# Shareable Links:
# LCC-Policy-Report: https://tailor.au/share/abc123...
# LCC-Budget-Analysis: https://tailor.au/share/def456...Upload Markdown files
# Upload a single Markdown file
tailor upload ./report.md --share
# Upload all Markdown files in a directory
tailor upload ./docs/*.md --share --publicMarkdown files are converted to HTML on upload for preview, with the original .md preserved as the source of truth.
CI/CD Integration
# Set credentials via environment variables
export TAILOR_API_KEY=tailor_sk_ci_key
export TAILOR_BASE_URL=https://api.tailor.au
# Upload build artifacts
tailor upload ./output/*.docx --share --json > upload-results.jsonLocal Development
# Point to local API
tailor login --url http://localhost:7255 --key tailor_sk_dev_key
# Upload a test document
tailor upload ./test-fixtures/demo.docx
# List documents
tailor list --jsonShare with specific permissions
# Read-only share (default)
tailor share abc123
# Allow comments
tailor share abc123 --permission CommentOnly
# Full review access, no email verification
tailor share abc123 --permission FullReview --publicEnvironment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| TAILOR_API_KEY | API key for authentication | — |
| TAILOR_BASE_URL | Base URL for the Tailor API | https://api.tailor.au |
Environment variables override stored configuration.
Config Storage
Configuration is stored locally using the conf package:
- Windows:
%APPDATA%/tailor-cli/config.json - macOS:
~/Library/Preferences/tailor-cli/config.json - Linux:
~/.config/tailor-cli/config.json
Run tailor login to see the exact path.
Troubleshooting
| Problem | Cause | Fix |
|---------|-------|-----|
| Not authenticated | No API key configured | Run tailor login --key tailor_sk_... or set TAILOR_API_KEY env var |
| HTTP 401: Unauthorized | Session expired or invalid key | Re-authenticate: tailor login --email <email> or tailor login --key <key> |
| HTTP 403: Forbidden | Key lacks required scopes | Create a new key: tailor keys create --name "agent" --scopes "documents:read,documents:write" |
| Could not connect to https://api.tailor.au | Wrong URL or server unreachable | Check URL: tailor login --url <url>. For local dev: http://localhost:7255 |
| HTTP 404: Server returned HTML | Base URL points to web app (tailor.au) instead of API | tailor login --url https://api.tailor.au or export TAILOR_BASE_URL=https://api.tailor.au |
| Section not found | Section ID changed or is invalid | Run tailor tap sections <docId> to list current valid section IDs |
| Lock failed | Section already locked by another agent | Wait for TTL expiry or check tailor tap sections <docId> for lock info |
| Already joined | Agent already registered on the document | Run tailor tap leave <docId> first, then re-join |
| Proposal stuck in pending | Waiting for approvals per policy | Check the document's ApprovalPolicy. Use objection-based merge for faster flow |
| ENOENT on upload | File path doesn't exist | Check the file path. Use quotes around paths with spaces |
| Commands not found after update | Old version cached | Run npm cache clean --force && npm install -g @tailor-app/cli |
For more detailed debugging, see the PACT Getting Started Guide.
Requirements
- Node.js >= 20.0.0
- A Tailor account with an API key
Tech Stack
- Commander.js — CLI framework
- chalk — Terminal colors
- ora — Terminal spinners
- conf — Persistent config
- glob — File pattern matching
