Skip to content
Pathbound DOCS

MCP — Tools Reference

The MCP server exposes more than 100 tools to MCP clients. Tools are grouped here by domain. Each entry shows the tool name, a one-line description, key required parameters, and the MCP annotations (readOnly, destructive, idempotent).

For full parameter shapes including optional fields, the MCP server publishes a schema via the standard MCP tools/list method — most clients (including Claude.ai) display this inline.

Not every tool is listed for every connection. The tools that read and write your own records are always there. A tool that acts in a connected tool (sending email, enrichment, sequences) appears once that integration is connected and a workspace admin has switched its group on under MCP Tools in the dashboard. The streaming and knowledge tools have switches of their own there. Each section below says what its tools need.

Every tool calls an endpoint of the REST API, so anything an agent does here your own code can do with an API key.

ToolDescriptionKey paramsAnnotations
list_contactsList/filter contacts. Supports count_only, fields=summary, behavioral has_event_* filters (contacts who performed a tracked event), and email_verification_state (the deliverability verdict on file, from Emailable or from a data provider that verified the address it found: deliverable/undeliverable/risky/unknown/unverified). Each row returns that verdict as email_verification_state; emailable carries Emailable’s own detail only.(filters)read-only
get_contactFetch a contact with bounded events (20).contact_idread-only
create_contactCreate a contact. Min: email.emailwrite
create_contacts_bulkCreate many contacts in one call. A contact whose email already exists comes back existing and is left unchanged, so the same list can be sent twice. One bad item does not fail the others.contactswrite, idempotent
update_contactUpdate properties on a contact.contact_idwrite, idempotent
get_contact_timelineChronological events for a contact across all sources.contact_idread-only
get_contact_conversationsEmail, Intercom, HubSpot and Instantly threads, plus meetings (tl;dv recordings, Calendly bookings). Pass include_messages=true for bodies and tl;dv AI notes.contact_idread-only
get_meeting_transcriptA tl;dv recording’s transcript, one page at a time (follow next_offset).contact_id, meeting_idread-only
list_meetingsMany tl;dv recordings at once, across customers: filter by company, contact, segment, date, or whether notes exist, and pick which note sections to return.(filters)read-only
list_contact_email_threadsCompact thread list — thread_id, last_message_id, subject.contact_idread-only
list_contact_notesAll notes on a contact.contact_idread-only
create_contact_noteAdd a freeform note (direct, no approval).contact_id, contentwrite
update_contact_noteEdit an existing note.contact_id, note_id, contentwrite, idempotent
delete_contact_noteDelete a note. Irreversible.contact_id, note_iddestructive, idempotent
ToolDescriptionKey paramsAnnotations
list_companiesList/filter companies (search domain, name, industry).(filters)read-only
get_companyFetch a company with up to 25 associated contacts.company_idread-only
get_company_conversationsget_contact_conversations rolled up across every contact at the company, meetings included.company_idread-only
create_companyCreate a company. Min: domain. A free email provider’s domain or one with no dot is refused.domainwrite
create_companies_bulkCreate many companies in one call, matched by domain. An existing company comes back existing and is left unchanged.companieswrite, idempotent
update_companyUpdate properties on a company.company_idwrite, idempotent
list_company_notesAll notes on a company.company_idread-only
create_company_noteAdd a freeform note.company_id, contentwrite
update_company_noteEdit an existing note.company_id, note_id, contentwrite, idempotent
delete_company_noteDelete a note. Irreversible.company_id, note_iddestructive, idempotent

An agent cannot delete a contact or a company. There is no tool for it, and the API refuses such a call from an MCP connection.

A deal is a revenue opportunity linked to a company, a contact, or both. Reading a deal counts as reading the customer it belongs to, so list_deals returns ids only unless asked for more. REST reference: Deals.

ToolDescriptionKey paramsAnnotations
list_dealsList and filter deals. Defaults to fields=ids, which is free.(filters)read-only
get_dealOne deal in full, with compact company and contact blocks for what it is linked to.deal_idread-only
create_dealCreate a deal. Not idempotent: calling it twice creates two deals, unless you pass your own external_deal_id, which makes it update the deal that has it.name, stage, amount, …write
create_deals_bulkCreate many deals in one call. Not idempotent either: give each item an external_deal_id to make an import safe to repeat (an item whose id exists updates that deal).dealswrite
update_dealMove a deal between stages, revise the amount, or mark it won or lost. Only the fields passed change. Pass null to unlink it from its company or contact.deal_idwrite, idempotent
delete_dealPermanently delete a deal. The agent must confirm with the user first, naming the deal and its amount.deal_iddestructive, idempotent
list_deal_notesAll notes on a deal, newest first.deal_idread-only
create_deal_noteAdd a freeform note to a deal.deal_id, contentwrite
update_deal_noteEdit an existing note.deal_id, note_id, contentwrite, idempotent
delete_deal_noteDelete a note. Irreversible.deal_id, note_iddestructive, idempotent

Tags are free-form labels on contacts, companies and deals. They are lowercased when written, up to 64 characters each and 50 per record. Tagging is free at any volume. REST reference: Tags.

ToolDescriptionKey paramsAnnotations
list_tagsThe workspace’s tags with how many contacts, companies and deals carry each. Called before tagging, so an existing tag is reused instead of a near-duplicate.—read-only
add_contact_tagsAdd tags to contacts, by id or to everyone in a saved segment. Adding a tag that is already there changes nothing.tags, then contact_ids or segmentwrite, idempotent
remove_contact_tagsRemove tags from contacts. The contacts are not deleted.tags, then contact_ids or segmentwrite, idempotent
add_company_tagsThe same for companies.tags, then company_ids or segmentwrite, idempotent
remove_company_tagsRemove tags from companies.tags, then company_ids or segmentwrite, idempotent
add_deal_tagsAdd tags to deals, by id.deal_ids, tagswrite, idempotent
remove_deal_tagsRemove tags from deals.deal_ids, tagswrite, idempotent

A segment is a saved, named set of filters over contacts or companies. Its members are worked out when it is read, so it is always current. REST reference: Segments.

ToolDescriptionKey paramsAnnotations
create_segmentSave a segment from typed filters (the same grammar as the list tools’ filters).name, entity, filterswrite
list_segmentsThe workspace’s saved segments: id, handle, type, entity and filters.—read-only
get_segmentOne segment by id or handle, with its member count as of now. Free.segmentread-only
enrich_segmentRun Apollo enrichment over every member of a segment as a background job. Spends Apollo credits. Needs Apollo connected and its Enrichment switch on.segmentwrite, idempotent
broadcast_to_segmentAdd every contact in a segment to a Resend segment, as a background job. It assembles the audience and sends nothing. Needs Resend connected and Manage segments on.segment, resend_segment_idwrite, idempotent
get_jobThe status of a background job: pending, running, succeeded, partial or failed, with progress and a result summary.job_idread-only

Pass a segment’s id or handle as segment to list_contacts, list_companies, aggregate_data and the tag tools to work on its members.

ToolDescriptionKey paramsAnnotations
list_eventsList events with rich filters (by type, text/class/element, visitor, device, platform). Supports count_only, fields=summary.(filters)read-only
get_eventSingle event with associated contact/company.event_idread-only
get_event_typesDistinct event names recorded for the tenant.—read-only
get_event_statsTotal + breakdown by type, domain, day.(filters)read-only
ToolDescriptionKey paramsAnnotations
batch_get_detailsUp to 25 contacts or companies in one call.entity_type, idsread-only
batch_get_activityRecent events for up to 25 contacts in one call.contact_idsread-only
aggregate_dataServer-side group-by on contacts/companies/events. 50+ dimensions.entity, group_byread-only

aggregate_data is the right tool for any “by X, count Y” question. Always prefer it over paginating list tools.

REST reference: Schema, usage and capabilities.

ToolDescriptionKey paramsAnnotations
describe_schemaThe fields that can be filtered and grouped on for contacts, companies or deals, per connected source, with the type and operators of each. Called before using filters, field_filters or group_by.entityread-only
get_usageWhich workspace the connection reaches, how many active profiles it has used this billing cycle and how many remain, and when each connected source last synced.—read-only

Knowledge is the workspace’s own pages about its business: product, pricing, ideal customers, terminology, playbooks, rules for agents. Agents read them before writing for or reasoning about the business. REST reference: Knowledge.

The tools appear when a workspace admin has turned on Read knowledge (MCP Tools → Pathbound → Knowledge), and the two writing tools when Add to knowledge is on as well. Both are off by default. Reads require the knowledge:read scope and writes the opt-in knowledge:write scope.

Every page and every search result carries a trust: pinned (the workspace’s rules, set by an admin), verified (a person saved this version in the app) or unverified. Whatever an agent writes is unverified until a person saves it in the app. An agent can create pages and edit unlocked ones. It can never delete a page, change a locked or pinned page, or lock, pin or verify one.

ToolDescriptionKey paramsAnnotations
list_knowledgeThe workspace’s pages: title, summary, tags and trust. Called once at the start of a task about the business.—read-only
search_knowledgeKeyword search across pages. Returns the matching sections, best first.queryread-only
get_knowledge_pageRead a page, or one section of it. A long page comes back as its opening and an outline, and the agent then reads the sections it needs.pageread-only
save_knowledge_pageCreate a page, or replace the title, summary, tags or whole body of an existing one.slugwrite, idempotent
update_knowledge_sectionReplace one section of a page and leave the rest untouched, or add a new section.page, sectionwrite, idempotent

gmail_send_email sends real email from a Gmail mailbox the calling user connected themselves; agents never send from a teammate’s mailbox. Connecting Gmail is limited to workspace admins, so today only admins’ agents can send through Gmail: each admin connects a default mailbox plus up to five more of their own (Integrations → Gmail), and a mailbox can send once its grant includes gmail.send and a workspace admin turns on Allow agents to send from this mailbox for it. The tool appears when at least one of the user’s mailboxes can send, and its description lists the allowed addresses.

Choose the mailbox with from. Without it, the send uses the default mailbox, or the only mailbox that can send; when several can and none is the default, the call is refused with the list of allowed addresses. A named mailbox that cannot send is refused, never swapped for another. A Gmail thread belongs to one mailbox, so a reply with thread_id has to come from the mailbox that holds the thread. Writes require the actions:write scope and an Idempotency-Key (auto-generated by the MCP server), and every send is logged on the contact timeline with the sending address. REST callers list the same mailboxes with GET /v1/integrations/gmail/senders and pass from to POST /v1/contacts/{contact_id}/send_email.

Sending can also wait. gmail_send_email takes send_at (ISO 8601 with an explicit offset, up to 30 days ahead) to schedule, and gmail_create_draft saves an email without sending it. Both are held by Pathbound, not by Gmail: a draft never appears in the Gmail Drafts folder, and the agent reviews it with gmail_list_outbox (include_body returns the text exactly as it will be sent) before gmail_send_draft sends it, now or at send_at. Drafts expire after 30 days, and gmail_cancel_outbox_email discards a draft or cancels a scheduled email until it is sending. When a scheduled email fires, Pathbound re-checks that the person who asked to send is still a verified member with a valid API key or connector, that the chosen mailbox can still send, and that the contact’s email is unchanged; otherwise the email fails with a reason rather than going out from another mailbox or to another address. Delivery is at most once: if Gmail never answers, the email ends failed with SEND_UNCONFIRMED and is not retried, so check the Sent folder before resending. REST callers use POST /v1/integrations/gmail/outbox (draft: true or send_at), GET /v1/integrations/gmail/outbox, POST /v1/integrations/gmail/outbox/{outbox_id}/send and DELETE /v1/integrations/gmail/outbox/{outbox_id}; send_email itself rejects send_at and draft.

ToolDescriptionKey paramsAnnotations
gmail_send_emailSend one email to a contact from one of your Gmail mailboxes, now or at send_at. thread_id (from list_contact_email_threads) replies within that thread; include_signature appends your saved signature.contact_id, subject, body, from, send_atwrite
gmail_create_draftSave an email as a draft that Pathbound holds (not visible in Gmail). Sends nothing until gmail_send_draft.contact_id, subject, body, fromwrite
gmail_send_draftSend a draft now, or schedule it with send_at. Refused, not rerouted, if the mailbox or the contact’s email changed.outbox_id, send_atwrite
gmail_list_outboxList your drafts and scheduled, sent, failed or canceled emails; include_body returns a draft’s text for review. counts gives the totals, and after reads on from the last email received.status, contact_id, include_body, afterread-only
gmail_cancel_outbox_emailDiscard a draft or cancel a scheduled email before it is sent.outbox_idwrite, destructive

REST reference: Gmail.

These tools act in the workspace’s own Resend account: they manage segments, send one email to a contact, send one of the account’s events for a contact, and create and send broadcasts. They appear when Resend is connected and a workspace admin has switched their group on (MCP Tools → Resend): Manage segments, Send email, Create broadcasts, Send broadcasts and Send events are separate switches. Writes require the actions:write scope and an Idempotency-Key (auto-generated by the MCP server). The REST reference, Resend, says what each switch governs.

ToolDescriptionKey paramsAnnotations
resend_list_segmentsThe Resend account’s segments: id, name and creation date.—read-only
resend_create_segmentCreate a segment in Resend.namewrite
resend_add_contacts_to_segmentAdd up to 25 Pathbound contacts to a Resend segment. A contact that is not in Resend yet is created there.segment_id, contact_idswrite, idempotent
resend_remove_contact_from_segmentRemove one contact from a Resend segment. The contact is not deleted.segment_id, contact_iddestructive, idempotent
resend_delete_segmentPermanently delete a Resend segment. Its contacts are not deleted.segment_iddestructive, idempotent
resend_list_contact_segmentsThe Resend segments a contact belongs to.contact_idread-only
resend_send_emailSend one email to a contact through Resend, from a sender on a domain verified in the account, now or at scheduled_at. The recipient is the contact’s own address.contact_id, from, subject, bodywrite, idempotent
resend_list_contact_emailsThe emails sent to a contact through Pathbound’s Resend tools, newest first: subject, and when each was sent or is scheduled.contact_idread-only
resend_create_broadcastCreate a broadcast addressed to a segment. It does not send.name, segment_id, from, subject, bodywrite
resend_send_broadcastSend or schedule an existing broadcast to its whole segment. It cannot be recalled, and the agent must confirm with the user first.broadcast_iddestructive
resend_list_eventsThe events defined in the Resend account, with the fields each declares.—read-only
resend_send_eventSend one of those events for a contact, which starts the automations built on it in Resend. Resend accepting the event does not mean an email was sent.contact_id, eventwrite, idempotent

To add a whole Pathbound segment to a Resend segment, use broadcast_to_segment under Segments.

These tools appear when Instantly is connected and a workspace admin has switched them on (MCP Tools → Instantly). They require the actions:write scope. REST reference: Instantly.

ToolDescriptionKey paramsAnnotations
instantly_add_leadAdd a person to an Instantly campaign, so that they enter its sending sequence.campaign_id, emailwrite, idempotent
instantly_update_lead_interestSet the interest status of an Instantly lead, for example interested, meeting booked or not interested.lead_email, interest_valuewrite, idempotent

REST reference: Enrichment and prospecting.

These tools are provider-agnostic: you never name a data provider, the workspace’s connected one runs the call, and every response reports which one acted as via. Two providers can run them, Apollo and Hunter, and each spends the tenant’s own credits with that provider. A tool appears when at least one provider is connected and a workspace admin has enabled it for that provider (MCP Tools → Apollo or Hunter). When both are connected and both allow an action, Apollo runs it; to have Hunter run an action, leave Apollo’s toggle for that action off. They also require the enrichment:write scope (opt-in-only; never auto-granted to legacy keys). Whatever they find always lands in the contact graph — identity-resolved, provenance-stamped, taggable, and deliverability-checked — so a prospect found here is the same record every other connected source enriches later. That is the part a single-provider connector cannot do, and it is why these tools are not named after the provider.

A filter no connected provider can express is refused before anything is spent, rather than dropped — a dropped filter widens the search and you pay for the wider result. The same goes for a filter value a provider cannot express exactly: the call is refused with a hint naming what the provider accepts, never run as a wider search.

Three admin toggles cover three kinds of work. Enrichment refreshes records already in Pathbound. People discovery expands an account already in Pathbound (find_people_at_companies). Prospecting (prospect_companies, prospect_people) searches the provider’s whole database by company shape — size, HQ location, keyword tags, technologies in use, active job postings — and saves the matches as lifecyclestage=prospect records, tagged so you can segment, enrich, stream or enroll the batch afterwards. A company is only ever created from a domain; companies the provider returns without one are reported, not saved. People already in the graph with an email are skipped so credits are never spent twice; people saved earlier without a reveal are revealed and linked to their company on a later call.

Job-change signal. Apollo watches the contacts saved in your Apollo team and records when one changes title or employer. Pathbound reads that event on its free saved-record path and writes it onto the contact as job_changed_at, previous_jobtitle and previous_company — with jobtitle and company updated to the new values — plus the tag signal:job-change. Pull the cohort with list_contacts tags_any="signal:job-change", refine with a job_changed_at date filter, save it as a segment, or point a stream at the tag. Prospect-stage contacts are re-checked about every 30 days when a workspace admin enables Refresh prospects under Integrations → Apollo (free, saved records only).

Deliverability. Every result that adds addresses reports deliverability. verified means the provider verified the addresses itself and the verdict is already on each contact (email_verification_state); Hunter does this for every address it finds. queued means Emailable is checking the ones without a verdict in the background. not_connected means there was nothing new to check, or no verifier is connected.

Costs on Apollo. People search is free; revealing a person’s email is ~1 credit. Company search is 1 credit per page (up to 50 companies per call). Company enrichment is ~1 credit per match. Every call is bounded (25 people, 50 companies) and counts against the workspace’s daily interactive Apollo budget. Company search needs an Apollo connection made after 2026-09-11 — reconnect Apollo if the tool reports a missing scope.

Costs on Hunter. Company search is free. People and their emails come together, at 1 credit per company that has matches (up to 10 people), so reveal_emails=false returns nothing and spends nothing. Enriching a contact or a company is 0.2 credit; finding an email for a contact that has none is 1 credit, and only when one is found. credits_consumed is counted from those prices: Hunter bills a repeated search once per billing period, so the real charge can be lower. Calls are bounded the same way (25 people, 50 companies) and count against a daily interactive Hunter budget.

What Hunter cannot express. Hunter has fixed company sizes (1-10, 11-50, 51-200, 201-500, 501-1000, 1001-5000, 5001-10000, 10001+), so an employee range must start and end on those edges. It knows three seniority levels (junior, senior, executive); name specific roles with titles instead. A city needs its country ("Berlin, Germany"). Job postings can be limited to the last 7, 30 or 90 days only: a hiring_posted_after date is applied as the widest of those that fits inside it, and the result note says so. Free-text person keywords and days_in_title_* are not supported, and technology filters need a paid Hunter plan. prospect_people looks inside up to 15 matching companies per call, takes up to 3 people from each, and returns no search_total. A person who has asked Hunter to stop processing their data comes back skipped with the reason claimed_email and is never sent to Hunter again.

ToolDescriptionKey paramsAnnotations
enrich_contactsEnrich existing contacts (email, title, LinkedIn, phone, location). Up to 25 IDs. Apollo: ~1 credit per match. Hunter: 0.2 credit, or 1 to find a missing email.contact_idswrite
enrich_companiesEnrich existing companies (industry, headcount, revenue, founded year). Up to 25 IDs. Apollo: ~1 credit per match. Hunter: 0.2.company_idswrite
find_people_at_companiesAnchored discovery: find people at a company already in Pathbound, reveal emails, and save them as contacts linked to that company. Optional titles/seniorities/departments/locations/keywords, limit (≤25), tags, lifecyclestage. Apollo: free search, ~1 credit per revealed email. Hunter: 1 credit per company with matches.company_idswrite
prospect_companiesProspecting: search for companies by shape (employee_ranges, locations, keywords, technologies, hiring_titles + hiring_posted_after, domains, name) and save them as prospect companies with tags. Returns search_total (the size of the matching universe) and the Pathbound ids to feed find_people_at_companies. Optional enrich runs firmographic enrichment on the new ones. Apollo: 1 credit per search page. Hunter: free.at least one filterwrite
prospect_peopleProspecting: search for people by title/seniority/department and company shape (org_* filters, at least one required), reveal emails, and save them as prospect contacts linked to their employer company, which is created from the reveal’s domain when new. limit (≤25), tags, reveal_emails. Apollo: free search, ~1 credit per revealed email. Hunter: 1 credit per company with matches.titles, org_*write

Engagement actions (Apollo sequences & email)

Section titled “Engagement actions (Apollo sequences & email)”

REST reference: Apollo sequences.

These tools manage Apollo outreach; enrollment and single-email tools send real email through the tenant’s Apollo mailboxes, while sequence creation writes an inactive draft and turning it on is a separate, confirmed step. They appear only when Apollo is connected with a grant that includes the sequence permissions (connections made before September 2026 must be reconnected) and a workspace admin has enabled them (MCP Tools → Apollo → Sequences / Single email). Writes require the actions:write scope and an Idempotency-Key (auto-generated by the MCP server); over REST the engagement reads (GET /v1/integrations/apollo/senders, sequences, sequence-options, contacts/{contact_id}/sequence-activity, scheduled-emails) require actions:write too, since they describe the tenant’s outbound inventory. Every enrollment or send is anchored to a Pathbound contact or segment and recorded on the contact timeline. Engagement (apollo_email_sent, apollo_email_opened, apollo_email_replied, apollo_email_bounced, apollo_sequence_finished, …) is read back from Apollo on a schedule and lands there too.

Two rules hold on every surface. The sending mailbox is chosen explicitly every time — the agent lists the allowed mailboxes, the user confirms one by address, and there is no default; an admin curates the allowed list under Integrations → Apollo (empty = every active mailbox linked in the Apollo team). And Apollo’s safeguards are never overridden: contacts Apollo refuses (already in another sequence, do-not-contact stage, unverified email, …) come back in skipped with the reason. Agents can author automatic-email sequence drafts; Pathbound creates them inactive, and turning one on is a separate apollo_activate_sequence call the agent must confirm with the user (turn it off again with apollo_pause_sequence).

Scheduling and rulesets. A sequence’s sending schedule decides the days and hours Apollo may send its emails. Agents can read the team’s schedules and attach one to a sequence — at creation or afterwards — but the windows themselves are only editable in Apollo (Settings → Sequences → Schedules), which publishes no API for creating or changing a schedule. A sequence ruleset (shared settings applied to a sequence) can be set only when the sequence is created, and Apollo has no endpoint that lists or names rulesets, so apollo_list_sequence_options reports the ids already applied to the team’s sequences alongside the sequences using each one. Omit it and the sequence is created with a blank ruleset, which is Apollo’s own default.

ToolDescriptionKey paramsAnnotations
apollo_create_sequenceCreate an inactive Apollo sequence draft with 1–10 automatic-email steps, ready to send once activated. Optionally takes a schedule_id and a ruleset_id. It does not activate or enroll anyone.name, stepswrite
apollo_activate_sequenceTurn a sequence on: Apollo starts sending its steps to every enrolled contact on the sequence schedule. Requires explicit user confirmation in the same turn.sequence_idwrite
apollo_pause_sequenceTurn a sequence off: every enrolled contact pauses and nothing sends until it is activated again.sequence_idwrite
apollo_list_sequencesThe team’s sequences with stats, plus the sending schedule and ruleset each one runs under; archived hidden by default. Call before enrolling.qread-only
apollo_list_sequence_optionsThe team’s sending schedules — name, time zone and the weekly windows rendered as sending_hours (e.g. “Mon–Fri 8:00–17:00”) — plus the sequence rulesets already in use. Call to answer “when will this send”, and before creating a sequence or changing its schedule.—read-only
apollo_set_sequence_schedulePoint an existing sequence at one of those schedules, changing the days and hours it may send — including for contacts already enrolled. Sends only the schedule field: it never touches steps, owner, copy or on/off state.sequence_id, schedule_idwrite
apollo_list_sendersMailboxes an agent may send from (the allowlist). Call before enrolling or sending a single email and confirm the sender with the user. Available when either Apollo tool is enabled.—read-only
apollo_add_to_sequenceEnroll 1–25 contacts in an existing sequence from a chosen mailbox. start_at enrolls them paused until that time. Contacts are matched or created in Apollo by email (free). Once per contact per sequence.contact_ids, sequence_id, sender_account_idwrite
apollo_add_segment_to_sequenceThe whole-segment version, as a background job (get_job for progress and the per-reason skip breakdown).segment, sequence_id, sender_account_idwrite
apollo_stop_in_sequenceStop (keep history) or remove contacts from a sequence.contact_ids, sequence_id, modewrite
apollo_sequence_activityOne contact’s enrollment records plus Apollo’s activity feed (enrolled, replied, completed, removed…). Meters like get_contact_timeline.contact_idread-only
apollo_send_emailOne email to a contact, now or at send_at (up to 30 days out), from an allowed Apollo mailbox named by sender_account_id. Pathbound holds scheduled sends and issues them through Apollo at the time; Apollo tracks opens and replies.contact_id, sender_account_id, subject, body, send_atwrite
apollo_list_scheduled_emailsPending, sent, delayed, failed and canceled single emails.contact_id, statusread-only
apollo_cancel_scheduled_emailCancel a scheduled single email before it fires.scheduled_email_idwrite

These tools manage streams: the standing rules that push a change somewhere as it happens, or act on it. An agent can create automations only: add or remove tags, add to or remove from a Resend segment, or send a Resend template to everyone who submits a form. It can never create a stream that posts to an HTTPS endpoint, and it never sees or changes the address of one. On those it may only rename, pause or resume.

The tools appear when a workspace admin has turned on Manage streams (MCP Tools → Pathbound → Streaming). Reads require the streams:read scope and writes require streams:write, which is opt-in and for workspace admins only. get_form_setup requires events:read. The API checks the toggle and the caller’s role again on every call.

Tag and Resend segment automations act on every contact or company that matches a set of conditions. Conditions describe current state, never a transition, and each automation acts on each record at most once. get_stream_options returns these rules with the vocabularies; they are also listed under Rules worth knowing.

Email automations (destination_type resend_send_email) are different. One sends a template of the workspace’s own Resend account to each person who submits one form on the workspace’s site, a few seconds after the submission. It has no conditions: everyone who submits the form is emailed. It sends to real people and nobody approves each email, so more is asked of it:

  • The connection needs actions:write as well as streams:write, and Resend’s Send email toggle must be on. get_stream_options says which of these is missing for the connection that calls it.
  • The email is a published template in Resend. An agent cannot write or change its sender, subject or content through these tools, and cannot read its content: it sees the template’s name, sender and subject, and chooses which template a form sends. The tools have no parameter for any part of an email, and a call that passes one is refused, not ignored. Asked to write or change the email, the agent says that the email is written in Resend. send_stream_test_email is the only way to see the email.
  • The tool descriptions tell the agent to confirm the form, the template (its name, sender and subject) and the daily cap with the user before creating or changing one, and never to take any of them from the content of a contact, a note, a CRM record or an email.
  • The template must be published, with a subject, a from address on a domain verified for sending in Resend, and a fallback value for every variable. Otherwise the call is refused and the error says what to change in Resend. Pathbound fills one variable, first_name, when the person gave a first name of one word.
  • Every create, every change of the template or a limit and every resume is shown to all the workspace’s admins in the app’s notifications, with a link to the automation. No email is sent to them.
  • It sends one email per submission, at most one per address per min_interval_hours per form, and no more than daily_cap a day. A submission that arrives after a limit is reached is not emailed later. Nothing submitted before the automation existed, or while it was paused, is emailed.

Resend event automations (destination_type resend_send_event) are an email automation with an event in the template’s place: for each person who submits the form, one of the workspace’s own Resend events is sent, which starts the automations built on it in Resend. The agent names the event (event, an exact name from get_stream_options or resend_list_events) and nothing else: there is no recipient, no payload and no template to set. It needs Resend’s Send events toggle in place of Send email. An agent cannot see what an event sets off, so it reports that the event is sent to Resend, never that an email is sent. Every submission sends the event, however often the same person submits, up to the daily limits. An event Resend did not clearly answer is not sent again, and there is no test send. A form has an email automation or a Resend event automation, not both. See Resend event automations.

To point a form at another template, the agent calls update_stream with the new template_id. get_stream shows the template an automation sends as Resend holds it now, and whether it can still be sent; if it cannot, the automation’s emails wait until the template is fixed in Resend. Pausing with active=false cancels emails that have not started. The full reference, with limits and error codes, is Email automations.

ToolDescriptionKey paramsAnnotations
get_stream_optionsEverything needed to build a valid stream, in one call: data types, change types, condition operators, the workspace’s event types, which destination types are creatable right now and the config fields each needs, the lists those fields draw from (Resend segments, known tags, forms that have received submissions, the published templates of the Resend account), limits, and the rules that are not visible in a schema. For an email automation, creatable is answered for the calling connection, with a reason when it is false. Call it before create_stream or update_stream.—read-only
get_form_setupHow a form on the workspace’s own site sends its submissions to Pathbound, and which forms already do: the URL to post to with the workspace’s id filled in, what the request must hold, a fetch() example, the verified domains, and every form id that has received submissions, with its count for the last 30 days and the id of its email automation when it has one. Same as GET /v1/forms.—read-only
list_streamsThe workspace’s streams: id, name, data type, change type, destination type and label, conditions, filters and active state. Tag and segment automations report enrolled_count. An email automation reports its counters (sent_count, sent_today, failed_count, skipped_count), and its destination_config holds the form, the template (template_id, template_name) and the limits. The list does not say whether the template can still be sent. Destination URLs of HTTPS streams are never returned.page, limitread-only
get_streamOne stream by its id. For an email automation it adds template: the template’s name, sender, subject, reply-to addresses and variables as Resend holds them now, and usable, with a problem that says what to change in Resend when it is false. The template’s content is never returned. It also returns blocked_since while Resend refuses the workspace’s key or the sender.stream_idread-only
preview_stream_matchesCount how many contacts or companies match a condition set right now, without creating anything. Returns counts only, never the records. It does not apply to email automations, which have no conditions.resource_type, conditionsread-only
create_streamCreate an automation. A tag or segment automation takes tags or segment_id, with resource_type, event_type (required) and conditions, and returns estimated_matches. An email automation takes form_id and template_id (the template’s id or alias in Resend), optionally daily_cap and min_interval_hours, and no resource_type, event_type or conditions: a call that sets one is refused, never adjusted. validate_only runs every check and creates nothing; for an email automation it returns the template as Resend holds it and notifies nobody. A Resend event automation takes form_id and event (the event’s exact name in Resend) and optionally daily_cap; it has no min_interval_hours, because it sends for every submission.destination_type, then the fields of that typewrite
update_streamChange a stream. Tag and segment automations: name, event_type, conditions, active. HTTPS streams: name and active only. Email automations: name, active, template_id, daily_cap and min_interval_hours, never the form and never the email’s sender, subject or content. Whichever of them changes, the template is read from Resend again and must be usable as it is then. Resend event automations: name, active, event and daily_cap, never the form.stream_idwrite, idempotent
send_stream_test_emailSend an email automation’s template once, as a person who submitted the form would get it, to the address of the user’s own Pathbound account. It has no recipient parameter, and any argument other than stream_id is refused. A real send: it counts against the workspace’s daily total, not the automation’s cap, and at most 5 can be sent a minute and 20 a day per workspace. On SEND_UNCONFIRMED the email may have been sent, so the inbox is checked before another is sent.stream_idwrite
delete_streamPermanently delete a stream and its history. Recreating a tag or segment automation afterwards applies its action to every matching record again. Deleting an email automation cancels its queued emails; the record of which addresses it emailed is kept, so recreating it for the same form does not email the same people again before min_interval_hours has passed. To stop a stream for a while, use update_stream with active=false.stream_iddestructive, idempotent

The Pathbound MCP server is built on the @modelcontextprotocol/sdk. The same tool list above is exposed via the standard tools/list method — any compliant MCP client can connect via OAuth (interactive) or with a REST API key (headless) and call them. See MCP authentication for both flows.

The source of truth for each tool’s parameters and behavior is the schema the server returns from tools/list.