Pass --json whenever a program or agent will parse stdout. Tables are for humans. Errors still go to stderr as error: … with exit code 1, even with --json.
[
  {
    "id": "1920abc...",
    "threadId": "1920abc...",
    "date": "Mon, 20 Aug 2026 09:14:00 -0700",
    "from": "Alice <alice@example.com>",
    "to": "you@gmail.com",
    "subject": "Re: Tuesday",
    "snippet": "Tuesday works for me…",
    "unread": true,
    "labels": ["INBOX", "UNREAD"]
  }
]
On Proton Mail, id looks like INBOX:12. threadId may be null. labels is the mailbox name.

Full message (show)

Summary fields plus:
  • body — plain text when mailkit can find a text/plain part
  • messageIdHeader — RFC Message-ID

Thread (thread, Gmail)

{
  "threadId": "1920abc...",
  "messages": [
    { "id": "...", "from": "...", "subject": "...", "body": "..." }
  ]
}

Draft create / reply

{ "draftId": "...", "messageId": "...", "threadId": "..." }
drafts is a list of summaries, each with draftId.

Send

{ "messageId": "...", "threadId": "..." }

Doctor

A list of:
{ "account": "you@gmail.com", "provider": "gmail", "ok": true, "error": null }

Organize

Includes count and the affected ids (modified, trashed, or similar).

auth list

Human table only (provider in brackets). Use it to choose -a and to know the provider before a write verb.