Skip to main content
This page explains when to use MCP and when to use the CLI in Claude Code, Cursor, and ChatGPT agents.

The mental model

MCP results stay in the conversation. CLI results can be saved to a file.
When you call MCP get_note_transcript, the full transcript (typically 5–50KB per note) enters the conversation context. It stays there for the rest of the conversation until you summarize or clear the context. When you call tiro notes transcript --output transcript.md, the same content is saved to a file and stdout returns a single metadata line.
Even with 100 transcripts, the conversation only holds the paths and the count. Read the files you need.

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.
The conversation only holds 3 stdout lines and 12 metadata lines (about 80 tokens). The 12 transcripts are saved in ./out/. Read them with the Read tool one at a time, only when you need exact wording. Calling get_note_transcript 12 times leaves 60–600KB in the conversation (12 transcripts × 5–50KB each). Loading only the 2–3 you need in detail keeps token use down.

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.