> ## Documentation Index
> Fetch the complete documentation index at: https://docs.useorbitcrm.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Available Tools

> Every tool the Orbit MCP server exposes: what it does, the scope it needs, and whether it reads, writes or reaches outside Orbit.

The Orbit MCP server exposes more than 100 tools, grouped by area below. Together they make Orbit a CRM your agents can both work in and build: read and update contacts, companies, deals, tasks and notes; work forms, meetings, sequences and workflows; configure fields, pipelines, settings, views and teams; and configure the dialer, build call lists, write call scripts and read call outcomes, transcripts and AI feedback (calls themselves are only ever placed by a person from the Dialer page).

Each table lists the name an agent calls, what the tool does, the scope its credential needs, and its access level:

* **Read**: only looks. Hosts usually run these without asking.
* **Write**: changes data inside your Orbit workspace.
* **Outbound**: also emails someone, sends a calendar invite, or delivers data to a URL outside Orbit, so hosts ask before running it.

The same list is in the app under **MCP → Tools available**.

An agent can configure the whole CRM over MCP: start with `get_crm_schema`, then add fields, build pipelines and change settings. [Build your CRM](https://docs.useorbitcrm.ai/mcp/build-your-crm.md) walks through it end to end. Configuration deletes (fields, stages, pipelines, views, teams) and task / note deletes are available; deleting contacts, companies, deals and workflows is intentionally left to the [REST API](https://docs.useorbitcrm.ai/developers/api/crm.md), which needs the `:delete` scopes.

## Search

Find any contact, company, deal or task by name, email, domain or phone number in one call, best match first, within what the credential may see.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `search_crm` | Find contacts, companies, deals and tasks by name, email, domain or phone (contacts and companies), deal name or task title. Every word must match (three or more letters anywhere, shorter ones at a word start; phones by digits). Results come grouped by object, strongest match first (match: exact, starts\_with, word, contains), with ID and link, within the credential's scopes, record access and visible pipelines. Use it to resolve a name to an ID. | `contacts:read` | Read |

## CRM setup

Read the whole CRM in one call, change object settings, and manage custom fields on contacts, companies and deals.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `get_crm_schema` | Describe the team's whole CRM in one call: standard and custom fields for contacts, companies, deals, tasks and notes; pipelines with their stages and visibility; contact, company, deal and task settings with what each setting does; lifecycle stages and lead statuses; tags; team members (IDs and names for owners and assignees); and member groups (teams). Start here before configuring or writing CRM data. | `crm:read` | Read |
| `update_crm_settings` | Change settings for one object; only the keys passed change and unknown keys are rejected. Every key, its values and who may set it: `get_crm_schema` settings\_reference. contact: auto\_link\_company\_by\_domain, sync\_owner\_to\_company, prospecting\_lead\_statuses, prospecting\_stale\_days. company: auto\_create\_from\_contacts, auto\_create\_from\_email\_domain. deal: default\_currency, lost\_reasons, require\_lost\_reason, stale\_after\_days, default\_owner, follow\_contact\_owner, fiscal\_year\_start\_month, lifecycle\_on\_open\_deal / lifecycle\_on\_won\_deal, auto\_renewal, deal\_splits, card\_fields, list\_columns. task: default\_due\_days, default\_assignee. contact, company, deal: required\_on\_create. | `crm:write` | Write |
| `list_crm_fields` | List the custom field definitions of contacts, companies, deals or tasks in display order: field\_name, label, field\_type, options, description, group\_id (groups are in `get_crm_schema`), rules: validation, condition (when it shows / is required) and options\_by (dependent options), and computed (calculated, rollup or synced; read-only values). Check them before writing values. | `crm:read` | Read |
| `create_crm_field` | Add a custom field to contacts, companies, deals or tasks. field\_name defaults to snake\_case of the label. Values: string/long\_text/email/phone/url text, number/currency/percent numbers (12.5 = 12.5%), boolean, date YYYY-MM-DD, datetime ISO 8601, select one option, multi\_select a list, user a member ID. select and multi\_select need options. New fields go last. | `crm:write` | Write |
| `update_crm_field` | Change a custom field's label, description, options, group, position or rules (validation, condition, options\_by; each replaces the stored one). Turning unique on is refused (409) while records share a value; the answer lists them. field\_type changes only when no stored value is lost: string\<->long\_text (back only if every value fits 2,000 chars), url/email/phone/select->string or long\_text, select\<->multi\_select (back only if no record has 2+), number\<->currency\<->percent; others are refused with the reason. | `crm:write` | Write |
| `delete_crm_field` | Remove a custom field definition. Values already stored on records are kept (re-creating the field brings them back). Contact fields used by active workflows cannot be deleted. | `crm:write` | Write |
| `create_crm_field_group` | Add a field group (a section on record pages) to contacts, companies, deals or tasks. It goes last; put fields in it with `update_crm_field` group\_id. | `crm:write` | Write |
| `update_crm_field_group` | Rename a field group or change its place among the object's groups. | `crm:write` | Write |
| `delete_crm_field_group` | Delete a field group. Its fields and their values stay, ungrouped. | `crm:write` | Write |

## Pipelines

Build and reshape deal pipelines and their stages, and control who can see each pipeline.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_pipelines` | List deal pipelines with their ordered stages (name, type open/won/lost, win probability, color) and visibility. One pipeline is the default. | `crm:read` | Read |
| `create_pipeline` | Create a deal pipeline. Pass stages in order (each with name, and optionally kind open/won/lost, probability 0-100, color); without stages a seven-stage starter set is created (Lead, Qualified, Meeting booked, Proposal, Negotiation, Won, Lost). Include at least one won and one lost stage so deals can close. Stage IDs are in the response and in `list_pipelines`. A team can have at most 50 pipelines. | `crm:write` | Write |
| `update_pipeline` | Rename a pipeline, change its position in the list, make it the default (is\_default: true), or set its rules (admins; see rules\_reference in `get_crm_schema`). | `crm:write` | Write |
| `delete_pipeline` | Delete a pipeline and its stages. Refused while the pipeline has deals (deals in Recently deleted included), or if it is the team’s only pipeline. | `crm:write` | Write |
| `create_pipeline_stage` | Add a stage to a pipeline. Without position it goes before the won / lost stages. | `crm:write` | Write |
| `update_pipeline_stage` | Change a stage's name, type (open/won/lost), win probability or color. Changing the type updates the status of deals already in the stage, so it needs deals:write as well as crm:write. | `crm:write` | Write |
| `delete_pipeline_stage` | Delete a stage. If deals are in it, pass move\_deals\_to with another stage in the same pipeline and they move first; moving them needs deals:write as well as crm:write. | `crm:write` | Write |
| `reorder_pipeline_stages` | Set the order of a pipeline's stages. Pass every stage ID in the new order. | `crm:write` | Write |
| `get_pipeline_access` | Show who can see a pipeline: visibility (everyone or restricted) and, when restricted, the user IDs and team (member group) IDs granted access. Workspace admins and the owner always see every pipeline. Pipeline IDs come from `list_pipelines`. | `crm:read` | Read |
| `set_pipeline_access` | Set who can see a pipeline, its stages and its deals. visibility everyone opens it to the whole workspace; restricted limits it to the listed user IDs and team (member group) IDs, replacing any earlier list, and an empty list hides it from everyone except workspace admins and the owner. Only workspace admins can change this. Pipeline IDs come from `list_pipelines`, group IDs from `list_member_groups`, user IDs from `get_crm_schema`. | `crm:write` | Write |

## Saved views & lists

Saved views of the Contacts table: columns, filters and sort.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_views` | A list's saved views (shared, and yours), and filter\_fields: the fields and operators its filters take. | `crm:read` | Read |
| `list_view_records` | The records a saved view holds now, as you'd see them. Deal views span your pipelines unless pipeline\_id is set. | `crm:read` | Read |
| `create_view` | Save a view of a list, shared (editors, admins) or private. Filter fields: see `list_views`. Linked contact.*, company.* and deal.\* match when any linked record does; not\_equals and is\_empty then mean none does. | `crm:write` | Write |
| `update_view` | Rename, share or hide (its creator only) or reorder a saved view, or change config keys: those sent replace the stored ones, the rest stay. | `crm:write` | Write |
| `delete_view` | Delete a saved view of any list. Its records stay. | `crm:write` | Write |
| `list_lists` | Static lists of contacts or companies, with member counts. In any filter, \{ field: 'list', operator: 'equals', value: \<list id> } selects a list's members. | `crm:read` | Read |
| `list_list_members` | A list's contacts or companies, a page at a time, as you'd see them. | `crm:read` | Read |
| `create_list` | Create a static list of contacts or companies (names are unique per object). Add records with `add_to_list`. | `crm:write` | Write |
| `update_list` | Rename a list or change its description (null clears it). Its members stay. | `crm:write` | Write |
| `delete_list` | Delete a list (admins, or the person who made it). Its records stay. | `crm:write` | Write |
| `add_to_list` | Add up to 10,000 contacts or companies to a list. Records you cannot see, or in Recently deleted, come back as skipped. | `crm:write` | Write |
| `remove_from_list` | Remove up to 10,000 records from a list. The records themselves stay. | `crm:write` | Write |
| `list_contact_views` | List saved views of the Contacts table: columns, pinned columns, AND/OR filter groups and sort. | `crm:read` | Read |
| `create_contact_view` | Save a view of the Contacts table for the team: which columns show and which are pinned, AND/OR filter groups, and sort. Columns are contact fields (name, email, company, owner, tags, last activity and more) or `cf:` plus a custom field name, e.g. `cf:industry`. | `crm:write` | Write |
| `update_contact_view` | Rename a saved contact view, change its position, or change config keys (same shape as `create_contact_view`): those sent replace the stored ones, the rest stay. | `crm:write` | Write |
| `delete_contact_view` | Delete a saved contact view. Contacts are not affected. | `crm:write` | Write |

## Contacts

People, the tags you organize them with, CSV imports and duplicate merges.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_contacts` | List contacts for the team. Supports pagination, status filtering, free-text search (email, name, company), and filtering by tag slug or lead score. Returns contacts with their tags and lead\_score (read-only, from the active scoring model; null when never scored). | `contacts:read` | Read |
| `get_contact` | Get a single contact by ID, including its tags, custom fields, engagement counts, activity (last contacted, last and next activity) and emails (every address, the primary first). include\_associations adds every linked company with its labels (company\_id is the primary). | `contacts:read` | Read |
| `create_contact` | Create a new contact. Email is required and must be unique within the team. Returns 409 if a contact with the email already exists. | `contacts:write` | Write |
| `update_contact` | Update fields on an existing contact (name, phone, company, job title, email, status, qualification status, lifecycle stage, lead status, owner, linked company, custom fields, other email addresses). Only provided fields are changed; custom\_fields merges into the stored values and null removes one. enrich: true fills empty fields (job title, LinkedIn URL) from the connected enrichment provider. | `contacts:write` | Write |
| `list_contact_tags` | List the tag library shared by contacts, companies and deals (name, slug, color, description). | `contacts:read` | Read |
| `create_contact_tag` | Create a tag for contacts, companies and deals. Slug is derived from the name if not provided. | `contacts:write` | Write |
| `add_contact_tag` | Assign an existing tag to a contact, identified by tag\_id or tag\_slug. | `contacts:write` | Write |
| `remove_contact_tag` | Remove a tag from a contact, identified by tag\_id or tag\_slug. | `contacts:write` | Write |
| `import_contacts` | Import contacts (200 or fewer rows per call keeps responses quick). A row whose email exists follows duplicate\_mode: fill\_empty (default) fills blanks, overwrite replaces, skip leaves it. Bad rows are left out (errors). A custom value breaking its field's rules is left out (warnings); the record still imports. custom\_fields keys must be defined contact fields unless create\_missing\_fields is true (needs crm:write). A workflow runs only with workflow\_id (workflows:write; an active Contact added or form trigger workflow, which can email them). Rows with external\_id can later be named by contact\_external\_id. Returns the import ID (`get_contact_import`) and counts; a failed call that already saved rows also returns import\_id. | `contacts:write` | Outbound |
| `list_contact_imports` | List contact imports, newest first, with status (processing, completed, failed, undoing, undone), duplicate mode, row counts (total, created, updated, unchanged, skipped, errors), workflow runs started, who started it and when it finished or was undone. | `contacts:read` | Read |
| `get_contact_import` | Get one contact import by ID (from `import_contacts` or `list_contact_imports`): its counts and status plus the row-level errors (row number and message) and the tag it applied. | `contacts:read` | Read |
| `merge_contacts` | Merge two contacts. The primary survives and takes the secondary’s tags, notes, tasks, deals, meetings, bookings, sequence enrollments (a shared sequence stops the secondary’s), emails and calls. The secondary is archived and can’t be merged again or be a primary. Each field keeps the primary’s value, the secondary filling gaps, unless values names the winner (null clears). Returns the primary. | `contacts:write` | Write |
| `merge_records` | Merge two contacts, companies or deals: everything linked to secondary\_id moves to primary\_id, which survives; a merged company or deal goes to Recently deleted (a deal keeps its own pipeline and stage). Each field keeps the primary’s value, or the secondary’s when blank, unless values names the winner (null clears one). `merge_contacts` does the same for contacts. Returns the merged record. | `contacts:write` | Write |
| `get_prospecting_queue` | The caller's Prospecting queue (as on the Prospecting page): one row per contact, or task without one, most urgent first. Reasons: reply (a contact they emailed in the last 60 days wrote back in the last 7, unanswered; with a snippet), task\_overdue / task\_due (open tasks due by end of today), new\_lead (owned, created in 14 days, never contacted), open (their emails opened in 7 days), stale (owned, not contacted for the stale days). new\_lead and stale follow settings.working\_lead\_statuses. Rows carry the contact's open deal and sequence. Also meetings (today, needs\_outcome), today (tasks\_completed, emails\_sent, calls, meetings\_booked), snoozed contacts and counts per lead status. Tasks need tasks:read. | `contacts:read` | Read |

## Companies

Accounts. A company domain links contacts with matching emails.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_companies` | List companies. Filter by search (name or domain), exact domain, owner, tag or parent company. | `companies:read` | Read |
| `get_company` | Get a company with its custom fields, tags, parent\_company\_id, number of linked contacts, open deal value and activity (last contacted, last and next activity, counts). | `companies:read` | Read |
| `create_company` | Create a company. The domain (e.g. acme.com) is unique per team and lets contacts with matching emails be linked automatically. | `companies:write` | Write |
| `update_company` | Update a company. Only fields you pass change; null clears a field. custom\_fields merges into existing values. A parent\_company\_id that is the company itself or one of its descendants is refused. enrich: true fills empty fields (industry, employees, location, LinkedIn, logo) from the connected enrichment provider. | `companies:write` | Write |
| `add_company_tag` | Add a library tag to a company by tag\_id or tag\_slug; a no-op if already there. | `companies:write` | Write |
| `remove_company_tag` | Remove a tag from a company by tag\_id or tag\_slug. | `companies:write` | Write |
| `import_companies` | Import up to 1,000 companies per call. A row whose external\_id or domain matches an existing company follows duplicate\_mode: update (default) merges the values sent, skip leaves it. Bad rows are left out (errors). A custom value breaking its field's rules is left out (warnings); the record still imports. custom\_fields keys must be defined company fields unless create\_missing\_fields is true (needs crm:write). Returns counts and the Orbit id of every row, so deals can link by company\_external\_id or company\_id; a call that fails part-way returns partial with the rows already written. Counts toward the hourly budget of 100,000 imported rows. | `companies:write` | Write |

## Deals

Opportunities in your pipelines, with their company, contacts, stage history and pipeline totals.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_deals` | List deals with their company and contacts. Filter by pipeline, stage, status (open, won, lost), owner, company, contact, tag or name search, deal\_type, by when they closed (closed\_after / closed\_before, on closed\_at) to find the deals won or lost in a period, and by renewal\_date (renewal\_after / renewal\_before) to find renewals coming up. Each deal has amount\_home, its amount in home\_currency. | `deals:read` | Read |
| `get_deal` | Get a deal: stage, status and closed\_at, amount and amount\_home (in home\_currency; closed deals keep their closing rate), deal\_type, recurring\_amount/interval, renewal\_date, renewed\_from\_deal\_id, company, contacts, tags, lost\_reason, custom fields, activity, days\_to\_close, days\_in\_stage and stage\_times. include\_associations adds all companies and contact/company labels; include\_splits adds who shares its credit. | `deals:read` | Read |
| `create_deal` | Create a deal. With only stage\_id, that stage's pipeline is used; without either, the default pipeline's first stage. Currency defaults to the team's deal setting. Link contacts with contact\_ids. When the team requires a lost reason, pass lost\_reason to create a deal in a lost stage. Missing required fields answer 422 required\_on\_create or stage\_required\_fields with details.missing. | `deals:write` | Write |
| `clone_deal` | Copy a deal within its pipeline: amount, currency, close date, owner, company, contacts (primary kept), description and custom fields, named "Copy of …" unless name is passed. It starts in the original stage if open, else the first open stage (stage\_id picks another). Notes, activity, tasks, files, history, lost reason and close time are not copied; records you cannot see are left off; over 200 contacts cannot be cloned. Returns the new deal. | `deals:write` | Write |
| `update_deal` | Update a deal. stage\_id moves it (status follows the stage; "Deal Stage Changed" workflows run); another pipeline needs pipeline\_id and stage\_id; a lost stage may need lost\_reason. Pipeline rules may refuse with 422: stage\_required\_fields (send details.missing with stage\_id), stage\_skip\_not\_allowed (move to details.next\_stage), stage\_backward\_not\_allowed, closed\_deal\_locked (admins may retry with override\_rules); stage\_approval\_required (ask with `deal_approval`). splits replaces who shares its credit (saved after the other fields; 409 splits\_disabled while the deal setting deal\_splits is off). | `deals:write` | Write |
| `add_deal_contact` | Link a contact to a deal. With is\_primary true it becomes the primary contact and the previous primary contact loses that role. Adding a contact that is already linked keeps its role. | `deals:write` | Write |
| `remove_deal_contact` | Unlink a contact from a deal. The contact itself is not changed. | `deals:write` | Write |
| `set_association` | Link two records, or change an existing link: a contact and a company (contact\_company), a deal and a contact (deal\_contact), or a deal and a company (deal\_company). labels (keys or names from `get_crm_schema` association\_labels) replace the link's labels; \[] clears them. is\_primary true makes it the primary (the record's company, or the deal's primary contact); the first company linked becomes primary. Returns the contact's companies, the deal's companies, or the deal. | `deals:write` | Write |
| `remove_association` | Unlink two records (see `set_association` for the types). Removing the primary makes the next one primary. Neither record is changed otherwise. | `deals:write` | Write |
| `add_deal_tag` | Add a library tag to a deal by tag\_id or tag\_slug; a no-op if already there. | `deals:write` | Write |
| `remove_deal_tag` | Remove a tag from a deal by tag\_id or tag\_slug. | `deals:write` | Write |
| `list_deal_approvals` | With deal\_id: that deal's approval requests, newest first (status, stage, who asked and decided; pending ones list approvers, can\_decide and can\_cancel). Without: the requests waiting for you to approve or reject. | `deals:read` | Read |
| `deal_approval` | Stage approvals: a stage with approval\_required answers a move there with 422 stage\_approval\_required. request (stage\_id, note) asks its approvers, who are notified. approve or reject (approval\_id, note) is for an approver other than whoever asked; approving moves the deal when it still can (moved). cancel withdraws a pending request (whoever asked, or an admin). | `deals:write` | Write |
| `list_products` | List the product library: name, SKU, description, unit\_price, currency and recurring\_interval. Search by name or SKU; archived: exclude (default), include or only. | `deals:read` | Read |
| `save_product` | Create a product (no product\_id: name and unit\_price required; currency defaults to the workspace's deal currency) or change one. archived: true archives it (it can't be added to deals any more), false restores it. A SKU is unique among products that aren't archived. | `deals:write` | Write |
| `list_deal_line_items` | A deal's line items (quantity, unit\_price, discount, recurring\_interval, amount) in the deal's currency, their totals, and whether the deal amount follows them (amount\_from\_line\_items). | `deals:read` | Read |
| `update_deal_line_items` | Add, change and remove a deal's line items in one call. add: \{ product\_id } copies the product (a product priced in another currency needs unit\_price in the deal's), or \{ name, unit\_price } for a one-off line. amount\_from\_line\_items: true keeps the deal amount equal to the lines' total. All checked before anything is written; returns the lines and totals. | `deals:write` | Write |
| `list_quotes` | List quotes, or get one with quote\_id: lines, totals, terms, expires\_at, status (draft, open, accepted, void; display\_status adds expired), public\_url once shared, views and who accepted. Filter by deal\_id or status. | `deals:read` | Read |
| `create_quote` | Make a quote from a deal's line items (copied now; later deal changes don't alter it), with the workspace's default terms and expiry unless given. publish: true shares it at once and returns public\_url to send the buyer, who can accept it there; include\_payment\_link adds a Stripe payment link in the workspace's own Stripe account. | `deals:write` | Outbound |
| `update_quote` | Change a draft (title, terms, expires\_at, include\_payment\_link; refresh\_items: true re-copies the deal's line items), then share: true shares it (public\_url works; its payment link is made in Stripe). void: true voids a shared or accepted quote instead: its page says it is no longer available and its payment link is switched off. | `deals:write` | Outbound |
| `import_deals` | Import up to 1,000 deals per call, each in a pipeline and stage named by id or name (the stage decides open, won or lost), linked to a company and contacts (the first contact is primary). A row whose external\_id matches a deal follows duplicate\_mode: update (default) or skip; with no pipeline or stage it stays where it is. Closed deals keep their closed\_at (or close\_date); created\_at backdates. No "Deal Stage Changed" workflows run. Bad rows are left out (errors); a missing contact is a warning. A custom value breaking its field's rules is left out (warnings); the record still imports. Returns counts and the Orbit id of every row; a call that fails part-way returns partial with the rows already written. Counts toward the hourly budget of 100,000 imported rows. | `deals:write` | Write |
| `get_deal_history` | List a deal's stage changes, newest first: the stage it left (null for its creation), the stage it entered, who moved it (the credential's owner for API moves; null for workflow and import moves) and when. Deal IDs come from `list_deals`. | `deals:read` | Read |
| `get_pipeline_summary` | Summarize a pipeline's deals: per stage the deal count, total amount and amount weighted by win probability; totals for open, won and lost deals; and how many open deals are stale under the team's stale\_after\_days setting. Without pipeline\_id the default pipeline is used. Counts up to 10,000 deals; meta.truncated says when there were more. | `deals:read` | Read |
| `get_sales_report` | One Reports page report under the caller's record access. pipeline: open deals per stage (count, amount, weighted). win\_rate: won / (won + lost) closed in the period, per owner and period. conversion: per stage, deals entering it and how many reached the next stage or won. stage\_time: mean and median seconds per stage. deal\_flow: created and won per period and source. activity: emails, calls, meetings and tasks done per rep. response: contact creation to first human outreach, per owner. renewals: won deals renewing in the period, by month and state, with MRR/ARR. recurring: MRR/ARR won by deal\_type, in force, and past renewal. Amounts in the team currency; rates are fractions. Needs deals:read (activities:read for activity, contacts:read for response). | `deals:read` | Read |
| `ask_report_question` | Answer a reporting question in plain English ("win rate by source last quarter", "calls per rep this month", "deals created per month this year") as a table: Orbit plans the report with AI from field names only, then runs it on read-only reporting views under your record access. Returns the title, the spec it ran, the rows and what it counted. Deals, contacts, companies, tasks and activities, each needing its read scope. Uses 1 AI credit per answer; a question it cannot answer is free. | `deals:read` | Outbound |
| `get_goals` | Sales goals and attainment for a period, with the caller's record access applied: per person and team, the actual (the sales reports' own won revenue, deals won, calls or meetings), the goal and attainment (actual / goal), ranked as a leaderboard. Goals are per month or fiscal quarter; aligned is false for a range that isn't whole months. Needs deals:read (activities:read for calls and meetings). | `deals:read` | Read |
| `get_forecast` | The forecast for a month or fiscal quarter, with the caller's record access applied. Per person and team: closed (won in the period), the open deals expected to close in it per forecast category, weighted, the revenue goal, system (closed + commit), the current submission and admin override, and accuracy once the period has ended; plus every submission and override for the period, newest first. Amounts in the team currency. Needs deals:read. | `deals:read` | Read |

## Tasks

Follow-ups linked to a contact, company or deal.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_tasks` | List tasks, soonest due first. Filter by status (open, done), task type, assignee, linked contact / company / deal, or due date range. | `tasks:read` | Read |
| `create_task` | Create a task, optionally linked to a contact, company and/or deal. due\_at and the assignee default from the team's task settings when left out. A repeating task recurs when completed. | `tasks:write` | Write |
| `update_task` | Update a task. Set status to "done" to complete it (a repeating one recurs) or "open" to reopen it. | `tasks:write` | Write |
| `list_task_types` | The workspace's task types: key (call, email, todo or custom\_\*), label, icon, hidden (can't be set; tasks keep it). Admins edit them in Settings → Tasks. | `tasks:read` | Read |
| `delete_task` | Delete a task. It moves to Recently deleted, where a workspace admin can restore it; linked records are not changed. | `tasks:write` | Write |

## Notes

Notes on a contact, company or deal, and comments on notes and logged activity.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_notes` | List notes on one contact, company or deal (pass one ID), or find one by external\_id and external\_source; pinned first. Or a note's or activity's comments (note\_id / activity\_id). | `notes:read` | Read |
| `create_note` | Add a note to one contact, company or deal, or comment on a note or activity (note\_id / activity\_id). Mention members as `@[Name](user:USER_ID)`. | `notes:write` | Write |
| `update_note` | Edit a note's text or pin / unpin it. | `notes:write` | Write |
| `delete_note` | Delete a note from its contact, company or deal. It moves to Recently deleted, where a workspace admin can restore it. | `notes:write` | Write |

## Activity & timeline

A record's whole timeline and its field changes, and the emails, calls, meetings and messages that happened outside Orbit: log them one at a time or import history in bulk (with undo).

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `get_timeline` | A record's whole history, newest first: form submissions, meetings booked, sequence emails and SMS, emails sent from Orbit, dialer calls, logged activities, notes, tasks and (deals) stage changes. Pass exactly one of contact\_id, company\_id or deal\_id; a company's timeline includes its contacts' activity. Returns items with a type, occurred\_at, title, summary and the source row, plus next\_cursor: pass it back as `before` for the next page. | `activities:read` | Read |
| `summarize_record` | AI summary of a contact, company or deal: 3-6 sentences, key facts (last touch, next activity, open deals, recent calls and meetings) and 2-4 next steps, each citing the timeline items it rests on. An unchanged record returns its saved summary free; a new one uses 1 AI credit. Needs the object's read scope; reads only what your scopes reach. | `activities:read` | Outbound |
| `list_activities` | List logged activities (emails, calls, meetings, SMS and messages recorded with `log_activity` or `import_activities`, and emails Orbit saved from members' mailboxes) on a contact, company or deal, newest first, with type, direction, since and until filters. For everything on a record, including what Orbit did itself, use `get_timeline`. | `activities:read` | Read |
| `get_activity` | Get one logged activity by ID, including its body, participants, links and origin. | `activities:read` | Read |
| `log_activity` | Record an email, call, meeting, SMS or message that happened outside Orbit on a contact, company or deal, at the time it happened. Nothing is sent. Name the record by id, by contact\_email / company\_domain, or by its id in another system (contact\_external\_id with external\_source). The actor defaults to you; a migrated activity's original author goes in actor\_email / actor\_name. external\_source and external\_id make the row recognisable to `import_activities` later. | `activities:write` | Write |
| `update_activity` | Edit a logged activity: any field but its type. Pass null for contact\_id, company\_id or deal\_id to unlink a record (at least one link must remain). Emails synced from a Gmail or Outlook mailbox are read-only. | `activities:write` | Write |
| `delete_activity` | Delete a logged activity permanently. Emails synced from a Gmail or Outlook mailbox are read-only. | `activities:write` | Write |
| `import_activities` | Import history in bulk (notes, tasks, emails, calls, meetings, SMS, messages), up to 500 rows per call. Name records by id, contact\_email, company\_domain or source ids (contact\_/company\_/deal\_external\_id). With external\_source and each row's external\_id a re-run updates (default) or skips its earlier rows, never duplicates. Rows keep their timestamps and authors. Notes and tasks also need notes:write / tasks:write. Nothing runs and nothing is sent. Bad rows are left out (errors). Returns the import ID (`get_activity_import`, `undo_activity_import`) and counts. | `activities:write` | Write |
| `list_activity_imports` | List activity imports, newest first, with status (processing, completed, failed, undone), source, counts (total, created, updated, skipped, errors), who started it and when. | `activities:read` | Read |
| `get_activity_import` | Get one activity import by ID: its counts and status plus the row-level errors (row number and message). | `activities:read` | Read |
| `undo_activity_import` | Delete everything an activity import created: its notes, tasks, logged activities and files. Rows it only updated stay as they are. Team admins only. A result with done false means more rows remain: call again. | `activities:write` | Write |
| `list_record_changes` | List field changes on a contact, company, deal or task, newest first: field (e.g. stage\_id, custom\_fields.tier), old\_value, new\_value, actor (user\_id; app\_id for an app), source (dashboard, api, mcp, import, workflow, system) and time; kind deleted / restored / merged marks those moves. Filter by field, source or actor (a user ID, or none); meta.next\_cursor pages. | `contacts:read` | Read |

## Files

Files on contacts, companies and deals: list them, get download links, bring them in from URLs, delete them.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_files` | List the files on a contact, company or deal (or attached to one logged activity or note), newest first, with name, type, size and who added them. Use `get_file` for a download link. | `files:read` | Read |
| `get_file` | Get one file's record with a download\_url that works for five minutes and downloads the file as an attachment. | `files:read` | Read |
| `import_file_from_url` | Fetch a file from an HTTPS URL (e.g. a signed download link from another CRM) and attach it to a contact, company or deal, optionally to one of their logged activities or notes. Public hosts only, 25 MB at most; documents, images, archives, audio and video. The URL is kept as source\_url. Name the record by id, by contact\_email / company\_domain, or by its id in another system (contact\_external\_id with external\_source). Give external\_source and external\_id so a re-run is refused as a conflict instead of storing a second copy. | `files:write` | Outbound |
| `delete_file` | Delete a file permanently: its record and the stored bytes. | `files:write` | Write |

## Team

Named groups of team members, used to filter records and share pipelines.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `get_workspace` | Identify the workspace this credential belongs to and who it acts as: the workspace (team) ID, name and slug with team:read; the user ID, email and name with user:read; the credential type, its scopes and the OAuth app it belongs to. Call it to learn the team\_id that records and webhooks carry, or to label a connection. | `team:read` | Read |
| `list_member_groups` | List the teams (member groups) inside the workspace: each with its ID, name and members (user IDs and names). Group IDs are used by `set_pipeline_access`; user IDs match team\_members in `get_crm_schema`. | `crm:read` | Read |
| `create_member_group` | Create a team (member group) of workspace members, optionally with its first members. user\_ids come from team\_members in `get_crm_schema`; people outside the workspace are rejected. Workspace admins only; a workspace can have up to 100 teams. | `crm:write` | Write |
| `update_member_group` | Rename a team (member group). group\_id comes from `list_member_groups`. Workspace admins only. | `crm:write` | Write |
| `delete_member_group` | Delete a team (member group). Its members stay in the workspace; a pipeline restricted to it stays restricted to its other teams and people. Workspace admins only. | `crm:write` | Write |
| `set_member_group_members` | Replace the members of a team (member group) with the given user IDs: people not listed are removed, new ones added. user\_ids come from team\_members in `get_crm_schema`; people outside the workspace are rejected. Workspace admins only. | `crm:write` | Write |

## Workflows

Build, run and inspect automations, and the AI agent templates they use.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `get_workflow_schema` | Describe how to build a workflow: every trigger and node type with its provider, the config fields each needs, the outputs it exposes to later nodes, plan requirements, the graph rules, and app\_actions: the actions of the apps installed in this workspace, each usable as a destination node with provider app\_action and config \{ app\_id, action\_id, action\_key, inputs }. Read this before `create_workflow`. | `workflows:read` | Read |
| `list_workflows` | List workflows with status (draft, active, paused), trigger, node and run counts, queued submissions and whether unpublished changes exist. Filter by status or name. | `workflows:read` | Read |
| `get_workflow` | Get a workflow with its trigger config, nodes (type, provider, config; credentials such as webhook headers are shown as \[REDACTED]) and edges, its status, and whether it has unpublished changes. Use the returned updated\_at as expected\_updated\_at when updating. | `workflows:read` | Read |
| `create_workflow` | Create a draft workflow, optionally with its graph: nodes keyed by names you choose plus the edges joining them (always send both). One trigger node connected to at least one action node. Node types and config: `get_workflow_schema`. Activate with `activate_workflow`. Nodes that write CRM data need the matching write scope (contacts, companies, deals, tasks, notes); nodes that send lead data out of Orbit need contacts:read. \[REDACTED] values from `get_workflow` cannot be copied: send the real value. | `workflows:write` | Write |
| `update_workflow` | Rename a workflow, change its description or trigger config, or replace its graph (nodes and edges together; nodes keeping their ID keep their history). A \[REDACTED] credential from `get_workflow` keeps its value only in a node whose ID, type, provider and URLs are unchanged; elsewhere send the real value. Graph changes stay a draft until `activate_workflow`. expected\_updated\_at from `get_workflow` refuses the save if it changed meanwhile. | `workflows:write` | Write |
| `activate_workflow` | Validate and publish a workflow so it runs on its trigger. A draft becomes active; a paused workflow resumes (process\_queue says what happens to submissions queued while it was paused: all, skip or none); an active workflow with unpublished changes publishes them. Returns the validation problems when the graph is not ready. | `workflows:write` | Write |
| `pause_workflow` | Pause an active (published) workflow so new trigger events stop starting runs. Runs already in progress finish. Activate it again with `activate_workflow`. A draft that was never activated cannot be paused. | `workflows:write` | Write |
| `run_workflow` | Run an active workflow now. With contact\_ids, each contact becomes a run (the trigger must be Contact Added or Form Submission); the same contact\_ids with the same idempotency\_key never run twice (already\_started counts them). With trigger\_data, the workflow runs once with that data; every call starts a new run, and the response carries a trigger\_key to find it with `list_workflow_runs`. Runs execute in the background and can send email, call integrations and change CRM data. | `workflows:write` | Outbound |
| `list_workflow_runs` | List a workflow's runs, newest first, with status (running, completed, failed, cancelled), trigger data and error. Use `get_workflow_run` for the per-node steps. | `workflows:read` | Read |
| `get_workflow_run` | Get one workflow run with every node step: status, input, output, error and timing. Run IDs come from `list_workflow_runs` or `run_workflow`. | `workflows:read` | Read |
| `list_agent_templates` | List AI agent templates (the instructions (system\_prompt), qualification criteria and model an agent node runs with): the team's own plus shared ones. Template IDs go in an agent node's config. | `workflows:read` | Read |
| `create_agent_template` | Create an AI agent template with a instructions (system\_prompt), qualification criteria (an object of your own shape) and a model. Use it from an agent node via its template ID. | `workflows:write` | Write |
| `update_agent_template` | Change an agent template's name, description, instructions (system\_prompt), criteria or model. Only fields you pass change. Shared templates owned by other teams cannot be changed. | `workflows:write` | Write |

## Forms & submissions

Your forms and what people submitted.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_forms` | List forms for the team with pagination and optional status filtering. | `forms:read` | Read |
| `get_form` | Get a single form by ID, including its configuration and settings. | `forms:read` | Read |
| `list_form_submissions` | List submissions for a form. Supports pagination, date-range filtering (since/until ISO dates), and status filtering (completed, partial). | `submissions:read` | Read |
| `update_form_submission` | Change answers on a form submission. fields is merged into the stored answers: keys you name are overwritten, the rest are kept. Pass expected\_updated\_at (the submission's updated\_at) to refuse the change with 409 if someone edited it since. | `submissions:write` | Write |
| `get_form_analytics` | Get a form's analytics for the last N days (default 30, max 90): views, completed and partial submissions and the conversion rate, all-time totals, a daily series, and views by traffic source, device and country. The daily series and breakdowns come from nightly rollups and end with yesterday (UTC). | `analytics:read` | Read |

## Scheduling & meetings

Scheduling pages, availability, and the meetings booked through them.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_meetings` | List meetings for the team. Filter by status, start-time range (since/until ISO dates), or scheduling page. | `meetings:read` | Read |
| `get_meeting` | Get a single meeting by ID: attendee, timing and status, plus its Fathom or Fireflies recordings (the notetaker summary, action items and AI notes). include\_transcript adds the transcript text. | `meetings:read` | Read |
| `summarize_meeting` | AI notes of a meeting’s Fathom or Fireflies recording: a summary, key points and action items with owners and due dates. Saved notes return free; new ones use 1 AI credit. Turn an action item into a task with `create_task`. | `meetings:read` | Outbound |
| `update_meeting` | Update a meeting: change its status (e.g. cancel, mark completed or no-show) and/or set internal notes. Cancelling notifies the attendee and updates the host’s connected calendar. | `meetings:write` | Outbound |
| `list_scheduling_pages` | List scheduling (booking) pages for the team, with optional status filtering. | `scheduling:read` | Read |
| `get_scheduling_page` | Get a scheduling page by ID, including its event types. | `scheduling:read` | Read |
| `list_event_types` | List event types (meeting durations/locations) configured on a scheduling page. | `scheduling:read` | Read |
| `list_availability_schedules` | List availability schedules (working hours and timezones) for the team, optionally filtered by user. | `scheduling:read` | Read |
| `get_available_slots` | Get bookable time slots for a host on a given date — working hours intersected with their connected calendar free/busy. Pass event\_type\_id (from `list_event_types`) so duration, buffers, minimum notice, and round-robin/group rules apply. Requires the team to have a published scheduling page. Returns the open slots (start and end) in UTC ISO 8601. | `scheduling:read` | Read |
| `book_meeting` | Book a meeting on a host’s calendar. Find the scheduling page and event type first (`list_scheduling_pages`, `list_event_types`), then use `get_available_slots` and pass one of its returned slots as start/end — booking a taken or invalid slot returns 409. Creates the meeting, sends calendar invites to the host and attendee, and triggers configured workflows. | `meetings:write` | Outbound |

## Sequences

Email sequences: build them and write their steps, activate or pause them, see how they perform and who is enrolled.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_sequences` | List email sequences for the team, with optional status filtering. | `sequences:read` | Read |
| `get_sequence` | Get a sequence by ID, including its steps. | `sequences:read` | Read |
| `list_sequence_steps` | List the steps of a sequence in order (emails, delays, conditions). | `sequences:read` | Read |
| `get_sequence_analytics` | Get performance analytics for a sequence (sends, opens, clicks, replies, unsubscribes). | `sequences:read` | Read |
| `list_sequence_enrollments` | List contacts enrolled in a sequence, with optional enrollment-status filtering. | `sequences:read` | Read |
| `enroll_contacts_in_sequence` | Enroll one or more contacts (by contact ID, max 100) into a sequence so they start receiving its emails on the sequence schedule. Contacts already enrolled are skipped. | `sequences:write` | Outbound |
| `list_sequence_unsubscribes` | List emails unsubscribed from sequences, with optional email search. | `sequences:read` | Read |
| `add_sequence_unsubscribes` | Add emails (max 100) to the sequence unsubscribe list, either for all sequences or a specific one. Active enrollments for those emails stop sending. | `sequences:write` | Write |
| `create_sequence` | Create a draft email/SMS sequence; nothing is sent. Then `add_sequence_step`, `activate_sequence` and `enroll_contacts_in_sequence`. Exit criteria are set with `update_sequence`. | `sequences:manage` | Write |
| `update_sequence` | Change a sequence’s name, description, sender, settings or exit criteria. On an active sequence they apply to the next emails it sends. Status changes through `activate_sequence` and `pause_sequence`. | `sequences:manage` | Write |
| `add_sequence_step` | Append an email, SMS or task (call, LinkedIn, to-do) step to a sequence (at most 100 steps). Use `reorder_sequence_steps` to move it. On an active sequence a new step can send once saved; edits to published steps wait for `activate_sequence`. | `sequences:manage` | Outbound |
| `update_sequence_step` | Change a step’s type, delay, subject, body or SMS text; only the fields you pass change. On an active sequence a new step can send once saved; edits to published steps wait for `activate_sequence`. | `sequences:manage` | Outbound |
| `delete_sequence_step` | Remove one step from a sequence. | `sequences:manage` | Write |
| `reorder_sequence_steps` | Put a sequence’s steps in a new order. Pass every step ID exactly once, first step first. | `sequences:manage` | Write |
| `activate_sequence` | Start a sequence, or publish the edits of an active one, after checking its steps, merge fields and senders. It then emails and texts everyone enrolled. Calling it again republishes. | `sequences:manage` | Outbound |
| `pause_sequence` | Pause an active sequence so it stops sending. Pausing a paused sequence changes nothing. | `sequences:manage` | Write |

## Email templates

Email templates and snippets people insert in the composer, Inbox replies and sequence steps. Merge fields like `{{ contact.first_name }}` fill in per recipient; add a fallback with `{{ contact.first_name | there }}`.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_email_templates` | List the email templates (whole emails with a subject) and snippets (short blocks inserted with a /shortcut) the caller can use: everything shared with the workspace plus their own personal ones. Filter by kind, visibility or a name search. | `sequences:read` | Read |
| `get_email_template` | Get one email template or snippet: name, subject, body HTML with its merge fields, shortcut, visibility and who changed it last. | `sequences:read` | Read |
| `create_email_template` | Create an email template (kind "template": name, subject, body) or a snippet (kind "snippet": name, body, optional shortcut typed after "/" in the composer). Personal by default; visibility "team" shares it with the workspace. Nothing is sent. Merge fields, written \{\{ contact.first\_name }} with an optional fallback \{\{ contact.first\_name \| there }}: contact.first\_name, last\_name, full\_name, email, phone, company, job\_title or a custom field; company.name, domain, industry, location, phone; deal.name, amount, stage, close\_date; sender.first\_name, full\_name, email, meeting\_link. Anything else is refused. | `sequences:write` | Write |
| `update_email_template` | Change an email template or snippet: rename it, rewrite its subject or body, change a snippet's shortcut, or share it with the workspace (visibility "team") or make it personal. The new content replaces the old. Merge fields as in `create_email_template`; unknown ones are refused. | `sequences:write` | Write |
| `delete_email_template` | Permanently delete an email template or snippet. Sequence steps and emails already written from it keep their own copy of the content. | `sequences:write` | Write |

## Emails

One-to-one email from a contact's page: send an email to a contact from the connected person's address, and read what the team sent with its delivery, open and reply status.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_contact_emails` | List the one-to-one emails the team sent contacts, newest first, with sender, recipient, subject and status. A person whose record access is limited must pass contact\_id. `get_contact_email` has the message. | `emails:read` | Read |
| `get_contact_email` | Get one email sent to a contact, including its message (HTML, and the Markdown it was written in when available) and delivery status. | `emails:read` | Read |
| `send_contact_email` | Send one email to an existing contact from the connected person's address on the workspace's sending domain (never from their Gmail or Outlook mailbox), with an unsubscribe link. Unsubscribed, bounced or blocked contacts are refused, sends are capped hourly, and merge fields like \{\{ contact.first\_name }} are filled in. Retry with the same idempotency\_key so it isn't sent twice. It can't be unsent. | `emails:send` | Outbound |
| `list_conversations` | List the Inbox conversations (email threads with contacts) the person can see: their own mailbox, what is assigned to them and mail to the team address. Newest first, with assignee and open/closed status. `get_conversation` has the messages. | `emails:read` | Read |
| `get_conversation` | Get one Inbox conversation with its messages (oldest first) and its assignment and status history. | `emails:read` | Read |
| `update_conversation` | Assign an Inbox conversation to a member ("me", a member ID, or null to unassign) and/or set status open or closed. The assignee is notified and must be able to see the contact. | `emails:send` | Write |

## Dialer

Configure the power dialer, preview call lists built from saved views, read calls, outcomes and statistics, manage the do-not-call list, write the call scripts reps read on a call, and read each call's transcript and AI feedback. Calls are only ever placed by a person from the Dialer page.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `get_dialer_settings` | Read the team's power dialer settings (defaults when none are saved): caller\_id, ring\_timeout\_seconds, auto\_advance\_delay\_seconds, wrap\_up\_seconds, voicemail\_mode, machine\_detection, record\_calls, recording\_announcement, skip\_recently\_called\_hours, max\_attempts\_per\_contact, default\_country, transcribe\_calls, ai\_call\_feedback, ai\_feedback\_focus, require\_call\_outcome. `update_dialer_settings`' input schema gives each one's meaning and range. The AI cannot place calls: a person dials from the Dialer page using these settings. | `dialer:read` | Read |
| `update_dialer_settings` | Change one or more dialer settings; only the keys passed change and unknown keys are rejected. caller\_id is the workspace default number for reps without one assigned (`assign_phone_number`): one of `list_phone_numbers`, null clears it. voicemail\_mode drop and hangup need machine\_detection on; transcribe\_calls needs record\_calls and machine\_detection on, and ai\_call\_feedback needs transcribe\_calls on: turning a parent off is refused unless its dependents go off in the same call. This configures how a person dials; the AI cannot place calls, start a session or buy numbers. | `dialer:write` | Write |
| `list_caller_ids` | The values caller\_id in `update_dialer_settings` accepts: the workspace's own phone numbers in caller-ID form (phone\_number, friendly\_name, kind). Same numbers as `list_phone_numbers`, which also shows assignments, types and prices. Returns 503 when calling is not configured on this Orbit instance. | `dialer:read` | Read |
| `list_phone_numbers` | List the workspace's phone numbers, oldest first: phone\_number, number\_type (local or toll\_free), friendly\_name, country, capabilities, monthly\_price\_cents, status, assigned\_user\_id, and a members map for the assignees. The Dialer is part of every plan; the workspace rents its numbers and pays for usage (numbers $5/month (local) or $10/month (toll-free), and \$0.02 per outbound minute) on a separate Orbit Dialer subscription. An admin buys and releases numbers in Settings → Dialer. A rep calls from their assigned number, else the workspace default (caller\_id in `get_dialer_settings`), else the oldest. The AI cannot buy, release or dial. | `dialer:read` | Read |
| `assign_phone_number` | Assign one of the workspace's phone numbers to a team member (their calls then show that number), take it back with user\_id null, and optionally relabel it with friendly\_name. One number per person: 409 when they already hold one (unassign that first). Admins only. Number IDs come from `list_phone_numbers`, user IDs from team\_members in `get_crm_schema`. Nothing is bought, released or dialed. | `dialer:write` | Write |
| `get_calling_costs` | What the workspace pays for calling, in cents. The Dialer is part of every plan, billed on a separate Orbit Dialer subscription (numbers $5/month (local) or $10/month (toll-free), and $0.02 per outbound minute; $0.05 per transcribed minute (conversations only, when transcribe\_calls is on); AI call feedback uses one AI credit per call). Returns numbers by type, this month's outbound and transcript minutes (cents billed and pending), feedback credits, list prices, monthly\_total\_cents, subscription, terms (/dialer-terms; current says an admin accepted the version in force) and configured. The AI cannot buy or release numbers or accept the terms; an admin does that in Settings → Dialer. | `dialer:read` | Read |
| `preview_call_list` | Preview the call list a saved contact view (`create_contact_view`, `list_contact_views`) or a contact list (`list_lists`, as list\_id) would produce. Returns how many contacts match, how many are dialable and how many are skipped and why: do\_not\_call, no\_phone, invalid\_phone, unsupported\_country (US numbers only), recently\_called, max\_attempts, duplicate\_phone. A sample of dialable contacts comes back only with contacts:read or dialer:read too; crm:read alone gives counts. A person dials it from the Dialer page; this tool does not start calls. | `dialer:read` | Read |
| `list_dialer_sessions` | List dialing sessions (one person's run through a call list), newest first: the view it came from, who ran it, status (active, paused, completed, abandoned), how many contacts were queued, how many were skipped and why, and the settings in force. Sessions are started only by a person from the Dialer page; the AI reads them. | `dialer:read` | Read |
| `get_dialer_session` | Get one dialing session with its queue: each item carries the contact (name, email, company, call history), the number dialed, its status (queued, calling, done, skipped), skip reason, latest call ID and outcome. Session IDs come from `list_dialer_sessions`. | `dialer:read` | Read |
| `list_calls` | List calls the team has made and received, newest first, with direction (outbound, inbound), inbound\_result (answered, forwarded, voicemail, missed), status (initiated, ringing, in-progress, completed, busy, no-answer, failed, canceled), answered\_by (human, machine, fax, unknown), outcome (a key from `list_call_outcomes`), notes, duration\_seconds, recording\_status and the contact, session and person involved. Filter by contact, session, person, outcome, direction and a started\_at window. | `dialer:read` | Read |
| `get_call` | Get one call: who was dialed and by whom, from and to numbers, status, answered\_by, outcome, notes, started/answered/ended times, duration\_seconds, recording\_status and recording duration, and whether a voicemail greeting was dropped. Call IDs come from `list_calls` or a session's items. | `dialer:read` | Read |
| `update_call_outcome` | Set or correct the outcome and/or notes of a finished call (pass at least one). Outcome keys (built-in and custom\_\*) come from `list_call_outcomes`. Unknown or hidden outcomes are refused (unknown\_outcome, outcome\_hidden). do\_not\_call also adds the number to the do-not-call list; callback with callback\_at adds a Call task then. The session item follows. The AI cannot place calls. | `dialer:write` | Write |
| `list_call_outcomes` | The workspace's call outcomes, for reading calls and `update_call_outcome`. Each has key (the 14 built-ins plus custom\_\* ones), label, description, kind (auto: set from how the call ended; manual: picked by a rep), reached (counts in `get_call_stats`), hidden (can't be set; past calls keep it), built\_in and position. require\_outcome: reps must pick one after each conversation. Read-only (admins edit them in Settings → Dialer); the AI cannot place calls. | `dialer:read` | Read |
| `get_call_stats` | Call statistics for a window (default: the last 30 days): finished calls, how many reached a person and the reach rate, voicemails, total and average talk time, and breakdowns by outcome, by team member and by day. Optionally for one person or one session. truncated is true when the window held more than 20,000 calls. | `dialer:read` | Read |
| `get_call_insights` | A call's transcript and the AI coach's feedback, when the workspace has them turned on (transcribe\_calls and ai\_call\_feedback in `get_dialer_settings`). Returns transcript\_status and feedback\_status (queued, processing, completed, failed, skipped), transcript\_text, transcript\_sentences (speaker, start/end seconds, text, confidence), transcript\_language, transcript\_minutes, and feedback: summary, score (1-10), went\_well, improve, objections, next\_steps, script\_adherence and suggested\_outcome. Only conversations are transcribed; 404 until one was requested; poll while queued or processing. The AI cannot place calls. | `dialer:read` | Read |
| `delete_call_recording` | Delete a call's recording and transcript: the audio is removed at the carrier and the transcript and AI feedback at the transcription service, so the recording can no longer be played or downloaded and `get_call_insights` answers 404 for the call. The call itself (numbers, times, duration, outcome, notes) is kept, with recording\_status "absent". Admins only; 409 when the call has neither a recording nor a transcript. Cannot be undone. | `dialer:write` | Write |
| `list_call_scripts` | List the team's call scripts, default first then by name, with content, is\_default, questions, show\_on and who changed them when. A call script is the text a rep reads during a call (Dialer page), with merge fields filled from the contact dialed (\{\{first\_name}}, \{\{last\_name}}, \{\{full\_name}}, \{\{company}}, \{\{job\_title}}, \{\{email}}, \{\{phone}}, \{\{rep\_name}} (the rep's name)); unknown ones stay as written. Sessions start on the team's default script. As a playbook, show\_on puts it on contact and/or deal pages, and each question saves its answer into a field of that record. | `dialer:read` | Read |
| `get_call_script` | Get one call script with its full content (IDs from `list_call_scripts` or a session's script\_id). A call script is the text a rep reads during a call (Dialer page), with merge fields filled from the contact dialed (\{\{first\_name}}, \{\{last\_name}}, \{\{full\_name}}, \{\{company}}, \{\{job\_title}}, \{\{email}}, \{\{phone}}, \{\{rep\_name}} (the rep's name)); unknown ones stay as written. Sessions start on the team's default script. As a playbook, show\_on puts it on contact and/or deal pages, and each question saves its answer into a field of that record. | `dialer:read` | Read |
| `create_call_script` | Write a new call script for the team. A call script is the text a rep reads during a call (Dialer page), with merge fields filled from the contact dialed (\{\{first\_name}}, \{\{last\_name}}, \{\{full\_name}}, \{\{company}}, \{\{job\_title}}, \{\{email}}, \{\{phone}}, \{\{rep\_name}} (the rep's name)); unknown ones stay as written. Sessions start on the team's default script. As a playbook, show\_on puts it on contact and/or deal pages, and each question saves its answer into a field of that record. Keep it short enough to read aloud: opener, reason for the call, two or three questions, close. is\_default true makes it the default (the previous one loses the flag). The AI cannot place calls. | `dialer:write` | Write |
| `update_call_script` | Change a call script's name, content, is\_default, questions and/or show\_on. Content replaces the whole script. A call script is the text a rep reads during a call (Dialer page), with merge fields filled from the contact dialed (\{\{first\_name}}, \{\{last\_name}}, \{\{full\_name}}, \{\{company}}, \{\{job\_title}}, \{\{email}}, \{\{phone}}, \{\{rep\_name}} (the rep's name)); unknown ones stay as written. Sessions start on the team's default script. As a playbook, show\_on puts it on contact and/or deal pages, and each question saves its answer into a field of that record. is\_default false leaves the team without a default. Running sessions keep their script. | `dialer:write` | Write |
| `delete_call_script` | Delete a call script. Sessions and call insights that used it are kept (their script\_id becomes null); if it was the default, the team has no default until another script is flagged. Cannot be undone. | `dialer:write` | Write |
| `list_do_not_call` | List the team's do-not-call numbers, newest first: phone\_e164, reason (manual, api, import, call\_outcome, email\_unsubscribe, sms\_opt\_out), the contact and source email when known, note, who added it and when. Contacts carrying a listed number are flagged do\_not\_call and left out of every call list. search matches digits of the number or the source email. | `dialer:read` | Read |
| `add_do_not_call` | Add up to 1000 phone numbers to the team's do-not-call list. Numbers in any format are normalised to E.164 using the dialer's default\_country; the result lists added, already\_listed and invalid numbers. Listed numbers are excluded from every call list and the contacts carrying them are flagged do\_not\_call. Pass contact\_id when adding one contact's number. | `dialer:write` | Write |
| `remove_do_not_call` | Remove numbers from the team's do-not-call list, by phone number or by entry ID (pass at least one list). Only a credential whose owner is a team admin can do this; others get 403. Removing a number does not undo an email unsubscribe or SMS opt-out, and the next unsubscribe adds it back. | `dialer:write` | Write |
| `list_voicemail_greetings` | List pre-recorded voicemail greetings, metadata only: name, owner, duration, size, content type and which one is each person's default (the one voicemail\_mode drop plays). The audio is uploaded and played from the dashboard and is not available here. | `dialer:read` | Read |

## Webhooks

Deliver submission events to your own endpoints.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_webhooks` | List webhook subscriptions for the team. | `webhooks:read` | Read |
| `create_webhook` | Create a webhook subscription that delivers events about submissions, contacts, companies, deals, tasks, meetings and calls to an HTTPS endpoint you control. Each event needs its object’s read scope (deal.\* needs deals:read, call.\* needs dialer:read, ...); submission events can be limited to one form. | `webhooks:write` | Outbound |

## Integrations

Which apps are connected to the workspace and whether they are syncing. Credentials never leave Orbit.

| Tool | What it does | Scope | Access |
| - | - | - | - |
| `list_integrations` | List the apps connected to the workspace (HubSpot, Salesforce, Slack, Google Sheets, ...) with their status (connected, error or inactive), the account each is connected as, when it last synced and when its current error started. Never returns credentials or error messages; those stay in Settings > Integrations. | `integrations:read` | Read |

## Annotations

Every tool carries the MCP tool annotations hosts use to decide when to ask before running it. Read-only tools can run without a confirmation; the others are marked by what they change.

| Tool | Read-only | Destructive | Open world | Why |
| - | - | - | - | - |
| All `list_*` and `get_*` tools, `get_available_slots` | yes | no | no | Read data from your team's workspace (availability also reads the host's connected calendar free/busy, which is bounded to that account) |
| `create_contact`, `create_contact_tag` | no | no | no | Add a record to your workspace |
| `add_contact_tag` | no | no | no | Add a tag assignment; repeating it is a no-op |
| `update_contact` | no | yes | no | Overwrites contact fields, including status |
| `remove_contact_tag` | no | yes | no | Removes a tag assignment |
| `add_sequence_unsubscribes` | no | yes | no | Stops active enrollments for those emails |
| `update_meeting` | no | yes | yes | Cancelling notifies the attendee and updates the host's calendar |
| `enroll_contacts_in_sequence` | no | yes | yes | Starts scheduled email sends to the contacts |
| `book_meeting` | no | yes | yes | Creates a meeting and sends calendar invites to both sides |
| `create_webhook` | no | no | yes | Delivers submission events to an endpoint you specify |
| `create_company`, `create_deal`, `create_task`, `create_note`, `create_crm_field`, `create_pipeline`, `create_pipeline_stage`, `create_contact_view` | no | no | no | Add a record or configuration to your workspace |
| `add_deal_contact` | no | no | no | Links a contact to a deal; repeating it is a no-op |
| `update_*` CRM tools, `update_crm_settings`, `reorder_pipeline_stages`, `remove_deal_contact` | no | yes | no | Overwrite or remove values in your workspace |
| `delete_crm_field`, `delete_pipeline`, `delete_pipeline_stage`, `delete_contact_view`, `delete_task`, `delete_note` | no | yes | no | Remove configuration or records |
| `update_dialer_settings`, `update_call_outcome` | no | yes | no | Overwrite dialer settings or a finished call's outcome and notes; no tool places a call |
| `add_do_not_call`, `remove_do_not_call` | no | yes | no | Change the do-not-call list (removal is admin-only) |
| `assign_phone_number` | no | yes | no | Changes which team member a workspace-owned number is assigned to, or its label. Buying and releasing numbers is dashboard-only and has no tool |

## Booking a meeting

An agent books a meeting in three steps: find the scheduling page and event type (`list_scheduling_pages` → `list_event_types`), fetch open slots for a date with `get_available_slots` (working hours intersected with the host's live calendar free/busy), then call `book_meeting` with one of the returned slots. Booking creates the meeting, sends calendar invites to both sides, and triggers configured workflows; a taken slot returns a `409` so the agent can pick another. The `team_id` on these calls is always derived from your credential server-side — it cannot be overridden.

## Rate limits & behavior

MCP tool calls execute the corresponding `/api/v1` endpoints internally, so [REST API rate limits](https://docs.useorbitcrm.ai/developers/api/rate-limits.md) apply unchanged. List tools return the same paginated envelope as the REST API (`data` plus `meta.total` / `meta.page` / `meta.total_pages`); pass `page` and `per_page` arguments to page through results. Tool results include the JSON payload as both text and `structuredContent`; errors carry the HTTP status and the same `error` / `error_description` the REST API returns.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.