npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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

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 --share

Connector 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-http

Remote HTTP MCP now tracks the local stdio tool set, except for multipart document upload. Track parity at docs/agents/mcp-tool-parity.md and run npm run check:mcp-parity from 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, or https://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 at source.tailor.au.

Installation

From npm (recommended)

npm install -g @tailor-app/cli
tailor --help

Requires Node.js 20+.

From the repo (development)

cd tools/tailor-cli
npm install
npm run build

Run 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 immediately

Optionally set the base URL (defaults to https://api.tailor.au):

export TAILOR_BASE_URL=https://api.tailor.au

Environment variables take precedence over stored configuration.

Store a key to disk

tailor login --key tailor_sk_your_key --url https://api.tailor.au

Verify current auth

tailor login --check

Interactive login (humans only)

tailor login --email [email protected]

Note: tailor login without 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 token

Options: | 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" --json

When 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 --json

tailor share delete <documentId>

Revoke the share link for a document.

tailor share delete a1b2c3d4
tailor share delete a1b2c3d4 --json

tailor 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 --json

tailor 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-432109876543

tailor sign cancel <requestId>

Cancel a pending signature request.

tailor sign cancel f8e7d6c5-b4a3-2109-8765-432109876543

tailor 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 abc123def456

tailor 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 --json

Options: | 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" --json

Options: | 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/cli for 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 abc123

Multi-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 operations

Invite 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-Key header with scoped key from join-token

OpenAI GPT Actions

Import the PACT-focused OpenAPI spec into a Custom GPT:

  1. GPT Builder > Configure > Actions > Import from URL
  2. Enter: https://api.tailor.au/openapi/tap.json
  3. Auth: API Key, header X-Api-Key, value = scoped key from join-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 --para values 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 --public

Markdown 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.json

Local 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 --json

Share 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 --public

Environment 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