MCP tools

Triage actions

Change mail: trash, spam, archive, label, star, and snooze. Take the lease first.

Call these with tools/call on https://getinboxtriage.com/mcp. See the MCP overview for sign-in and the request format.

propose_mark_spam

Tool

Proposes reporting one message as spam and returns a pending report for the person to approve. Moves nothing itself.

Inputs

NameTypeRequiredDescription
inboxId string Required Inbox id from list_inboxes.
messageId string Required Message id from list_messages, search_mailbox, or show_inbox.
confirmed boolean Optional Only needed when the sender is on the VIP list: pass true after the human agrees in chat.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "propose_mark_spam",
    "arguments": {
      "inboxId": "inbox_lx2k9a1b",
      "messageId": "18f3a2b4c5d6e7f8"
    }
  }
}

confirm_mark_spam

Tool

Moves the proposed message to Spam or Junk after the person approves. One-shot, ~15 min expiry.

Inputs

NameTypeRequiredDescription
pendingSpamId string Required pendingSpamId returned by propose_mark_spam
approvalCode string Required approvalCode returned by propose_mark_spam for this pending report
humanApprovedInChat true Optional Ignored. Approval happens in the in-app prompt or on the approval page.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "confirm_mark_spam",
    "arguments": {
      "pendingSpamId": "...",
      "approvalCode": "K7Q2"
    }
  }
}

archive_messages

Tool

Archives messages by id or by sender, on any inbox type. More than 5 messages returns a count to confirm first; more than 25 returns a preview and a confirmToken. Once connected agents have moved 500 messages in an hour, the person approves each further move (an in-app prompt, or an approvalUrl to give them). Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
confirmToken string Optional More than 25 messages: the confirmToken a first call returned in its preview, after the person agreed. Single use, 15 minutes.
confirmed boolean Optional More than 5 messages: true once the person agreed to the count/sender breakdown a first call without it returned. Not needed for 5 or fewer.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "archive_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

trash_messages

Tool

Moves messages to Trash or Deleted Items, on any inbox type. Not a permanent delete. Trashing by sender skips mail from people. Same confirmation steps as archive_messages. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
confirmToken string Optional More than 25 messages: the confirmToken a first call returned in its preview, after the person agreed. Single use, 15 minutes.
confirmed boolean Optional More than 5 messages: true once the person agreed to the count/sender breakdown a first call without it returned. Not needed for 5 or fewer.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "trash_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

star_messages

Tool

Stars messages, on any inbox type. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "star_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

unstar_messages

Tool

Removes the star from messages, on any inbox type. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "unstar_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

mark_messages_read

Tool

Marks messages read, on any inbox type. Undo restores the previous state. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mark_messages_read",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

mark_messages_unread

Tool

Marks messages unread, on any inbox type. Undo restores the previous state. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "mark_messages_unread",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

label_messages

Tool

Adds Gmail labels (labelIds from list_labels) to messages. Gmail only. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
labelIds string[] Optional Gmail label ids from list_labels
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "label_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ],
      "labelIds": [
        "Label_1"
      ]
    }
  }
}

unlabel_messages

Tool

Removes Gmail labels (labelIds from list_labels) from messages. Gmail only. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
labelIds string[] Optional Gmail label ids from list_labels
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "unlabel_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ],
      "labelIds": [
        "Label_1"
      ]
    }
  }
}

snooze_messages

Tool

Hides messages from show_inbox until until (an ISO time with a UTC offset, within a year). Local to Inbox Triage: nothing changes in the mail app. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
until string Optional ISO time with a UTC offset to bring the messages back, e.g. 2026-09-28T09:00:00-05:00. Within a year.
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "snooze_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ],
      "until": "2026-10-12T09:00:00-05:00"
    }
  }
}

unsnooze_messages

Tool

Clears a snooze so the messages show in show_inbox again. Pass items (inboxId and messageId per message) or sender. VIP mail is skipped in bulk and needs the person's confirmation one at a time. Every change returns an undoId. Not spam: that is propose_mark_spam then confirm_mark_spam.

Inputs

NameTypeRequiredDescription
items object[] Optional Rows to act on, from show_inbox: inboxId and messageId.
sender object Optional Instead of items: every message from this sender still in the inbox
vipConfirmed boolean Optional true only after the person agreed in chat to act on this one VIP message
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "unsnooze_messages",
    "arguments": {
      "items": [
        {
          "inboxId": "inbox_lx2k9a1b",
          "messageId": "18f3a2b4c5d6e7f8"
        }
      ]
    }
  }
}

inbox_zero_start

Tool

Starts the daily pass. Takes the triage lease and returns the next 10 messages that need the person, numbered, VIPs first, then people, then the rest, each with a suggested action and reason, and a batchId. The daily pass covers mail since the inbox was connected; catchUp:true works the backlog instead, mail that was there when you connected. ask:true asks the person in their app (hosts with form prompts); askedInApp says whether they answered. Clients that cannot ask get a decideUrl, a 30-minute page where the signed-in owner decides the batch.

Inputs

NameTypeRequiredDescription
agentLabel string Optional The label you already hold the triage lease under, if any. Default inbox_zero.
inbox string Optional Inbox name or id; leave empty for all inboxes
catchUp boolean Optional Work through the mail from before the inbox was connected, which the daily pass leaves out. Default false.
ask boolean Optional Ask the person in their app about the returned batch (hosts with form prompts only). Default false.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "inbox_zero_start",
    "arguments": {}
  }
}

inbox_zero_decide

Tool

Applies decisions to a batch. Send the batchId back (a stale one is refused) with { n, action, until, reason } per row (archive, trash, snooze, star, label, leave, handled, reply), or rules over every undecided row. Returns the next batch, undoIds for each change, and draft hints for reply rows. handled also marks the message read. Never sends.

Inputs

NameTypeRequiredDescription
batchId string Optional The batchId of the list the person is answering
decisions object[] Optional
confirmToken string Optional When rules would archive or trash more than 25 messages, the first call returns a preview and moves nothing; repeat the same call with its confirmToken after the person agrees.
rules object[] Optional Bulk rules over ALL undecided rows, not just the batch; VIP rows are skipped
ask boolean Optional Ask the person in their app about the returned batch (hosts with form prompts only). Default false.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "inbox_zero_decide",
    "arguments": {}
  }
}

inbox_zero_wait

Tool

Holds (waitSeconds up to 45) until the person has decided the batch on the decideUrl page. Changes nothing itself.

Inputs

NameTypeRequiredDescription
waitSeconds number Optional Seconds to hold for the page decision. Default 30.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "inbox_zero_wait",
    "arguments": {}
  }
}

inbox_zero_stop

Tool

Ends the inbox zero session, releases the lease and returns a one-line summary.

Inputs

No inputs.

Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "inbox_zero_stop",
    "arguments": {}
  }
}

run_cleanup

Tool

Archives duplicate automated notifications, calendar replies older than 5 days, unread newsletters older than the person's newsletter age (default 14 days, defaults.cleanup.newsletterDays), and shipping updates for orders that have been delivered (the Delivered message stays), one undo for the whole run. Off until the person turns on defaults.cleanup.auto; until then it only lists what it would archive. With staleUnreadDays (7-365) it also archives unread automated mail older than that.

Inputs

NameTypeRequiredDescription
inbox string Optional Inbox name, inbox id, or leave empty for all inboxes
dryRun boolean Optional true to list what would be archived without archiving anything.
staleUnreadDays number Optional Also archive unread automated mail older than this many days. Off unless given.
confirmToken string Optional When a run would archive more than 25 messages, the first call returns a preview and archives nothing; repeat the same call with its confirmToken after the person agrees.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "run_cleanup",
    "arguments": {}
  }
}

begin_triage

Tool

Takes the per-inbox lease before a pass that changes mail.

Inputs

NameTypeRequiredDescription
inboxId string Required Inbox id from list_inboxes.
agentLabel string Required Short human-readable label identifying this agent/session, e.g. "claude-desktop" or "nightly-cron". Required.
force boolean Optional true to skip the cadence soft-check. Pass it only after the human explicitly asks to triage now.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "begin_triage",
    "arguments": {
      "inboxId": "inbox_lx2k9a1b",
      "agentLabel": "nightly-cleanup"
    }
  }
}

heartbeat_triage

Tool

Extends the lease. Call it about every 2 minutes.

Inputs

NameTypeRequiredDescription
inboxId string Required Inbox id from list_inboxes.
agentLabel string Required The same stable name you began the pass with.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "heartbeat_triage",
    "arguments": {
      "inboxId": "inbox_lx2k9a1b",
      "agentLabel": "nightly-cleanup"
    }
  }
}

end_triage

Tool

Releases the lease and records a summary.

Inputs

NameTypeRequiredDescription
inboxId string Required Inbox id from list_inboxes.
agentLabel string Required The same stable name you began the pass with.
summary string Optional Short human-readable summary of what this pass did, e.g. "archived 12 promos, left 2 VIP emails for review".
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "end_triage",
    "arguments": {
      "inboxId": "inbox_lx2k9a1b",
      "agentLabel": "nightly-cleanup"
    }
  }
}

get_triage_activity

Tool

Last pass and current lease for one inbox or all.

Inputs

NameTypeRequiredDescription
inboxId string Optional Inbox id from list_inboxes.
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_triage_activity",
    "arguments": {}
  }
}