Tool reference

Every tool the MCP server exposes, with arguments and return shapes.

Names and arguments are identical across MCP, the REST API, and the SDKs. What a call can reach is decided by the key it was made with.

Email

send_email

Sends markdown email. If reply_to_message_id references a message this mailbox received, the send is classified as a reply: no unsubscribe footer, same thread. Otherwise it is a cold send, which carries an unsubscribe link and is subject to the duplicate-content and velocity tripwires. Both draw down the same daily allowance.

Arguments

to string[] required
Recipient addresses.
cc string[]
Copied recipients.
subject string required
body string required
Markdown, delivered as both text and HTML.
style "plain" | "flat" | "card"
How it looks: "plain" (bare, like a person's reply), "flat" (the words and your footer on one background), or "card" (the same on a sheet, like a receipt). Omitted lets the mailbox decide, and a reply defaults to plain.
reply_to_message_id string
A message this mailbox received. Threads the send and classifies it as a reply.
attachments Attachment[]
{ filename, content_type, content_base64 }.
track_opens boolean
Off by default.
send_at string
ISO timestamp, up to 30 days out. Books the send instead of making it: everything is checked when it goes, not now.

Returns{ status: "sent" | "held" | "scheduled" | "rejected" }, with messageId, pendingId, scheduled_id, or reason and retryAfter.

list_scheduled

Sends this agent has booked and not yet made, soonest first. Only what is still coming: one that has gone is an ordinary sent message.

Arguments

limit number
Up to 100. Defaults to 20.

Returns{ scheduled: [{ scheduled_id, subject, to, send_at, booked_at }] }

cancel_scheduled

Calls a booking off. Refused once the runner has taken it, with the status it reached, so the next step is reading what became of it rather than retrying.

Arguments

scheduled_id string required

Returns{ cancelled: true } or { error: "too_late", status, message_id?, pending_id? }

reply_all

Replies keeping the whole audience: the original sender in To, the other recipients in Cc, your own address dropped. Threading is preserved, so it counts as a reply.

Arguments

message_id string required
Id of a message in this mailbox.
body string required
attachments Attachment[]
track_opens boolean

ReturnsSame shape as send_email.

forward_email

Forwards a message. Wrapped mode keeps headers and attachments intact. Forwarding to someone who has not written to you is a cold send.

Arguments

message_id string required
Id of a message in this mailbox.
to string[] required
body string
Your note above the forwarded mail.
mode "inline" | "wrapped"
Inline quotes the original the way a person forwards mail. Wrapped attaches it untouched as a .eml. Defaults to inline.

ReturnsSame shape as send_email.

get_thread

Every message in a conversation at once, oldest first. Use this instead of paging list_messages when you need full context before replying.

Arguments

thread_id string required

ReturnsThread with all messages.

get_attachment

Downloads one attachment, base64 encoded.

Arguments

message_id string required
Id of a message in this mailbox.
filename string required
As listed by read_message.

Returns{ filename, content_type, size, content_base64 }

list_messages

Lists messages newest first with sender, subject, snippet, unread flag, and spam verdict.

Arguments

unread_only boolean
thread_id string
Restrict to one conversation.
include_archived boolean
Archived mail is left out by default.
limit number
Maximum results. Defaults to 25.

ReturnsMessage summaries.

archive_message

Marks a message dealt with so it drops out of list_messages. It stays searchable and readable by id.

Arguments

message_id string required
Id of a message in this mailbox.
archived boolean
Defaults to true. Pass false to bring it back.

Returns{ id, archived_at }

mark_unread

Puts a message back in the unread pile, which is how you flag something for a human after reading it.

Arguments

message_id string required
Id of a message in this mailbox.
unread boolean
Defaults to true.

Returns{ id, unread }

read_message

Returns the full message with body and headers, and marks it read.

Arguments

message_id string required
Id of a message in this mailbox.

ReturnsFull message.

search_inbox

Ranked full-text search over subjects, senders, and full bodies. Returns highlighted excerpts.

Arguments

query string required
Websearch syntax: quoted phrases, OR, -exclusions.
limit number
Maximum results. Defaults to 25.

ReturnsRanked hits with excerpts.

wait_for_reply

Blocks until a new message arrives in the thread or the timeout elapses. Poll in a loop for longer waits.

Arguments

thread_id string required
timeout_seconds number
Up to 300. Defaults to 60.

ReturnsThe new message, or { timed_out: true }.

get_mailbox_info

The mailbox address, plan, quotas, sends left today, usage today, whether sending is unlocked, and whether this agent is paused and what it replies while it is.

Takes no arguments.

ReturnsMailbox status object.

Identity and filtering

get_identity

Your handle, display name, description, inbound filter mode, and every filter rule.

Takes no arguments.

ReturnsIdentity with rules.

update_identity

Changes your own presentation and how inbound mail is filtered. Omitted fields are unchanged.

Arguments

display_name string
description string
filter_mode "blacklist" | "whitelist"

ReturnsThe updated identity.

set_mail_rule

Allows or blocks a sender. An exact-address rule beats a domain rule, so you can block a domain and still let one person through. Setting the same match and value twice updates the action.

Arguments

match "exact_email" | "domain" required
value string required
An address, or a bare domain.
action "allow" | "block" required

ReturnsThe stored rule.

delete_mail_rule

Removes a filter rule.

Arguments

rule_id string required

Returns{ deleted: boolean }

list_identities

The other agents you can see. Identities are hidden from each other until access is granted, so this is usually just you.

Takes no arguments.

ReturnsVisible identities.

Contacts

lookup_contact

Reverse lookup: find out who just wrote to you before deciding how to answer. Exact match first, then partial. Each hit carries the facts other agents remembered about that person.

Arguments

query string required
An email address or phone number.
limit number
Maximum results. Defaults to 25.

ReturnsContacts with channels and memories.

search_contacts

Full-text search over names, company, job title, and notes.

Arguments

query string required
Websearch syntax: quoted phrases, OR, -exclusions.
limit number
Maximum results. Defaults to 25.

ReturnsRanked contacts.

get_contact

One contact in full, with every channel and all remembered context.

Arguments

contact_id string required
Contact id.

ReturnsFull contact.

create_contact

Adds someone to the workspace address book. At least one name field is required.

Arguments

given_name string
family_name string
preferred_name string
company_name string
job_title string
channels Channel[]
{ kind: "email" | "phone", value, label? }. Passing this replaces the whole list.
domains string[]
Domains that belong to this company.
notes string

ReturnsThe created contact.

update_contact

Omitted fields keep their value.

Arguments

contact_id string required
Contact id.
given_name string
family_name string
preferred_name string
company_name string
job_title string
channels Channel[]
{ kind: "email" | "phone", value, label? }. Passing this replaces the whole list.
domains string[]
Domains that belong to this company.
notes string

ReturnsThe updated contact.

delete_contact

Deletes a contact and everything remembered about them.

Arguments

contact_id string required
Contact id.

Returns{ deleted: true }

remember_about_contact

Saves a durable fact. It surfaces on every later lookup of that contact, including lookups by other agents.

Arguments

contact_id string required
Contact id.
fact string required
A preference, a commitment you made, a detail worth recalling.
message_id string
The message the fact came from.

ReturnsThe stored memory.

find_duplicate_contacts

Pairs that look like the same person: they share an email or phone number, or carry the same name.

Arguments

limit number
Maximum results. Defaults to 25.

ReturnsCandidate pairs with the reason.

merge_contacts

Folds a duplicate into the contact you keep. The survivor holds on to its own fields and gains the other one channels, remembered facts, and anything it was missing; notes from both are kept.

Arguments

survivor_id string required
The contact you keep.
loser_id string required
Deleted once merged.

ReturnsThe surviving contact.

import_vcards

Imports vCards, for example an export from Apple Contacts or Google Contacts. A bad card is skipped and reported without sinking the batch.

Arguments

vcard string required
RFC 6350 text, up to 1000 cards per call.

Returns{ imported, failed[], contact_ids[] }

export_vcard

Exports one contact as an RFC 6350 vCard.

Arguments

contact_id string required
Contact id.

ReturnsvCard text.

export_all_vcards

Exports the whole address book as one vCard stream, ready to write to a .vcf file. Company contacts carry KIND:org so they come back as companies, not people.

Takes no arguments.

ReturnsvCard text.

import_contacts_csv

Turns pasted text into contacts. Common column names are understood (email, first name, last name, name, company, title, phone, notes). A row whose email already belongs to a contact reuses that contact, so one person can sit on several lists. Rows with no email or phone are skipped and reported.

Arguments

csv string required
Pasted CSV with a header row, a headerless CSV, or one address per line ("Name <addr>" works). Up to 5000 rows.
list_name string
Put every imported contact on this list; created if it does not exist.
list_id string
Or an existing list by id.

Returns{ created, matched_existing, added_to_list, list_id, columns_understood, skipped[], contact_ids[] }

list_contact_lists

Every list in the workspace with its member count. Lists group people for a purpose: sales prospects, press, customers.

Takes no arguments.

ReturnsLists with member_count.

get_contact_list

The list and a page of its members with channels and recent remembered facts. Work a list one person at a time: read them, write them a message of their own, remember what you learned. There is no send-to-list.

Arguments

list_id string required
limit number
Up to 200 per page. Defaults to 100.
offset number
Page with next_offset until it is null.

ReturnsList, member_count, next_offset, members[].

create_contact_list

An empty list.

Arguments

name string required
Unique per workspace, case-insensitively.
description string

ReturnsThe list.

update_contact_list

Renames a list or changes what it is for.

Arguments

list_id string required
name string
description string

ReturnsThe list.

delete_contact_list

Removes the grouping. The contacts stay in the address book.

Arguments

list_id string required

Returns{ deleted }

add_to_contact_list

Puts existing contacts on a list. Already-members are left alone.

Arguments

list_id string required
contact_ids string[] required
Up to 1000.

Returns{ added }

remove_from_contact_list

Takes contacts off a list without deleting them.

Arguments

list_id string required
contact_ids string[] required

Returns{ removed }

Notes

list_notes

Notes you can read, most recently updated first.

Arguments

limit number
Maximum results. Defaults to 25.

ReturnsNote summaries.

search_notes

Full-text search across titles and bodies, with highlighted excerpts.

Arguments

query string required
Websearch syntax: quoted phrases, OR, -exclusions.
limit number
Maximum results. Defaults to 25.

ReturnsRanked hits with excerpts.

read_note

The full note body.

Arguments

note_id string required
Note id.

ReturnsFull note.

create_note

Writes into shared workspace context. You can always read back your own notes.

Arguments

title string
body string required
Up to 100,000 characters.

ReturnsThe created note.

update_note

Omit a field to keep it.

Arguments

note_id string required
Note id.
title string
Pass an empty string to clear it.
body string

ReturnsThe updated note.

delete_note

Deletes a note you can access.

Arguments

note_id string required
Note id.

Returns{ deleted: true }

Knowledge

What the workspace has told its agents about the company: a written brief, crawled websites, single pages, and pasted text, all searchable. /docs/knowledge is the guide.

get_knowledge_summary

Read once before writing: the workspace brief, every indexed source with its status, and a table of contents. Facts come from search_knowledge.

Takes no arguments.

Returns{ brief, sources, pages, total_pages }

search_knowledge

Full-text search across crawled sites, pages, and pasted text. Passages come back in full with the page they are from.

Arguments

query string required
Websearch syntax: quoted phrases, OR, -exclusions.
limit number
Up to 25. Defaults to 8.

Returns{ hits: [{ page_id, page_url, page_title, heading, body, rank }] }

read_knowledge_page

A whole indexed page, when a passage is not enough.

Arguments

page_id string required

Returns{ id, url, title, content, fetched_at }

list_knowledge_sources

Every source with status, page count, and last fetch time.

Takes no arguments.

ReturnsSources.

add_knowledge_source

Crawl a whole site (same domain, robots.txt honoured, up to the plan allowance), fetch one page, or store pasted text. Sites and pages index in the background.

Arguments

kind "site" | "page" | "text" required
url string
For site and page. A bare domain means https.
body string
For text. Up to 200,000 characters.
title string

ReturnsThe source, with status.

refresh_knowledge_source

Fetch a site or page again now. Sources are refreshed weekly on their own.

Arguments

source_id string required

Returns{ id, status }

delete_knowledge_source

Removes a source and every page indexed from it.

Arguments

source_id string required

Returns{ deleted: true }

Disposable inboxes

Throwaway addresses for signup and verification flows. They live on a domain kept apart from every sending domain, and they can only receive, so nothing here can put mail on the wire. /docs/verification-codes is the guide.

create_temp_address

Creates a disposable address that receives mail for a short time and is then deleted along with everything it received. For signup and verification flows: register somewhere, catch the confirmation, read the code. Receive-only, and on a domain kept separate from your sending domains.

Arguments

ttl_seconds number
Up to 86400. Defaults to 600.
label string
A note to yourself, so several live addresses stay apart.

Returns{ address, expires_at, receive_only: true, remaining_slots }

wait_for_message

Blocks until mail arrives at one of your disposable addresses. Unlike wait_for_reply this is not tied to a thread, because a disposable inbox has nothing to reply to. Mail that arrived before the call is returned immediately, so triggering the email first is safe.

Arguments

address string required
timeout_seconds number
Up to 300. Defaults to 120.

ReturnsThe message, or { timed_out: true }.

list_temp_addresses

Your disposable addresses that are still alive, soonest to expire first.

Takes no arguments.

ReturnsAddresses with their labels and expiry.

release_temp_address

Deletes a disposable address and its mail before expiry, freeing a slot against your concurrent limit.

Arguments

address string required

Returns{ released: true }

Vault

list_secrets

Names, types, and tags of the secrets granted to you. No values, so finding the right secret is cheaper than opening one.

Takes no arguments.

ReturnsSecret metadata.

get_secret

Opens a granted secret and returns its value, so an agent can sign in or call an API without a human pasting the credential into the conversation. No key is passed: values are encrypted at rest and decrypted server-side for the agents that were granted them.

Arguments

secret_id string required

Returns{ name, type, secret }

get_totp_code

The current RFC 6238 code for a login secret that carries a TOTP seed, so you can clear a two-factor prompt without a human relaying codes.

Arguments

secret_id string required

Returns{ code, expiresInSeconds }