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.
Contacts
Section titled “Contacts”| Tool | Description | Key params | Annotations |
|---|---|---|---|
list_contacts | List/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_contact | Fetch a contact with bounded events (20). | contact_id | read-only |
create_contact | Create a contact. Min: email. | email | write |
create_contacts_bulk | Create 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. | contacts | write, idempotent |
update_contact | Update properties on a contact. | contact_id | write, idempotent |
get_contact_timeline | Chronological events for a contact across all sources. | contact_id | read-only |
get_contact_conversations | Email, Intercom, HubSpot and Instantly threads, plus meetings (tl;dv recordings, Calendly bookings). Pass include_messages=true for bodies and tl;dv AI notes. | contact_id | read-only |
get_meeting_transcript | A tl;dv recording’s transcript, one page at a time (follow next_offset). | contact_id, meeting_id | read-only |
list_meetings | Many 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_threads | Compact thread list — thread_id, last_message_id, subject. | contact_id | read-only |
list_contact_notes | All notes on a contact. | contact_id | read-only |
create_contact_note | Add a freeform note (direct, no approval). | contact_id, content | write |
update_contact_note | Edit an existing note. | contact_id, note_id, content | write, idempotent |
delete_contact_note | Delete a note. Irreversible. | contact_id, note_id | destructive, idempotent |
Companies
Section titled “Companies”| Tool | Description | Key params | Annotations |
|---|---|---|---|
list_companies | List/filter companies (search domain, name, industry). | (filters) | read-only |
get_company | Fetch a company with up to 25 associated contacts. | company_id | read-only |
get_company_conversations | get_contact_conversations rolled up across every contact at the company, meetings included. | company_id | read-only |
create_company | Create a company. Min: domain. A free email provider’s domain or one with no dot is refused. | domain | write |
create_companies_bulk | Create many companies in one call, matched by domain. An existing company comes back existing and is left unchanged. | companies | write, idempotent |
update_company | Update properties on a company. | company_id | write, idempotent |
list_company_notes | All notes on a company. | company_id | read-only |
create_company_note | Add a freeform note. | company_id, content | write |
update_company_note | Edit an existing note. | company_id, note_id, content | write, idempotent |
delete_company_note | Delete a note. Irreversible. | company_id, note_id | destructive, 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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
list_deals | List and filter deals. Defaults to fields=ids, which is free. | (filters) | read-only |
get_deal | One deal in full, with compact company and contact blocks for what it is linked to. | deal_id | read-only |
create_deal | Create 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_bulk | Create 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). | deals | write |
update_deal | Move 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_id | write, idempotent |
delete_deal | Permanently delete a deal. The agent must confirm with the user first, naming the deal and its amount. | deal_id | destructive, idempotent |
list_deal_notes | All notes on a deal, newest first. | deal_id | read-only |
create_deal_note | Add a freeform note to a deal. | deal_id, content | write |
update_deal_note | Edit an existing note. | deal_id, note_id, content | write, idempotent |
delete_deal_note | Delete a note. Irreversible. | deal_id, note_id | destructive, 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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
list_tags | The 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_tags | Add 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 segment | write, idempotent |
remove_contact_tags | Remove tags from contacts. The contacts are not deleted. | tags, then contact_ids or segment | write, idempotent |
add_company_tags | The same for companies. | tags, then company_ids or segment | write, idempotent |
remove_company_tags | Remove tags from companies. | tags, then company_ids or segment | write, idempotent |
add_deal_tags | Add tags to deals, by id. | deal_ids, tags | write, idempotent |
remove_deal_tags | Remove tags from deals. | deal_ids, tags | write, idempotent |
Segments
Section titled “Segments”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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
create_segment | Save a segment from typed filters (the same grammar as the list tools’ filters). | name, entity, filters | write |
list_segments | The workspace’s saved segments: id, handle, type, entity and filters. | — | read-only |
get_segment | One segment by id or handle, with its member count as of now. Free. | segment | read-only |
enrich_segment | Run Apollo enrichment over every member of a segment as a background job. Spends Apollo credits. Needs Apollo connected and its Enrichment switch on. | segment | write, idempotent |
broadcast_to_segment | Add 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_id | write, idempotent |
get_job | The status of a background job: pending, running, succeeded, partial or failed, with progress and a result summary. | job_id | read-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.
Events
Section titled “Events”| Tool | Description | Key params | Annotations |
|---|---|---|---|
list_events | List events with rich filters (by type, text/class/element, visitor, device, platform). Supports count_only, fields=summary. | (filters) | read-only |
get_event | Single event with associated contact/company. | event_id | read-only |
get_event_types | Distinct event names recorded for the tenant. | — | read-only |
get_event_stats | Total + breakdown by type, domain, day. | (filters) | read-only |
Batch & Aggregate
Section titled “Batch & Aggregate”| Tool | Description | Key params | Annotations |
|---|---|---|---|
batch_get_details | Up to 25 contacts or companies in one call. | entity_type, ids | read-only |
batch_get_activity | Recent events for up to 25 contacts in one call. | contact_ids | read-only |
aggregate_data | Server-side group-by on contacts/companies/events. 50+ dimensions. | entity, group_by | read-only |
aggregate_data is the right tool for any “by X, count Y” question. Always prefer it over paginating list tools.
Schema and usage
Section titled “Schema and usage”REST reference: Schema, usage and capabilities.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
describe_schema | The 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. | entity | read-only |
get_usage | Which 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
Section titled “Knowledge”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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
list_knowledge | The workspace’s pages: title, summary, tags and trust. Called once at the start of a task about the business. | — | read-only |
search_knowledge | Keyword search across pages. Returns the matching sections, best first. | query | read-only |
get_knowledge_page | Read 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. | page | read-only |
save_knowledge_page | Create a page, or replace the title, summary, tags or whole body of an existing one. | slug | write, idempotent |
update_knowledge_section | Replace one section of a page and leave the rest untouched, or add a new section. | page, section | write, idempotent |
Email actions (Gmail)
Section titled “Email actions (Gmail)”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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
gmail_send_email | Send 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_at | write |
gmail_create_draft | Save an email as a draft that Pathbound holds (not visible in Gmail). Sends nothing until gmail_send_draft. | contact_id, subject, body, from | write |
gmail_send_draft | Send a draft now, or schedule it with send_at. Refused, not rerouted, if the mailbox or the contact’s email changed. | outbox_id, send_at | write |
gmail_list_outbox | List 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, after | read-only |
gmail_cancel_outbox_email | Discard a draft or cancel a scheduled email before it is sent. | outbox_id | write, destructive |
REST reference: Gmail.
Email actions (Resend)
Section titled “Email actions (Resend)”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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
resend_list_segments | The Resend account’s segments: id, name and creation date. | — | read-only |
resend_create_segment | Create a segment in Resend. | name | write |
resend_add_contacts_to_segment | Add up to 25 Pathbound contacts to a Resend segment. A contact that is not in Resend yet is created there. | segment_id, contact_ids | write, idempotent |
resend_remove_contact_from_segment | Remove one contact from a Resend segment. The contact is not deleted. | segment_id, contact_id | destructive, idempotent |
resend_delete_segment | Permanently delete a Resend segment. Its contacts are not deleted. | segment_id | destructive, idempotent |
resend_list_contact_segments | The Resend segments a contact belongs to. | contact_id | read-only |
resend_send_email | Send 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, body | write, idempotent |
resend_list_contact_emails | The emails sent to a contact through Pathbound’s Resend tools, newest first: subject, and when each was sent or is scheduled. | contact_id | read-only |
resend_create_broadcast | Create a broadcast addressed to a segment. It does not send. | name, segment_id, from, subject, body | write |
resend_send_broadcast | Send or schedule an existing broadcast to its whole segment. It cannot be recalled, and the agent must confirm with the user first. | broadcast_id | destructive |
resend_list_events | The events defined in the Resend account, with the fields each declares. | — | read-only |
resend_send_event | Send 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, event | write, idempotent |
To add a whole Pathbound segment to a Resend segment, use broadcast_to_segment under Segments.
Cold email actions (Instantly)
Section titled “Cold email actions (Instantly)”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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
instantly_add_lead | Add a person to an Instantly campaign, so that they enter its sending sequence. | campaign_id, email | write, idempotent |
instantly_update_lead_interest | Set the interest status of an Instantly lead, for example interested, meeting booked or not interested. | lead_email, interest_value | write, idempotent |
Enrichment and prospecting actions
Section titled “Enrichment and prospecting actions”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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
enrich_contacts | Enrich 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_ids | write |
enrich_companies | Enrich existing companies (industry, headcount, revenue, founded year). Up to 25 IDs. Apollo: ~1 credit per match. Hunter: 0.2. | company_ids | write |
find_people_at_companies | Anchored 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_ids | write |
prospect_companies | Prospecting: 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 filter | write |
prospect_people | Prospecting: 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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
apollo_create_sequence | Create 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, steps | write |
apollo_activate_sequence | Turn 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_id | write |
apollo_pause_sequence | Turn a sequence off: every enrolled contact pauses and nothing sends until it is activated again. | sequence_id | write |
apollo_list_sequences | The team’s sequences with stats, plus the sending schedule and ruleset each one runs under; archived hidden by default. Call before enrolling. | q | read-only |
apollo_list_sequence_options | The 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_schedule | Point 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_id | write |
apollo_list_senders | Mailboxes 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_sequence | Enroll 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_id | write |
apollo_add_segment_to_sequence | The whole-segment version, as a background job (get_job for progress and the per-reason skip breakdown). | segment, sequence_id, sender_account_id | write |
apollo_stop_in_sequence | Stop (keep history) or remove contacts from a sequence. | contact_ids, sequence_id, mode | write |
apollo_sequence_activity | One contact’s enrollment records plus Apollo’s activity feed (enrolled, replied, completed, removed…). Meters like get_contact_timeline. | contact_id | read-only |
apollo_send_email | One 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_at | write |
apollo_list_scheduled_emails | Pending, sent, delayed, failed and canceled single emails. | contact_id, status | read-only |
apollo_cancel_scheduled_email | Cancel a scheduled single email before it fires. | scheduled_email_id | write |
Streaming and email automations
Section titled “Streaming and email automations”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:writeas well asstreams:write, and Resend’s Send email toggle must be on.get_stream_optionssays 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_emailis 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_hoursper form, and no more thandaily_capa 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.
| Tool | Description | Key params | Annotations |
|---|---|---|---|
get_stream_options | Everything 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_setup | How 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_streams | The 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, limit | read-only |
get_stream | One 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_id | read-only |
preview_stream_matches | Count 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, conditions | read-only |
create_stream | Create 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 type | write |
update_stream | Change 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_id | write, idempotent |
send_stream_test_email | Send 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_id | write |
delete_stream | Permanently 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_id | destructive, idempotent |
Authoring custom MCP integrations
Section titled “Authoring custom MCP integrations”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.