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.
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
tostring[]required- Recipient addresses.
ccstring[]- Copied recipients.
subjectstringrequiredbodystringrequired- 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_idstring- A message this mailbox received. Threads the send and classifies it as a reply.
attachmentsAttachment[]- { filename, content_type, content_base64 }.
track_opensboolean- Off by default.
send_atstring- 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
limitnumber- 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_idstringrequired
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_idstringrequired- Id of a message in this mailbox.
bodystringrequiredattachmentsAttachment[]track_opensboolean
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_idstringrequired- Id of a message in this mailbox.
tostring[]requiredbodystring- 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_idstringrequired
ReturnsThread with all messages.
get_attachment
Downloads one attachment, base64 encoded.
Arguments
message_idstringrequired- Id of a message in this mailbox.
filenamestringrequired- 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_onlybooleanthread_idstring- Restrict to one conversation.
include_archivedboolean- Archived mail is left out by default.
limitnumber- 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_idstringrequired- Id of a message in this mailbox.
archivedboolean- 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_idstringrequired- Id of a message in this mailbox.
unreadboolean- Defaults to true.
Returns{ id, unread }
read_message
Returns the full message with body and headers, and marks it read.
Arguments
message_idstringrequired- 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
querystringrequired- Websearch syntax: quoted phrases, OR, -exclusions.
limitnumber- 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_idstringrequiredtimeout_secondsnumber- 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_namestringdescriptionstringfilter_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"requiredvaluestringrequired- An address, or a bare domain.
action"allow" | "block"required
ReturnsThe stored rule.
delete_mail_rule
Removes a filter rule.
Arguments
rule_idstringrequired
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
querystringrequired- An email address or phone number.
limitnumber- Maximum results. Defaults to 25.
ReturnsContacts with channels and memories.
search_contacts
Full-text search over names, company, job title, and notes.
Arguments
querystringrequired- Websearch syntax: quoted phrases, OR, -exclusions.
limitnumber- Maximum results. Defaults to 25.
ReturnsRanked contacts.
get_contact
One contact in full, with every channel and all remembered context.
Arguments
contact_idstringrequired- Contact id.
ReturnsFull contact.
create_contact
Adds someone to the workspace address book. At least one name field is required.
Arguments
given_namestringfamily_namestringpreferred_namestringcompany_namestringjob_titlestringchannelsChannel[]- { kind: "email" | "phone", value, label? }. Passing this replaces the whole list.
domainsstring[]- Domains that belong to this company.
notesstring
ReturnsThe created contact.
update_contact
Omitted fields keep their value.
Arguments
contact_idstringrequired- Contact id.
given_namestringfamily_namestringpreferred_namestringcompany_namestringjob_titlestringchannelsChannel[]- { kind: "email" | "phone", value, label? }. Passing this replaces the whole list.
domainsstring[]- Domains that belong to this company.
notesstring
ReturnsThe updated contact.
delete_contact
Deletes a contact and everything remembered about them.
Arguments
contact_idstringrequired- 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_idstringrequired- Contact id.
factstringrequired- A preference, a commitment you made, a detail worth recalling.
message_idstring- 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
limitnumber- 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_idstringrequired- The contact you keep.
loser_idstringrequired- 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
vcardstringrequired- 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_idstringrequired- 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
csvstringrequired- Pasted CSV with a header row, a headerless CSV, or one address per line ("Name <addr>" works). Up to 5000 rows.
list_namestring- Put every imported contact on this list; created if it does not exist.
list_idstring- 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_idstringrequiredlimitnumber- Up to 200 per page. Defaults to 100.
offsetnumber- Page with next_offset until it is null.
ReturnsList, member_count, next_offset, members[].
create_contact_list
An empty list.
Arguments
namestringrequired- Unique per workspace, case-insensitively.
descriptionstring
ReturnsThe list.
update_contact_list
Renames a list or changes what it is for.
Arguments
list_idstringrequirednamestringdescriptionstring
ReturnsThe list.
delete_contact_list
Removes the grouping. The contacts stay in the address book.
Arguments
list_idstringrequired
Returns{ deleted }
add_to_contact_list
Puts existing contacts on a list. Already-members are left alone.
Arguments
list_idstringrequiredcontact_idsstring[]required- Up to 1000.
Returns{ added }
remove_from_contact_list
Takes contacts off a list without deleting them.
Arguments
list_idstringrequiredcontact_idsstring[]required
Returns{ removed }
Notes
list_notes
Notes you can read, most recently updated first.
Arguments
limitnumber- Maximum results. Defaults to 25.
ReturnsNote summaries.
search_notes
Full-text search across titles and bodies, with highlighted excerpts.
Arguments
querystringrequired- Websearch syntax: quoted phrases, OR, -exclusions.
limitnumber- Maximum results. Defaults to 25.
ReturnsRanked hits with excerpts.
read_note
The full note body.
Arguments
note_idstringrequired- Note id.
ReturnsFull note.
create_note
Writes into shared workspace context. You can always read back your own notes.
Arguments
titlestringbodystringrequired- Up to 100,000 characters.
ReturnsThe created note.
update_note
Omit a field to keep it.
Arguments
note_idstringrequired- Note id.
titlestring- Pass an empty string to clear it.
bodystring
ReturnsThe updated note.
delete_note
Deletes a note you can access.
Arguments
note_idstringrequired- 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
querystringrequired- Websearch syntax: quoted phrases, OR, -exclusions.
limitnumber- 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_idstringrequired
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"requiredurlstring- For site and page. A bare domain means https.
bodystring- For text. Up to 200,000 characters.
titlestring
ReturnsThe source, with status.
refresh_knowledge_source
Fetch a site or page again now. Sources are refreshed weekly on their own.
Arguments
source_idstringrequired
Returns{ id, status }
delete_knowledge_source
Removes a source and every page indexed from it.
Arguments
source_idstringrequired
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_secondsnumber- Up to 86400. Defaults to 600.
labelstring- 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
addressstringrequiredtimeout_secondsnumber- 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
addressstringrequired
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_idstringrequired
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_idstringrequired
Returns{ code, expiresInSeconds }