Skip to main content
If you’re building a Claude Code, Cursor, or ChatGPT agent that needs Tiro data, this page tells you when to call which surface and how to keep your context window light.

The mental model

MCP returns to context. CLI returns to disk.
When you call MCP get_note_transcript, the entire transcript text — typically 5–50 KB per note — is injected into your conversation context window. Every subsequent turn carries that weight until compaction or summarization. When you call tiro notes transcript --output transcript.md, the same content lands on disk. stdout returns a single metadata line:
For 100 transcripts, that’s 50 KB → ~50 tokens (path + count). Read each one only when you need it.

Tool selection cheatsheet

When to call MCP vs CLI

Worked example — 30 days of “Acme Corp” meetings

You want to draft a client-specific quarterly summary. You need every meeting where Acme came up in the last 30 days, with full transcripts.
Cumulative context cost: ≈ 80 tokens (3 stdout lines + 12 metadata acks). 12 meeting transcripts now live in ./out/ — read them with the Read tool one at a time, only when you need exact wording. Compare to MCP-only: get_note_transcript × 12 calls would inject 60–600 KB into context (12 transcripts × 5–50 KB each). Most of that is dead weight — you only need 2–3 of the transcripts in detail.

Reading errors as JSON

Every error from the CLI follows a stable envelope:
Stable fields: error.message is human-readable and may change wording across releases — don’t pattern-match against it.

Exit codes

Quick auth-recovery loop in shell:

Output guarantees

  • --json is NDJSON for streams — list and search emit one JSON object per line. Pagination cursors arrive as a final {"_cursor": "…"} line.
  • --output <path> writes atomically — temp file + rename, never partial.
  • TTY auto-detection — pretty in interactive shells, JSON when piped or redirected. Force either with --pretty / --json.
  • tiro notes transcript --format json matches MCP get_note_transcript — same field names, same nesting, same speaker-segment structure. Reuse your existing parser.
  • Tokens are never echoedauth status only shows the first 4 chars; logs even at --verbose redact the rest.

Stable contract — what won’t break across patch releases

  • error.code values
  • error.errorType values
  • Exit codes
  • NDJSON line shape for list/search
  • The MCP-shape JSON returned by tiro notes transcript --format json
  • The metadata-line shape returned by --output operations
Anything else (pretty output, error messages, verbose log format) is best-effort and may change.