MailMoo

Tool reference

Every tool the MCP server exposes, what it does, and the permissions a key needs to reach it.

Every tool the MCP server exposes. A key that lacks a tool's permissions cannot reach it, and a tool that gathers several things returns the parts the key is allowed to see rather than failing outright.

ToolWhat it doesEffectPermissions
mailmoo_inbox_list_unreadConversations with unread messagesReadRead inbox
mailmoo_triage_listWhat needs attention, in priority orderReadRead inbox
mailmoo_inbox_read_conversationRead the messages exchanged with a leadReadRead inbox
mailmoo_inbox_read_conversationsRead conversations with several leadsReadRead inbox
mailmoo_campaigns_searchFind campaignsReadRead campaigns
mailmoo_campaign_get_contextGet everything about one campaignReadRead analytics, Read campaigns
mailmoo_campaigns_compareCompare campaign performance and messagingReadRead analytics, Read campaigns
mailmoo_workspace_get_summarySummarize workspace performanceReadRead analytics
mailmoo_campaign_set_stateStart or pause a campaignReaches a personTurn on campaigns
mailmoo_campaign_update_messageEdit a campaign's outreach copyWriteWrite campaigns
mailmoo_leads_searchSearch leadsReadRead CRM, Read leads
mailmoo_leads_set_sequence_statePause or resume leads in a sequenceWriteWrite campaigns
mailmoo_lead_get_contextGet everything known about a leadReadRead CRM, Read inbox, Read leads
mailmoo_lead_updateUpdate a lead's pipeline positionWriteChange tags, Read CRM, Read leads, Update pipeline status
mailmoo_lead_manage_noteWrite, edit, or remove a note on a personWriteManage notes
mailmoo_lead_manage_taskCreate or change a task on a leadWriteManage tasks
mailmoo_person_searchSearch peopleReadRead CRM
mailmoo_person_get_contextGet everything known about a personReadRead CRM
mailmoo_company_searchSearch companiesReadRead CRM
mailmoo_company_get_contextGet everything known about a companyReadRead CRM
mailmoo_blocklist_listList the blocklistReadRead CRM
mailmoo_blocklist_addAdd to the blocklistWriteManage blocklist
mailmoo_blocklist_removeRemove blocklist entriesWriteManage blocklist
mailmoo_blocklist_add_recordBlock a person or companyWriteManage blocklist
mailmoo_prospects_searchFind new people who are not in the workspace yetReadRead leads
mailmoo_prospects_add_to_campaignAdd new prospects to a campaignWriteWrite campaigns
mailmoo_social_get_limitsCheck a sender profile's daily limitsReadRead inbox
mailmoo_social_get_postRead a social post, and optionally the people who engaged with itRead, spends allowanceRead inbox
mailmoo_social_list_user_postsList a profile's recent postsReadRead inbox
mailmoo_inbox_send_messageSend a message to a leadReaches a personSend messages

Effects

Read costs nothing and changes nothing. Well-behaved clients run these without asking.

Read, spends allowance changes nothing in your workspace but uses part of a connected account's daily search budget, which does not refill until the next day. Annotated as not read-only for that reason.

Write changes something in your workspace and can be undone.

Reaches a person sends a message or starts a campaign that will. Nothing takes those back. Clients are told these are destructive, and should confirm before running one.

What each tool needs

mailmoo_inbox_list_unread

Conversations containing messages nobody has opened yet, newest first, with the unique unread-lead count. This is the 'what came in' view. For deciding what to work on next, prefer triage_queue, which ranks by what actually needs doing rather than by what is unopened.

Needs: Read inbox.

mailmoo_triage_list

The triage queue: every lead that needs something from you, already ranked. Deals stalled mid-evaluation come first (existing deals are the most important to protect), then due tasks, then leads waiting on a reply, then dates you set, then leads that have gone quiet. Start here when deciding what to work on. Each item says which bucket it is in and why.

Needs: Read inbox.

mailmoo_inbox_read_conversation

The full message history with one lead, oldest first. Read this before replying, so the response follows the conversation rather than starting cold.

Needs: Read inbox.

mailmoo_inbox_read_conversations

Message history for several leads at once (up to 15), truncated to the most recent messages. Use this to compare how conversations actually go, rather than opening them one by one. A lead with no conversation is returned as an error on that row instead of failing the whole call.

Needs: Read inbox.

List campaigns in the workspace, newest first, optionally filtered by name or by whether they are currently sending. Use this before any tool that needs a campaignId.

Needs: Read campaigns.

mailmoo_campaign_get_context

The campaign's settings, the sequence inside it, and how it is performing, in one call. Use this to answer questions about a campaign rather than fetching the pieces separately. Also returns mergeFields: the personalization variables this campaign's messages may use, which campaign_update_message validates against.

Needs: Read analytics, Read campaigns.

mailmoo_campaigns_compare

Metrics and outreach copy for several campaigns in one call, so you can compare what the top performers say and how they convert. Omit campaignIds to take the highest-reply-rate campaigns. Copy is truncated; this does not return per-lead rows.

Needs: Read analytics, Read campaigns.

mailmoo_workspace_get_summary

How the workspace did over a time window, in one call. Returns connection requests and acceptance rate, leads contacted, replies and reply rate, meetings booked, and video views when the workspace has rendered a video. Lists every campaign that sent, was replied to, or booked a meeting in the window (quiet campaigns are omitted). Also returns how many conversations are unread and how many need a reply. Defaults to the last 7 days and includes the previous window of the same length. Pass nextCursor back as cursor when truncated is true. Counts only: no lead names and no message text. Use this instead of opening campaigns one by one when asked how the workspace or the week went.

Needs: Read analytics.

mailmoo_campaign_set_state

Starts a campaign's sequence, or pauses it. STARTING A CAMPAIGN BEGINS MESSAGING REAL PEOPLE and cannot be undone for messages already sent. Confirm with the user before starting one. Pausing is always safe. Starting requires an active subscription and a sequence that passes its readiness checks; if it does not, the error says what to fix.

Needs: Turn on campaigns.

mailmoo_campaign_update_message

Rewrites the message on one step of a campaign's sequence, and the variants under it. Get the step id from campaign_get_context, which returns the sequence. THE CAMPAIGN MUST BE PAUSED: editing a running one is refused, so pause it first with campaign_set_state and confirm with the user before turning it back on. Only the fields you send change; the step's send condition, attachments and timing are untouched. 'variants' is the exception: it replaces the whole list, so include every variant you want to keep. To personalize, use a merge field: {{First Name | ""}}, with the variable's exact display name and a fallback. campaign_get_context returns mergeFields, the names this campaign accepts. Use one from that list, because a name that is not on it is rejected. Never write a placeholder as [first name] or <first name>; those are not merge fields and send to the lead literally.

Needs: Write campaigns.

Search leads that already exist in the workspace (CRM), or list/search the leads in one campaign. Omit campaignId for the whole workspace; pass campaignId to stay inside that campaign. This does not find new people and does not enrich them. query is a search box: it matches first name, last name, full name, email, company, phone, or social profile URL, not industry, job title, or sequence status. For those, use the named field filters (firstName, lastName, company, jobTitle, industry, sequenceStatus), which compile to the same advanced filters as the lead table (at most 4 of those at once). pipelineStage and tag are separate and do not count toward that limit. Each page returns identity fields, job title, Oracle score, lead-fit score, sequence status, the assigned sender on leadSequence.sdrProfile, pipeline stage, timestamps, and nextCursor when more remain. Pass nextCursor back as cursor to fetch the next page. The full variables list is omitted unless includeVariables is true, because a lead can have fifty variables, some of them long text. Use this before any tool that needs a leadId.

Needs: Read CRM, Read leads.

mailmoo_leads_set_sequence_state

Pauses or resumes the sequence for specific leads, one or many (up to 100). Pausing stops further automated steps for those leads without cancelling pending work or completing the sequence, so they keep their place. Resuming puts paused leads back in the sending queue. This does not start a campaign and does not message anyone who was not already enrolled. Confirm which leads before pausing many.

Needs: Write campaigns.

mailmoo_lead_get_context

The lead's details, what has happened with them, and whether a conversation is already open. Call this before writing to a lead, so the message reflects the history rather than starting cold. A lead is one campaign's enrollment of a person, and the same person may be enrolled in several. person carries their other campaigns, so you can tell 'never contacted' apart from 'already talking to us somewhere else'.

Needs: Read CRM, Read inbox, Read leads.

mailmoo_lead_update

Move a lead to a different pipeline stage, change its tag, or set when to follow up. Stages and tags are given by name, not by ID. Only the fields you supply are changed.

Needs: Change tags, Read CRM, Read leads, Update pipeline status.

mailmoo_lead_manage_note

Notes are free text about the human, not one campaign enrollment. Creating with a leadId still works: the note is stored on that lead's person. Use 'update' and 'delete' with the noteId returned when it was created.

Needs: Manage notes.

mailmoo_lead_manage_task

Tasks are things a person still needs to do about a lead, with an optional due date. Use 'create' with a leadId, or the other actions with the taskId returned when it was created.

Needs: Manage tasks.

Find people in the workspace. A person is a human, not a campaign membership: one row however many campaigns they are enrolled in, with enrollments listing those campaigns and company naming where they work. Use this when the question is about a human ('have we spoken to anyone at Acme', 'who is Dana'), and use mailmoo_leads_search when the question is about a campaign's list. Returns nextCursor when more remain.

Needs: Read CRM.

mailmoo_person_get_context

One human: their fields, the companies they are attached to, every campaign they are enrolled in, and their notes and tasks. Prefer this over reading each enrollment separately: the campaigns disagree about nothing here, because the stage, the follow-up date and the close reason all belong to the person rather than to any one campaign.

Needs: Read CRM.

Find companies in the workspace, with how many people are attached to each. Use this to answer questions about an account rather than a contact ('are we working Acme', 'who owns that account'). For the people inside one company, follow up with mailmoo_company_get_context.

Needs: Read CRM.

mailmoo_company_get_context

One account: its fields, every campaign enrollment that targeted it, and notes recorded against the company itself rather than against one contact. Read this before messaging anyone there, so a second approach to the same account knows what the first one did.

Needs: Read CRM.

mailmoo_blocklist_list

Who must never be contacted. Each entry is a social profile URL, an email, a company page, or a domain. A domain blocks everyone there, including people not imported yet. blockedPeople and blockedCompanies count records in the workspace that currently match. Returns nextCursor when more remain. Categories are competitor, customer, partner, do_not_contact, or a label this workspace made up.

Needs: Read CRM.

mailmoo_blocklist_add

Block social profile URLs, emails, company pages, or domains so they are never contacted. A domain blocks everyone at it, including people imported later. Names are refused and returned in invalid instead of failing the request. Matching people and companies are blocked immediately and their running sequences stop. Removing the entry is the only way to unblock. Repeating a value already on the list does not duplicate it.

Needs: Manage blocklist.

mailmoo_blocklist_remove

Remove entries. People and companies they were the only match for can be contacted again. Another entry may still block the same record. Pass ids from blocklist_list.

Needs: Manage blocklist.

mailmoo_blocklist_add_record

Block someone already in the workspace. Pass exactly one of personId or companyId. A person is matched by their social profile, or by email when they have none. A company is matched by its website domain, or by its company page. The entry also blocks that identity if it is imported again. Fails when the record has nothing to match on. Running sequences for matches stop.

Needs: Manage blocklist.

Free people preview, from the professional network, for an audience the workspace does not have yet. Returns no contact details and no social profile URLs. Prefer query (e.g. 'fintech founders in the Nordics'): the server maps that to a short keyword plus places, not a stack of seniority/function/industry filters. Company-shaped audiences may run as companies_then_people; check appliedFilters.intent. Returns searchId, appliedFilters, matchCount (people on this preview page, not a total market size), and a small sample. Judge fit from names/titles/companies, then import with prospects_add_to_campaign using that searchId. Use leads_search / person_search for people already in the workspace.

Needs: Read leads.

mailmoo_prospects_add_to_campaign

Sources people from the professional network matching the audience and adds them to a campaign. THIS SPENDS WORKSPACE CREDITS per person (search + profile enrichment + fit scoring) and cannot be undone. Always call prospects_search first, check the sample looks right, then pass searchId from that response so the same search resumes for more people. query/filters work without searchId but re-run from page 1. Duplicates already in the campaign are skipped and not charged. Start with a small maxLeads (default 100, max 500). When credits are the limit, pass fillToBudget. Enrichment beyond this import path is not available over MCP.

Needs: Write campaigns.

mailmoo_social_get_limits

Returns remaining daily sending allowance and daily search allowance for connected sender profiles. Call this before sending a message or pulling post engagement. Remaining 0 means wait until tomorrow or use another sender. Pass senderProfileId to inspect one profile. Omit it to list every sender profile with a connected account, which also discovers IDs for the other social tools.

Needs: Read inbox.

mailmoo_social_get_post

Fetches a post by URL. By default returns only the post, which is cheap. Naming 'commenters' or 'reactors' additionally pulls the people who engaged, and EACH source spends part of the connected account's daily search allowance, which does not refill until tomorrow. Check remaining first with social_get_limits if you are about to spend allowance. Those people are not added to a campaign. Prefer 'commenters': someone who wrote a reply showed far more intent than someone who tapped a reaction, so the same allowance buys better leads. Ask for both only when you need volume more than quality.

Needs: Read inbox.

mailmoo_social_list_user_posts

Recent posts published by one profile, most recent first. Starts from a person rather than a post: use it to find something worth reading, then social_get_post to read it.

Needs: Read inbox.

mailmoo_inbox_send_message

Send a direct message to a lead through a connected social account. This contacts a real person and cannot be undone.

Needs: Send messages.

On this page