{"name":"inbox-triage","version":"0.1.1","status":"available","description":"Agent-first email bridge. Syncs the newest ~300 messages per selected folder per inbox for iCloud/IMAP/Microsoft (~40 for Gmail). Gmail/Workspace via OAuth, Outlook.com/Microsoft 365 via OAuth, iCloud or generic IMAP. List/read/create_draft/send_draft/trash_message/label tools over MCP; approve-in-chat send when sendEnabled (IMAP/iCloud/Google); nothing is sent without the human's approval in chat.","mcp":{"stdio":{"command":"node","args":["src/mcp-server.js"]},"streamableHttp":{"url":"https://getinboxtriage.com/mcp","auth":["oauth2.1","bearer-api-key"],"oauth":{"protectedResourceMetadata":"https://getinboxtriage.com/.well-known/oauth-protected-resource/mcp","authorizationServerMetadata":"https://getinboxtriage.com/.well-known/oauth-authorization-server"}}},"restApi":{"baseUrl":"https://getinboxtriage.com/api","auth":"bearer-api-key"},"providers":[{"id":"google","label":"Gmail / Google Workspace","method":"oauth2","configured":true},{"id":"microsoft","label":"Outlook.com / Microsoft 365","method":"oauth2-graph","configured":true},{"id":"icloud","label":"iCloud Mail","method":"imap-app-password","configured":true},{"id":"imap","label":"Generic IMAP","method":"imap-password","configured":true}],"syncWindow":{"gmail":40,"icloud":300,"imap":300,"microsoft":300},"defaultFolders":{"google":["INBOX","SENT","DRAFT"],"microsoft":["inbox","sentitems","drafts"],"icloud":["INBOX","Sent","Drafts"],"imap":["INBOX","Sent","Drafts"]},"features":{"list":true,"read":true,"createDraft":true,"trashMessage":true,"send":true,"sendMode":"approve_in_chat","sendProviders":["imap","icloud","google"],"sendNote":"sendEnabled defaults false. After set_send_enabled: create_draft then send_draft (IMAP/iCloud SMTP; Google users.drafts.send). Microsoft draft-only.","search":"within-window-only","deepSearch":{"status":"coming_soon","mcpTool":null,"note":"Agents search the synced window. load_older_messages extends one folder on demand."},"loadOlderMessages":{"mcpTool":"load_older_messages","restApi":"POST /api/inboxes/:id/load-older","note":"Extends one folder's window past the normal sync window (~40 Gmail / ~300 others), one folder at a time, up to a hard per-folder cap.","maxFolderWindow":1000,"supportedProviders":["google","icloud","imap"],"unsupportedProviders":["microsoft"]},"markAsSpam":{"mcpTool":"mark_as_spam","restApi":"POST /api/inboxes/:id/messages/:messageId/spam","note":"Moves one message to the provider's Spam/Junk mailbox. Spam/Junk is never synced back in."},"unsubscribe":{"mcpTools":["propose_unsubscribe","confirm_unsubscribe"],"note":"One-click List-Unsubscribe (RFC 8058). propose_unsubscribe returns a pending request for the human to approve in chat; confirm_unsubscribe performs exactly one HTTPS POST only after humanApprovedInChat:true. Pending requests expire after ~15 minutes.","supportedProviders":["google","icloud","imap"],"unsupportedProviders":["microsoft"]},"triageProfile":{"mcpTools":["get_triage_profile","update_triage_profile"],"restApi":{"get":"GET /api/triage-profile","update":"PATCH /api/triage-profile"},"note":"Account-level triage prefs (cadence, junk rules, VIP people/domains, quiet hours) with sparse per-inbox overrides, shared by every connected agent. VIP addresses/domains are never-auto: ask the human first, and never archive, label as junk, or unsubscribe automatically."},"triageCoordination":{"mcpTools":["begin_triage","heartbeat_triage","end_triage","get_triage_activity"],"restApi":{"begin":"POST /api/inboxes/:id/triage/begin","heartbeat":"POST /api/inboxes/:id/triage/heartbeat","end":"POST /api/inboxes/:id/triage/end","activity":"GET /api/triage-activity or GET /api/inboxes/:id/triage-activity"},"note":"Short-lived per-inbox lease for triage passes that archive, label, mark junk, or batch drafts. Read, list, sync, and get_message never need it. The lease TTL defaults to 8 min (exact value in leaseTtlMs); heartbeat every ~2 min. begin_triage soft-skips within the inbox's cadence window unless force:true (explicit human override). If another agent holds the lease, REST returns HTTP 409.","leaseTtlMs":480000}},"credentialPolicy":"never-accepted-as-tool-argument; human completes OAuth or enters an app or mailbox password on a masked form served by Inbox Triage","demoMode":"inboxes with no stored credential return demo data marked isDemo: true instead of failing","responseShapes":"list_messages pages: limit (default 50, max 200) and offset params, response adds total/hasMore/nextOffset around messages. Page with offset rather than assuming one call returns the whole synced window. Inbox records include connectionStatus and, when true, needsReconnect plus reconnectUrl for the human to re-auth.","pricingUrl":"https://getinboxtriage.com/pricing.json","docsUrl":"https://getinboxtriage.com/docs/agents"}