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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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 |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
waitSeconds |
number | Optional | Seconds to hold for the page decision. Default 30. |
{
"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.
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
inboxId |
string | Required | Inbox id from list_inboxes. |
agentLabel |
string | Required | The same stable name you began the pass with. |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
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". |
{
"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
| Name | Type | Required | Description |
|---|---|---|---|
inboxId |
string | Optional | Inbox id from list_inboxes. |
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_triage_activity",
"arguments": {}
}
}