Skip to main content
Morphic MCP registers 161 tools, organised into 24 groups. Generated from morphic-mcp v0.4.0. Read Tools Guide first for conventions that apply across tools — the bulk-tool contract, the error envelope, object-type slugs, and worked recipes.
The Paid Add-ons group is not advertised by default. Its tools are hidden unless the operator sets MCP_TOOL_GROUPS to include addons, or the connection URL asks for them with ?tools=addons. Every other group is on by default. See Tool Groups.

Groups


Diagnostics

Always registered, in every group profile — use it to confirm a connection before debugging anything else.

ping

Ping · read-only Test the MCP server connection and confirm env is configured. Parameters: none

Context

Start here for questions. Compacted briefs on the current state of any record, of any object type the workspace has defined, plus semantic recall over the workspace’s indexed history. Cheaper and better-grounded than reading raw records; drill into Records, Activities or Memory only when this falls short. Group id: context.

ask_context

Ask Context · read-only Do not use this tool to resolve a task assignee. When the user asks to create / assign / add / make a task, call list_workspace_members or get_current_user FIRST — CRM people are not assignees; only look up CRM records if they clearly want the task linked to a company, deal, or contact. Otherwise START HERE for any question about this workspace — its records, and also what people have SAID or DONE: past conversations, Slack and Telegram messages, emails, meetings and call transcripts. Every message the workspace has connected is indexed and searchable through this tool. You DO have access to conversation and channel history: it reaches you through this tool, not through Slack’s or Gmail’s own APIs. Never tell the user you cannot search past messages or channel history — call this first and answer from what it returns. Use it even when the question names no record at all (“did anyone mention the staging box?”, “what did we say about pricing last week?”) — the semantic layer answers those. Works across EVERY object type — the workspace defines its own, so this is not limited to any fixed set of record kinds, and you do not need to know the type, its fields or its id in advance. Pass the user’s question verbatim: this resolves which records it is about and returns, for each, a compacted brief of the current state (typically what is going on, the next step, outstanding commitments and anything of concern) plus a semantic recall over the workspace’s indexed history — in one call. Prefer this over search_entities, list_activities and morphic_recall, which return raw, undigested data at higher cost; call those only when this tool’s next_steps says to. If contexts is empty, semantic is still a complete answer — Slack-only workspaces do not auto-create CRM records. Empty semantic too means nothing is indexed yet — say that, rather than claiming you lack access.

get_context

Get Context · read-only Get the compacted brief for ONE record you already have the id of, of ANY object type — the current state in prose (typically what is going on, the next step, outstanding commitments and anything of concern) plus a bounded relationship layer. Use this instead of get_entity when you want to know how the record is DOING rather than read its raw field values. If you only have a name or a question, call ask_context instead — it resolves the record for you.

Schema

Discover the workspace’s record types and their field definitions — the starting point for any CRM read or write. Group id: schema.

list_entity_types

List Entity Types · read-only List all CRM entity types (object types) in this workspace — e.g. people, companies, deals, plus any custom types — returning slug, name and base_type only, not their fields. Call this first to discover valid slugs, then get_entity_type_schema for one type’s attribute slugs before reading or writing entities.

get_entity_type_schema

Get Entity Type Schema · read-only Get the attribute schema (field slugs, names, types, required/relation flags, options) for ONE entity type. Call this after list_entity_types and BEFORE create_entity/update_entity/set_entity_field to learn the exact field slugs.

Records

Create, read, update, link, archive and bulk-edit CRM records of any type — companies, people, deals and custom objects. Group id: entities.

present_crm_card

Present CRM Card (deprecated) · read-only DEPRECATED — do not use. Web chat presentation is owned by the assistant presentation layer (presentation intent → builders → envelope), not MCP. This shim remains for older agents only and does not write to CRM.

list_entities

List Entities · read-only List CRM entities by exact criteria — object type, archive state, specific ids, or field-level filter conditions — returning paginated records with a flat fields dict each. Use this whenever you know the literal value you’re matching on; for conceptual or fuzzy ‘find something about X’ lookups use search_entities (vector search) instead, because search here is a literal substring match only.

get_entity

Get Entity · read-only Get one CRM entity by id with its full fields dict; its relations are STUBS only (id + title), not the related records’ fields. Use this when you only need this record — if you need any field of a related record, call get_entity_with_relations once instead of looping get_entity over the relation stubs. This returns raw field VALUES — if you want to know how the record is DOING (status, next step, risks, recent activity), call get_context or ask_context instead.

get_entity_with_relations

Get Entity With Relations · read-only Get an entity plus the FULL record (fields, not just the id/title stubs get_entity returns) of every entity it’s related to, in one call. Use this whenever the question touches related records — a deal’s contacts, a company’s people — and use get_entity only when the related records’ fields are genuinely irrelevant.

create_entity

Create Entity Create a new CRM entity. Provide the object type slug (e.g. ‘people’, ‘companies’) and a fields dict with attribute values. Use list_entity_types to discover available types and get_entity_type_schema for their attribute slugs.

update_entity

Update Entity · idempotent Update one or more fields on an existing entity. Only provided fields are changed (PATCH semantics).

set_entity_field

Set Entity Field · idempotent Set exactly one field on an entity by attribute slug. Prefer this when changing a single value; use update_entity when writing two or more fields in one round-trip. Link Entities · idempotent Create a relation between two entities, e.g. link a person to a company or a deal to a contact.

search_entities

Search Entities · read-only Semantic / natural-language search across all indexed CRM RECORDS ONLY — every object type the workspace has defined, standard or custom — using vector recall — matches on MEANING, so ‘follow up with Alice about pricing’ can hit records containing none of those words. It does not see Knowledge Base docs, the agent wiki, or memory. NOT a first resort for “how is X doing” style questions: call ask_context first — it resolves the record from the question and returns a pre-compacted brief. Use this to LOCATE records when ask_context resolved nothing, or when you need a ranked list rather than one record’s story. Never use this to resolve a task assignee — that is list_workspace_members / get_current_user. One of four separate retrieval stores: use search_kb_documents for human-authored Knowledge Base docs, wiki_search for agent-distilled team knowledge, and morphic_recall for cross-session memory about this user/workspace. Use it for fuzzy or conceptual lookups; when you know the literal value to match (an email, a name, a stage, an id) use list_entities with search or filters, which is exact and cheaper. Returns entity UUIDs + relevance scores — call get_entity to hydrate full records.

pipeline_overview

Pipeline Overview · read-only High-level pipeline view of CRM entities. For the usual deal pipeline (object_type_slug=deal, group_by_slug=stage) this runs run_pipeline_narration under the hood — same stage/value grouping plus a narrative artifact you should present as a chat card. On web chat, after success call present with type artifact_generic and the returned title/summary/body_markdown (kind pipeline_narration) — do not only summarize in prose or paste a markdown table. For a custom object_type / group_by / value_slug aggregation (not the default deal pipeline), this returns grouped counts/sums only (no card) — scan up to 5000 entities and check truncated on the response.

archive_entity

Archive Entity · idempotent Archive a CRM entity so it no longer appears in default listings. Reversible — use unarchive=true to restore.

delete_entity

Delete Entity · destructive · idempotent Permanently delete a CRM record and its links to other records. Field values stored on the record are removed with it. Meetings, emails, and other activity are kept and marked as belonging to a deleted record; they will no longer appear on a record page. Archive the record instead if you need to keep it and its history. This cannot be undone.

bulk_update_entities

Bulk Update Entities · idempotent Apply the same field updates to up to 200 CRM entities in one call, e.g. moving a batch of deals to a new stage. All entities get the same fields dict — for per-entity different values, call update_entity individually instead. Returns per-id success/failure so partial failures don’t block the rest.

bulk_archive_entities

Bulk Archive Entities · idempotent Archive (or unarchive) up to 200 CRM entities in one call. Reversible — use unarchive=true to restore.

bulk_delete_entities

Bulk Delete Entities · destructive · idempotent Permanently delete up to 200 CRM entities in one call. This cannot easily be undone — prefer bulk_archive_entities when in doubt. Unlink Entities · idempotent Remove a relation between two entities, e.g. unlink a person from a company. Bulk Link Entities · idempotent Create up to 200 entity relations in one call, e.g. linking a batch of contacts to the same company. Returns per-operation success/failure so one bad pair doesn’t block the rest. Bulk Unlink Entities · idempotent Remove up to 200 entity relations in one call. Removes only the links — the entities themselves are untouched; use bulk_archive_entities or bulk_delete_entities to act on the records.

Activities

Log and manage the timeline attached to records: calls, emails, meetings, tasks and custom activity types. Group id: activities.

list_activities

List Activities · read-only List the activity/task timeline, optionally scoped to one entity, type, status, or assignee — this is the unified store for both logged interactions and actionable tasks. For ‘my tasks’ / ‘tasks assigned to me’: call get_current_user, then list_activities with activity_type=‘task’ and assignee_user_id set to that user_id (do NOT page unfiltered activities and scan for a name). Use get_activity when you already have an id, and list_notes for standalone notes. On web chat, after success call present with type task: for lists use body {label, tasks:[{task_id, title, status?, due_date?, assignees?:[{name}]}]} (map subject→title, user_name→assignees); for a single task use {title, task_id?, …}. Do not dump a markdown task/priority bullet list.

get_activity

Get Activity · read-only Fetch one activity or task by id, including description, status, priority, assignee, due date and parent/child task links. Use it to inspect a single record you already have an id for — to find records in the first place, use list_activities. On web chat, after success call present with type task: for lists use body {label, tasks:[{task_id, title, status?, due_date?, assignees?:[{name}]}]} (map subject→title, user_name→assignees); for a single task use {title, task_id?, …}. Do not dump a markdown task/priority bullet list.

create_activity

Create Activity Log a new activity or create a task. Set activity_type to ‘task’ for actionable items with due dates. For create / assign / add / make / reassign a task: resolve the assignee FIRST with list_workspace_members (named teammate) or get_current_user (‘me’ / ‘myself’). Do NOT call ask_context or search_entities to identify who to assign — CRM people/contacts are never assignees. assignee_user_id is a workspace member user_id. entity_id/entity_type is a separate ‘Linked to’ CRM association: set it only when the user clearly wants the task on a record (‘for Acme’, ‘on this deal’, ‘link this to the Alice contact’). A name in ‘assign to X’ is an assignee, not a Linked-to record. To unlink a record, pass entity_id and entity_type both null on update_activity. Use ‘email’, ‘call’, ‘meeting’ to log completed interactions, and activity_type=‘note’ for a note that must appear on the timeline in chronological order alongside them — use create_note instead for a standalone, editable, pinnable note that lives in the entity’s notes panel rather than the timeline. Pass parent_task_id to create a sub-task. For task status, use list_task_statuses — only workspace slugs are accepted. On web chat, after success call present with type task: for lists use body {label, tasks:[{task_id, title, status?, due_date?, assignees?:[{name}]}]} (map subject→title, user_name→assignees); for a single task use {title, task_id?, …}. Do not dump a markdown task/priority bullet list.

update_activity

Update Activity · idempotent Update fields on an existing activity or task. Only provided fields are changed. For create / assign / add / make / reassign a task: resolve the assignee FIRST with list_workspace_members (named teammate) or get_current_user (‘me’ / ‘myself’). Do NOT call ask_context or search_entities to identify who to assign — CRM people/contacts are never assignees. assignee_user_id is a workspace member user_id. entity_id/entity_type is a separate ‘Linked to’ CRM association: set it only when the user clearly wants the task on a record (‘for Acme’, ‘on this deal’, ‘link this to the Alice contact’). A name in ‘assign to X’ is an assignee, not a Linked-to record. To unlink a record, pass entity_id and entity_type both null on update_activity. For status, use only slugs from list_task_statuses (e.g. in_progress — not pending). Pass assignee_user_id to (re)assign, or null to unassign. Pass entity_id and entity_type together to change the Linked-to record, or both null to unlink. Use archive_activity/unarchive_activity/delete_activity for those lifecycle changes instead of this tool.

archive_activity

Archive Activity · idempotent Archive an activity or task so it’s hidden from active views. Reversible with unarchive_activity. Cascades to sub-tasks.

unarchive_activity

Unarchive Activity · idempotent Restore an archived activity or task to active views. Cascades to sub-tasks.

delete_activity

Delete Activity · destructive · idempotent Soft-delete an activity or task. This cannot easily be undone — prefer archive_activity when in doubt.

bulk_create_activities

Bulk Create Activities Log up to 200 activities or tasks in one call — e.g. logging the same call outcome across several entities, or creating a batch of follow-up tasks. Returns per-item success/failure and the created ids. For create / assign / add / make / reassign a task: resolve the assignee FIRST with list_workspace_members (named teammate) or get_current_user (‘me’ / ‘myself’). Do NOT call ask_context or search_entities to identify who to assign — CRM people/contacts are never assignees. assignee_user_id is a workspace member user_id. entity_id/entity_type is a separate ‘Linked to’ CRM association: set it only when the user clearly wants the task on a record (‘for Acme’, ‘on this deal’, ‘link this to the Alice contact’). A name in ‘assign to X’ is an assignee, not a Linked-to record. To unlink a record, pass entity_id and entity_type both null on update_activity.

bulk_update_activities

Bulk Update Activities · idempotent Apply the same field updates to up to 200 activities/tasks in one call, e.g. reassigning a batch of tasks. All activities get the same values — for per-activity different values, call update_activity individually instead. Returns per-id success/failure so partial failures don’t block the rest.

bulk_archive_activities

Bulk Archive Activities · idempotent Archive (or unarchive) up to 200 activities/tasks in one call. Reversible — use unarchive=true to restore.

bulk_delete_activities

Bulk Delete Activities · destructive · idempotent Soft-delete up to 200 activities/tasks in one call. Prefer bulk_archive_activities when in doubt.

complete_task

Complete Task · idempotent Mark a task or activity as completed. Works for any task in the workspace (not only ones assigned to the caller). Prefer this over update_activity for completion.

Notes

Write and manage free-form notes attached to CRM records, individually or in bulk. Group id: notes.

list_notes

List Notes · read-only List standalone notes (title, body, pinned state), newest first, optionally scoped to the entity they’re attached to. Use this to read what people have written up about a record; use list_activities instead for the chronological interaction timeline, including activity_type=‘note’ entries, which do not appear here.

create_note

Create Note Create a standalone note on a CRM entity — durable reference material (context, research, account background) that lives in the record’s notes panel and can later be edited or pinned via update_note. For something that happened at a point in time and belongs in the chronological timeline, call create_activity with activity_type=‘note’ (or ‘call’/‘email’/‘meeting’) instead.

update_note

Update Note · idempotent Edit an existing note in place — title, body, or pinned state; omitted fields are left untouched, and body REPLACES the previous text rather than appending. Use this to revise or pin a note; use create_note when the content belongs in a separate note.

bulk_create_notes

Bulk Create Notes Create up to 200 notes in one call, e.g. logging the same note across a list of entities. Returns per-item success/failure.

bulk_delete_notes

Bulk Delete Notes · destructive · idempotent PERMANENTLY delete up to 200 notes in one call. Notes have no archive state — unlike entities or activities there is nothing to restore, so confirm with the user before calling.

delete_note

Delete Note · destructive · idempotent PERMANENTLY delete one note — notes have no archive state, so unlike archive_entity/archive_activity this is irreversible and there is no restore path. Prefer update_note to correct a note’s contents, and only delete when the user explicitly asks for removal.

Knowledge Base

Search, read and author knowledge-base documents, and pull the workspace’s overall context summary. Group id: kb.

list_kb_documents

List KB Documents · read-only Browse the team Knowledge Base tree. Without parent_id returns root-level items; set fetch_all=true to flatten every folder. Use this to see what exists; use search_kb_documents when you know what you’re looking for. LOSSY: each item’s content_markdown is truncated to a ~160-character excerpt and the BlockNote content field is removed entirely — call get_kb_document for a real body.

search_kb_documents

Search KB Documents · read-only Full-text search over the team KNOWLEDGE BASE ONLY — the human-authored docs, notes and playbooks in the KB UI. It does not see CRM records, the agent wiki, or memory. One of four separate retrieval stores: use search_entities for CRM records of any object type, wiki_search for agent-distilled team knowledge, and morphic_recall for cross-session memory about this user/workspace. Results carry ~160-character excerpts only — call get_kb_document for a full body.

get_kb_document

Get KB Document · read-only Read one Knowledge Base document in full — untruncated content_markdown plus the BlockNote content body that the list/search tools strip. Call this after list_kb_documents or search_kb_documents when an excerpt isn’t enough to answer; it is the only KB tool that returns a complete body, so prefer the search tool first to find the right document id.

create_kb_document

Create KB Document Create a knowledge base document or folder, visible and editable by humans in the KB UI. This is the regular team Knowledge Base — NOT the Agent Wiki (use wiki_write for agent-maintained, read-only-for-humans pages instead).

update_kb_document

Update KB Document · idempotent Update a knowledge base document’s title, content, visibility, or parent folder. Only provided fields change, but content_markdown REPLACES the whole body — read it with get_kb_document first if you only mean to add to it.

get_workspace_context

Get Workspace Context · read-only Fetch the workspace’s AI context — a curated text blob from the knowledge base intended for agent priming. Use this at the start of a session to ground the agent in workspace-specific knowledge. Payload is capped server-side; for a full page use get_kb_document or search_kb_documents.

Wiki

Read and edit the agent-maintained wiki — durable, section-addressable pages the workspace’s agents write to. Group id: wiki. Search Agent Wiki · read-only Semantic search over the AGENT WIKI ONLY — knowledge that agents distilled and wrote back for reuse (decisions, procedures, research write-ups, customer intel). Search it FIRST, before CRM lookups, email scans or web research: one call can replace a whole research session. One of four separate retrieval stores: use search_entities for CRM records, search_kb_documents for human-authored Knowledge Base docs, and morphic_recall for cross-session memory about this user/workspace.

wiki_write

Write Wiki Page · idempotent Create or replace a wiki page with DISTILLED knowledge (not transcripts). Write after completing research, making a decision, learning a procedure, or gathering customer intel — so no future session repeats the work. This is the Agent Wiki (agent-maintained, read-only for humans) — NOT the regular team Knowledge Base (use create_kb_document for that instead).

wiki_append

Append to Wiki Page Add a new dated section to the END of an existing wiki page — the right tool for accumulating findings over time (running customer intel, follow-up notes). Nothing already on the page is touched, so prefer this over wiki_write when you are adding rather than restating; use wiki_edit_section to change an existing section, and wiki_write to author a page from scratch. Not idempotent: calling it twice appends twice.

wiki_edit_section

Edit Wiki Section · idempotent Replace ONE named section of an existing wiki page, leaving every other section byte-identical. Prefer this over wiki_write when you only need to change or add a specific section (e.g. adding a subsection, correcting one part) — wiki_write replaces the whole page, which produces a confusing full-page diff for the human reviewing it if you don’t reproduce every other section verbatim. If no section with this exact heading exists yet, it’s appended as a new section.

wiki_list

List Wiki Pages · read-only Enumerate agent wiki pages (slug, title, category, last-updated) without reading any bodies — use it to see what the wiki already covers before writing a new page, or to find an exact slug for wiki_append / wiki_edit_section. It does NOT match on page content: to answer a question from the wiki, use wiki_search instead.

Memory

Semantic recall over the workspace’s stored knowledge and attachments, plus writing new memories back. Group id: memory.

morphic_recall

Recall Memory · read-only Search persistent CROSS-SESSION MEMORY ONLY — durable facts and preferences remembered about this user/workspace from past conversations. It does not see CRM records, KB docs or wiki pages. NOT a first resort: for any question about a workspace record of any object type, or about what has been happening, call ask_context first — it returns compacted briefs plus a semantic recall over the same indexed history, and tells you if it needs this tool. Reach here when ask_context comes back without what you need, or when the question is specifically about remembered preferences. One of four separate retrieval stores: use search_entities for CRM records of any object type, search_kb_documents for human-authored Knowledge Base docs, and wiki_search for agent-distilled team knowledge. Call with mode=“thinking” only when a prior fast recall was insufficient — it is slower and more expensive, never a first resort.

morphic_attachment_recall

Recall Chat Attachments · read-only Semantically search documents/files the user previously uploaded in chat (PDFs, contracts, notes, etc.). Use when the user refers to an uploaded document without naming a specific attachment id. Do NOT use this for in-app chat turns that already list attachment ids — those are injected deterministically. Internally calls knowledge/recall with kinds=[“chat_attachment”].

morphic_remember

Remember Store a durable fact or preference about THIS USER OR WORKSPACE in cross-session memory — things like how they want reports formatted, or a standing constraint that should survive into future conversations. Retrieved later by morphic_recall. Do NOT use it for CRM data (use create_entity / set_entity_field / create_note so it lands on the record) or for shared team knowledge (use wiki_write or create_kb_document instead).

Calendar

Read and manage calendar events on the user’s connected calendar, and check connection status. Group id: calendar.

list_calendar_events

List Calendar Events · read-only List SCHEDULED CALENDAR EVENTS — things on the calendar, past or upcoming, whether or not anyone recorded them. This is NOT list_meetings: that one returns Attendee-bot recordings with transcripts and recaps. Use this tool for “what’s on my calendar” / “my next meeting”; use list_meetings for “what was said in” / “the recap of” a past call. Filter by date range, linked CRM entity, or free-text search. For upcoming / this week / meetings coming up: ALWAYS pass start_date as now (ISO8601). Omitting both dates defaults the API to now→future — do not rely on paging the full history. For a named event (e.g. “Nat anniversary”), ALWAYS pass search with distinctive title words — do not page through the full calendar. Events synced from Google/Microsoft Calendar and events created here both show up.

get_calendar_event

Get Calendar Event · read-only Get one calendar event by its UUID — full description, times, location, attendees, and the Attendee meeting-bot status if one was requested for it. Use it after list_calendar_events when you need details the list view trims; it will not find an event by name, so search with list_calendar_events first if you only have a title.

get_calendar_connection_status

Get Calendar Connection Status · read-only Check whether Google Calendar and/or Microsoft Calendar are actually connected for this workspace/user. Call this BEFORE telling a user that calendar sync failed or that their calendar looks empty — an unconnected calendar is the usual cause and is a setup problem, not an error worth retrying. Parameters: none

create_calendar_event

Create Calendar Event Create a calendar event. Set join_with_meeting_bot to true to have the Attendee meeting bot join and record/transcribe this specific event (requires meeting_url). Creating a meeting cannot arm recording when the workspace recording default is off — the meeting is still created and the result includes a warning. To record anyway, use update_calendar_event with join_with_meeting_bot=true after the meeting exists. Attendee emails create/link CRM contacts unless create_records_from_attendees is false. Syncs to Google/Microsoft Calendar by default when connected.

update_calendar_event

Update Calendar Event · idempotent Update fields on an existing calendar event. Only provided fields are changed. Set join_with_meeting_bot to true/false to request or cancel the Attendee meeting bot for this event.

delete_calendar_event

Delete Calendar Event · destructive · idempotent Delete a calendar event. This cannot be undone. Also removes it from Google/Microsoft Calendar if synced.

Meetings

Meeting recordings and recaps: transcripts, follow-ups, record linking, and dispatching the note-taking bot. Group id: meetings.

list_meetings

List Meetings · read-only List ATTENDEE-BOT RECORDINGS — only past calls the meeting bot actually joined, transcribed and recapped. These are NOT calendar events: a meeting on the calendar that the bot never joined will not appear here, and nothing upcoming ever will. For “what’s on my calendar” or anything in the future, use list_calendar_events instead; use this when the user asks what was said, decided, or agreed in a past call.

get_meeting

Get Meeting · read-only Get one Attendee-bot recording in full, including the ENTIRE transcript — a large payload that can dominate the context window for a long call. Only call it when you genuinely need verbatim wording; to check whether a topic came up, or to pull the few relevant lines, use search_meeting_transcripts instead, and prefer the recap preview from list_meetings for summaries.

get_meeting_follow_ups

Get Meeting Follow-ups · read-only List the follow-up tasks already generated from a recorded meeting. These are REAL activity records that exist in the CRM — do not re-create them with create_activity; if the user asks for the action items from a call, read them here and reference them, and only use update_activity/complete_task to change their state. Link Meeting To Entity · idempotent Attach a meeting recap/transcript to a CRM record (a person, company or deal) so it shows up on that record’s timeline. Unlink Meeting From Entity · idempotent Detach a meeting recap/transcript from whatever CRM record it is currently on, so it stops appearing on that record’s timeline. It takes no entity argument — it clears the single current link, so use it to correct a mis-link and then call link_meeting_to_entity with the right record. The recording itself is not deleted.

search_meeting_transcripts

Search Meeting Transcripts · read-only Keyword search over meeting transcript text SCOPED TO ONE CRM RECORD — entity_type and entity_id are both required, so this is not a workspace-wide transcript search and cannot answer “did anyone ever mention X”. Resolve the record first with search_entities, then use this to check whether a topic came up and pull the matching lines, instead of loading a whole transcript with get_meeting.

force_join_meeting_bot

Force-Join Meeting Bot · open-world Immediately dispatch the Attendee meeting bot to join a scheduled calendar event’s call right now, rather than waiting for its normal scheduled join time. The event must have a meeting_url.

Automations

Author, publish, run and inspect workflow automations, including their triggers and run history. Group id: automations.

list_workflows

List Workflows · read-only List CRM automations (workflows) with status and run stats. Call this first to see what automations already exist before creating a new one.

get_workflow

Get Workflow · read-only Get one automation’s METADATA — name, status, trigger_summary, and run counters. It does NOT return the trigger/steps graph, so you cannot read or reason about an automation’s actual logic from this; pass the workflow_id to author_workflow to edit that logic, and use get_workflow_run to see what a specific execution actually did.

list_workflow_triggers

List Workflow Triggers · read-only List the trigger types available for automations (e.g. manual, scheduled, webhook, record_created, record_updated, activity_created), with the fields each one exposes as {{trigger.<field>}}. Call this before author_workflow if you need to know exactly which triggers/fields are valid.

create_workflow

Create Workflow Create a new draft automation (metadata only — name/description). The automation has no trigger or steps yet; call author_workflow next to generate and save its actual logic from a natural-language description.

author_workflow

Author Workflow Generate (or edit) an automation’s trigger + steps from a natural-language description, using the same AI Automation Builder the UI uses. Saves the result as a new draft version automatically — call publish_workflow afterward to make it live (it stays a draft otherwise). IMPORTANT: condition/branch nodes are NOT evaluated by the execution engine yet — describe linear automations only (trigger → step → step), not conditional logic. A failed step aborts the whole run, there’s no retry. If the assistant can’t build a valid graph from your description (e.g. a required choice is ambiguous), it replies with a clarifying question instead — workflow_config/version will be null in that case; answer the question and call this again with a more specific message. To iterate on an automation you already built with this tool, pass the current_config from the previous response’s version.workflow_config back in — otherwise each call starts a fresh graph. If you get HTTP 503 / ‘overloaded’ / rate limit, wait ~60s before retrying — do not hammer retries.

publish_workflow

Publish Workflow · idempotent Publish a saved automation version, making it the live one. If the workflow is still in ‘draft’ status, this also activates it. Get version_id from author_workflow’s response.

update_workflow

Update Workflow · idempotent Update an automation’s metadata — rename it, change its status (e.g. ‘paused’ to pause a running automation without deleting it), or mark it a favorite. Does not touch its trigger/steps — use author_workflow for that.

delete_workflow

Delete Workflow · destructive · idempotent Soft-delete an automation. Prefer update_workflow with status=‘paused’ when you just want to stop it running.

enqueue_workflow_manual_run

Run Workflow Now · open-world Manually run a saved automation version right now, outside its normal trigger. Executes for real (actions run against live CRM data) — this is not a dry run. version_id comes from author_workflow’s response.

list_workflow_runs

List Workflow Runs · read-only List past runs of an automation — status, timing, and errors. Use to check whether an automation is actually firing and succeeding.

get_workflow_run

Get Workflow Run · read-only Get details of a single automation run — trigger payload, per-step outputs, and error message if it failed. Use to debug why an automation did (or didn’t) do something.

Revenue Intelligence

Run the LLM-backed GTM analyses: pre/post-meeting packs, deal-risk scans, pipeline narration, executive digests and CRM hygiene. Group id: revenue-intelligence.

run_crm_hygiene_scan

Run CRM Hygiene Scan Scan the whole CRM for data-quality issues right now (missing required fields, deals without a next step, companies without contacts, contacts without a company) instead of waiting for the weekly scheduled scan. Workspace-wide — no entity argument needed. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose. Parameters: none

run_pipeline_narration

Run Pipeline Narration Generate a narrative summary of current deal pipeline movement right now, instead of waiting for the weekly scheduled digest. Workspace-wide — no entity argument needed. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose. Parameters: none

run_executive_digest

Run Executive Digest Generate the high-level executive digest (rolling up recent pipeline narration and workspace-visible deal risk flags) right now, instead of waiting for the weekly schedule. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose. Parameters: none

run_deal_risk_scan

Run Deal Risk Scan Assess risk on a specific deal right now (stale, no next step, negative sentiment, etc.), instead of waiting for the daily scheduled scan. Identify the deal by entity_id or name. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose.

run_account_relationship_snapshot

Run Account Relationship Snapshot Generate an account relationship snapshot for a company — relationship health, key contacts, recent meeting context. Runs on demand; identify the company by entity_id or name. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose.

run_prospecting_brief

Run Prospecting Brief · open-world Generate a prospecting research brief for a company/prospect — web research synthesized into a summary, by existing CRM entity_id or a free-text research_query. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose.

run_pre_meeting_brief

Run Pre-Meeting Brief Load or generate prep notes (talking points, battle cards, entity context) for a specific upcoming meeting. Requires the meeting’s calendar_event_id — look it up with a calendar list/search tool first if you only have a meeting name or date. By default reuses an existing brief for that meeting; set force=true to regenerate. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose.

run_post_meeting_pack

Run Post-Meeting Pack Regenerate the meeting recap (summary, sentiment, action items) for a CRM record’s most recent recorded meeting, instead of waiting for the automatic recap. Always targets that entity’s LATEST meeting, not an arbitrary past one. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose.

list_agent_feed_artifacts

List Agent Feed Artifacts · read-only · idempotent List recent Agent Feed artifacts (Revenue Intelligence briefs already generated) — title, summary, and suggested-follow-up status for each. Use to answer questions about past briefs instead of regenerating one.

get_agent_feed_artifact

Get Agent Feed Artifact · read-only · idempotent Read the full content of one Agent Feed artifact by id — title, summary, full body, and every suggested follow-up with its id/label/status. Use before accepting, dismissing, or updating a specific suggested action. On web chat, after success call present with the returned title/summary/body_markdown (meeting prep → type meeting_prep; other kinds → type artifact_generic with kind) — do not only summarize in prose.

accept_suggested_action

Accept Suggested Action · open-world Accept and execute one suggested follow-up action from an Agent Feed artifact — the same as clicking Accept in the Agent Feed.

dismiss_suggested_action

Dismiss Suggested Action · idempotent Dismiss (reject, without executing) one suggested follow-up action from an Agent Feed artifact.

update_suggested_action

Update Suggested Action · idempotent Edit a suggested follow-up action’s label and/or args before it’s accepted — e.g. correct a drafted task’s title. Only works while the action is still pending.

get_revenue_intelligence_settings

Get Revenue Intelligence Settings · read-only · idempotent Read the current Revenue Intelligence configuration for this workspace: which of the 8 kinds are enabled, their schedule, and delivery_channels (slack, telegram, or both) for proactive posts. Parameters: none

update_revenue_intelligence_settings

Update Revenue Intelligence Settings · idempotent Change Revenue Intelligence settings: enable/disable a kind, set its schedule, or change delivery_channels. Pass kind + patch to change one kind’s settings, and/or delivery_channels.

post_to_slack

Post to Slack · open-world Post a message to this workspace’s connected Slack channel right now — use when the user explicitly asks you to send/deliver/post something to Slack, instead of just answering in chat.

post_to_telegram

Post to Telegram · open-world Post a message to this workspace’s connected Telegram chat right now — use when the user explicitly asks you to send/deliver/post something to Telegram.

publish_routine_report

Publish Routine Report Call this when you finish a scheduled custom routine, to record what you found. Requires the routine_id given in your own instructions for this run — only call this while running a custom routine, never otherwise. Writes a brief to Briefs and marks this routine’s last run. Call it even when there is nothing noteworthy, with a body saying so.

External CRM sync

Push field changes on Morphic records out to a connected external CRM (e.g. HubSpot) and mirror the same change locally, and review records that changed on both sides at once. Group id: connectors.

sync_linked_record

Sync linked record to provider · open-world Create or update a record in a connected external system (HubSpot, Salesforce, Linear, Asana, …) and keep Morphic in sync. Pass record_ref (entity UUID for CRM, activity/task UUID for work). Optional domain=crm|work; optional toolkit when the record has exactly one provider link or a workspace CRM/tasks role is set. Linked records are updated; unlinked HubSpot/Salesforce contacts, companies/accounts, deals/opportunities, and Salesforce leads are created and linked when create is supported. Linear/Asana task create needs workspace provider defaults (team_id / workspace). Prefer list_workspace_connectors for connected toolkits, supports_create, and writeable field slugs. Unmapped keys appear in dropped_fields.

sync_entity_to_provider

Sync record to connected CRM · open-world Compatibility alias for sync_linked_record (CRM entities). Create or update a record in a connected external CRM (HubSpot, Salesforce, Apollo, …) and keep Morphic in sync. Prefer sync_linked_record for Linear/Asana tasks. Linked entities are updated; unlinked HubSpot/Apollo contacts, HubSpot companies, and HubSpot/Apollo deals are created and the provider id is written back. toolkit is optional when the entity has exactly one provider link or a workspace CRM role is set. Prefer list_workspace_connectors for connected toolkits and writeable field slugs. Unmapped keys appear in dropped_fields.

list_workspace_connectors

List workspace connectors · read-only List external connectors for this workspace (catalog ∩ ACTIVE Composio connections — HubSpot, Salesforce, Linear, Asana, …) plus workspace connector_roles (crm / tasks / meetings). Use to see which CRM, task, and meeting-recorder tool the agent should pair with Morphic, and which field slugs sync via sync_linked_record / sync_entity_to_provider. Parameters: none

list_record_mismatches

List mismatched records · read-only List CRM records that changed in BOTH Morphic and the connected external CRM (HubSpot / Salesforce) since the last sync, so neither side can be applied without discarding an edit. Returns the conflicting fields side by side (morphic vs provider value) with when each side changed. Use this to ask the user to review a mismatched record, then call resolve_record_mismatch with their choice.

resolve_record_mismatch

Resolve mismatched record · open-world Settle a record from list_record_mismatches once the user has chosen a version. take_provider copies the external CRM’s values into Morphic; keep_morphic pushes Morphic’s values out to the external CRM so it stops disagreeing; dismiss clears the flag without changing either side (the external CRM will win on a later sync). Show the user both versions and let them choose before calling this.

search_external_records

Search HubSpot / Linear / Salesforce / Asana · read-only · open-world Search a connected external system by name, email, or domain when there is no Morphic record and no provider id. Use this to find HubSpot company XYZ, a Salesforce account, a Linear issue, or a contact/deal already in this workspace’s own Apollo account. Returns provider_record_id to pass to sync_linked_record (toolkit + object_key). For NET-NEW Apollo prospects not yet in this CRM, use search_apollo_prospects instead — this only searches records that already exist on the connected side. Omit toolkit to search the workspace CRM and tasks providers.

discover_composio_tools

Discover connected integration tools · read-only · open-world Discover read-only tools for one integration explicitly selected by the user. Use the toolkit slug from the selected integration context. Without tool_name, returns a COMPACT browse list (name + one-line description only, no schema) — pick the tool you need from that list, then call this again WITH tool_name to get that one tool’s full description and input_schema before calling call_composio_read_tool. Do not skip the tool_name call: the browse list deliberately omits input_schema so it stays small.

call_composio_read_tool

Call a connected read-only integration tool · read-only · open-world Call one read-only tool returned by discover_composio_tools. The backend revalidates the selected toolkit, connection ownership, and tool allowlist before execution.

Amplemarket

Use the asking user’s own Amplemarket seat — check their connection, discover which of the 9 tool categories their plan includes, and run one. Per person, not per workspace. Group id: amplemarket.

get_amplemarket_connection_status

Check your Amplemarket connection · read-only Check whether the person asking has connected their OWN Amplemarket account, and how many teammates have connected theirs. Amplemarket is a named-seat product connected per person, so there is no workspace-wide connection: a teammate being connected does NOT let this user act. Use this before suggesting any Amplemarket action, and to answer ‘why can’t I use Amplemarket?’ accurately. Amplemarket is for LIVE ENGAGEMENT on things already in motion (a reply, a sequence, deliverability) — for finding or enriching a company/person, prefer Apollo instead. Parameters: none

list_amplemarket_capabilities

List your Amplemarket capabilities · read-only · open-world List what THIS user’s Amplemarket account can actually do right now: which of the 9 categories (Searcher, Enrichment, Contacts & Accounts, Lead Lists, Sequences, Workflows, Analytics, Duo, Unibox & Tasks) are available to them, and the exact tool names and argument schemas inside each. ALWAYS call this before call_amplemarket_tool — Amplemarket tool names are not a fixed list and differ per person by plan tier and seat. Categories reported as unavailable are not in that user’s plan: do not offer them. Scope check before you call this: Amplemarket is for LIVE ENGAGEMENT on something already in motion (a reply, a sequence, deliverability, an inbox task) — if the ask is to FIND or ENRICH a company or person, prefer Apollo instead.

call_amplemarket_tool

Run an Amplemarket tool · open-world Run one Amplemarket tool using this user’s own connected seat. Get tool_name and its arguments from list_amplemarket_capabilities first — never guess a name. This spends the USER’S OWN Amplemarket credits (enrichment is about 0.5 credits per record) and can write into their sequences, lead lists and tasks, so confirm with them before running anything that touches more than a handful of records. Use this for LIVE ENGAGEMENT work only — replies, sequences, deliverability, inbox tasks. Discovery and enrichment belong to Apollo, which is workspace-wide and consistent for every teammate. An Amplemarket record and an Apollo record for the same person share no identifier: never assume they refer to each other.

TinyFish

Search the web, read pages, and drive a real browser to complete website tasks, using the asking user’s own TinyFish account. Search and page reads are free; browser automation is metered against that user’s wallet. Per person, not per workspace. Group id: tinyfish.

get_tinyfish_connection_status

Check your TinyFish connection · read-only Check whether the person asking has connected their OWN TinyFish account, and how many teammates have connected theirs. TinyFish is connected per person and metered against that person’s own wallet, so there is no workspace-wide connection: a teammate being connected does NOT let this user act. Use this before suggesting any TinyFish action, and to answer ‘why can’t I use TinyFish?’ accurately. Parameters: none Search the web · read-only · open-world Search the web for current, source-backed facts using this user’s TinyFish account. FREE — use it first for anything current, public or external: today’s/latest questions, weather, documentation and API setup, product/company/tool explanations, comparisons, and ‘what is’ / ‘how does it work’ questions about real technologies, standards or companies. Use it even when the user doesn’t say ‘search’. Cheaper in tokens than fetching pages, so use it before tinyfish_fetch_content whenever the right page isn’t known yet. Skip it only when the answer should come purely from workspace data, or the user said not to use external sources.

tinyfish_fetch_content

Read web pages · read-only · open-world Read one or more web pages and extract clean, structured content, using this user’s TinyFish account. FREE. Use when the user gives a URL, or after tinyfish_search when a grounded answer needs detail from a specific source: summarising pages, extracting article/docs/product/pricing content, inspecting documentation. Renders in a real browser, so JavaScript-heavy pages work, and is preferred over raw HTTP fetching. Up to 10 URLs per call, fetched in parallel. This tool only READS — use tinyfish_run_web_automation when the task needs clicking, navigating, form-filling or login.

tinyfish_run_web_automation

Run a web automation · open-world Drive a real browser to complete ONE user-directed website task on this user’s TinyFish account: navigating a page, clicking, filling forms, logging in, or completing a workflow. This is METERED against the USER’S OWN TinyFish wallet — confirm with them before running it. Use it only when the task genuinely needs interaction: to find information use tinyfish_search, and to read a page use tinyfish_fetch_content — both are free. Runs take a few minutes and return a run_id: poll it with tinyfish_get_run rather than starting the run again.

tinyfish_get_run

Check a web automation run · read-only · open-world Check the status and result of a web automation started with tinyfish_run_web_automation. FREE — it only reads state, and is the correct way to wait: while the status is pending or running, call this again with the same run_id rather than starting a new run. When it reports completed, failed or cancelled, the result or error is included — present that to the user. Omit run_id to list recent runs if the id was lost.

list_tinyfish_capabilities

List your TinyFish tools · read-only · open-world List the exact TinyFish tools THIS user’s account exposes right now. ALWAYS call this before call_tinyfish_tool — TinyFish tool names are not a fixed list and differ per account and client, so they are never guessable. For web search, page reading, browser automation or run polling, prefer the dedicated tinyfish_* tools instead; this is for everything else (batching, browser sessions, usage and wallet reads). Tools already covered by a dedicated tool are marked with prefer_instead. Parameters: none

call_tinyfish_tool

Run a TinyFish tool · open-world Run one TinyFish tool using this user’s own connected account. Get tool_name from list_tinyfish_capabilities first — never guess a name. Use this ONLY for capabilities the dedicated tools don’t cover (batching, browser sessions, usage and wallet reads): for web search use tinyfish_search, for reading pages use tinyfish_fetch_content, for browser interaction use tinyfish_run_web_automation. Automation and big-search tools reached this way spend the USER’S OWN TinyFish wallet, so confirm with them before running anything bulk.

Meeting notetakers

Search and read the asking user’s meeting transcripts, summaries and action items across every notetaker they have connected (Granola, Fireflies, Fathom, Otter, Circleback, Read.ai, Sybill, Plaud, tl;dv, Gong). Read-only, and per person rather than per workspace — a connected teammate does not let this user read anything. Group id: notetakers.

list_notetaker_connections

Check your meeting notetaker connections · read-only List which meeting notetakers the person asking has connected (granola, fireflies, fathom, otter, circleback, read_ai, sybill, plaud, tldv, gong). Notetakers are connected per person and read that person’s own meetings, so there is no workspace-wide connection: a teammate being connected does NOT let this user read anything. Call this before telling someone you cannot find their meetings — the honest answer differs depending on whether they have connected anything at all. Parameters: none

search_notetaker_meetings

Search meeting transcripts · read-only Search this person’s meeting transcripts and notes across EVERY notetaker they have connected. Use for anything about what was said, decided or promised in a meeting. Pass the user’s question verbatim — do not pre-extract names or dates. Leave vendor unset unless they named one; searching all their connections is almost always what they want. Note this searches the VENDOR’s copy directly — for meetings already ingested into Morphic, ask_context is usually better because it also covers email, Slack and CRM records.

list_recent_notetaker_meetings

List recent meetings · read-only List this person’s recent meetings from their connected notetakers. Use when they ask WHICH meetings they had; for what was SAID in one, use search_notetaker_meetings or get_notetaker_meeting instead.

get_notetaker_meeting

Get one meeting in full · read-only Fetch one meeting’s full detail — transcript, summary, attendees — from a specific notetaker. Both arguments come from a previous search_notetaker_meetings or list_recent_notetaker_meetings result: meeting ids are the vendor’s own and are NOT interchangeable between vendors.

get_notetaker_action_items

Get a meeting’s action items · read-only Fetch the action items a notetaker extracted for one meeting. Prefer this over re-deriving them from a transcript: the vendor has already done it, and its list is what the user sees in that product. Some vendors fold action items into the summary instead — this says so rather than failing.

list_notetaker_tools

List a notetaker’s own tools · read-only List the tool names one connected notetaker actually exposes to this user. Vendor surfaces differ by plan and change without notice, so read this before using call_notetaker_tool rather than guessing a name.

call_notetaker_tool

Call a notetaker tool directly · open-world Escape hatch: call any tool a connected notetaker exposes, by its own name. Use ONLY when the neutral tools (search_notetaker_meetings, list_recent_notetaker_meetings, get_notetaker_meeting, get_notetaker_action_items) do not cover what is needed. Call list_notetaker_tools first — passing a name the user’s account does not expose will simply fail.

Apollo

Search Apollo’s global prospect database, enrich people and companies, log calls and tasks that push into Apollo, and enroll contacts in an existing Apollo sequence. Workspace-wide, connected once via Composio. Group id: apollo.

search_apollo_prospects

Search Apollo’s global prospect database · read-only · open-world Search Apollo’s global prospect database for people matching filters (job title, location, company headcount). Use this to find NET-NEW prospects — people who may not exist in this CRM or in this workspace’s own Apollo account yet. For contacts already in this workspace’s Apollo account, use search_external_records with toolkit=‘apollo’ instead. Spends real Apollo credits per call — confirm scope with the user before running a broad or repeated search. Combining many strict filters can return zero results; start broad and narrow iteratively. Null email/phone fields on returned people are normal, not errors — enrich_apollo_person can sometimes fill them in, at additional credit cost.

enrich_apollo_person

Enrich a person via Apollo · read-only · open-world Enrich one person’s profile via Apollo — full name, title, company, location, and (when available) email/phone. Requires email, linkedin_url, or first_name+last_name plus organization_name/domain — name-only usually returns no match. Spends real Apollo credits per call, and a miss (no match found) is a normal, valid outcome, not an error. Does not reveal phone numbers — that costs extra credits and isn’t wired up yet.

enrich_apollo_organization

Enrich a company via Apollo · read-only · open-world Enrich a company’s profile via Apollo by domain — funding, headcount, tech stack, industry, and more. Results are most meaningful when the company already exists in Apollo’s database. Spends real Apollo credits per call and may be unavailable on free plans; a miss (no match) is a normal, valid outcome, not an error.

search_apollo_sequences

Search this workspace’s Apollo sequences · read-only Search this workspace’s own Apollo outreach sequences by name. Use this before add_apollo_contacts_to_sequence — you need a real sequence_id and emailer_campaign_id (they are the same value) from here, never guessed. Apollo has no tool to create or activate a sequence — this only finds sequences a human already built and turned on in Apollo’s own UI. Read-only, no Apollo credits spent.

list_apollo_email_accounts

List this workspace’s connected Apollo email accounts · read-only List the email accounts connected to this workspace’s Apollo account. Use this before add_apollo_contacts_to_sequence — its send_email_from_email_account_id argument must be a real id from here, never guessed. Read-only, no Apollo credits spent, no arguments. Parameters: none

add_apollo_contacts_to_sequence

Add contacts to an Apollo sequence · open-world Enroll one or more existing Apollo contacts into an existing, already-active Apollo sequence. This is the only real outreach action Apollo/Composio expose — there is no tool to send a one-off email or to create/activate a sequence, only to add contacts to one a human already built. Triggers real outbound emails to real people once the sequence runs its next step — call search_apollo_sequences and list_apollo_email_accounts first to get real ids, and confirm with the user before running this. Never guess sequence_id, emailer_campaign_id, or send_email_from_email_account_id.

update_apollo_contact_sequence_status

Update a contact’s status in an Apollo sequence · open-world Change an Apollo contact’s status within a sequence they are already enrolled in — pause them, mark them replied/finished, bounced, or unsubscribed. Cannot set status to ‘active’: Apollo’s own API rejects that on this action — use add_apollo_contacts_to_sequence to (re)activate someone instead. Real, externally-visible effect on live outreach (e.g. ‘unsubscribed’ stops all future emails to this contact in this sequence) — confirm with the user before running this.

log_apollo_call

Log a call and push it to Apollo · open-world Log a phone call and push it to Apollo as a call record, when the linked contact is Apollo-linked. Use this instead of log_call when the call should show up in Apollo, not just the CRM. contact_id, when given, must already be Apollo-linked for the push to happen — the call is still logged in Morphic either way, and the response says whether the Apollo push actually happened.

create_apollo_task

Create a task and push it to Apollo · open-world Create a task and push it to Apollo as an Apollo task. Requires an already Apollo-linked contact_id and an apollo_owner (an Apollo team member — name, email, or Apollo user id, resolved against this workspace’s Apollo user directory) — Apollo’s own API requires both, this is not an artificial restriction, and the call fails closed (no Morphic task is created either) if the contact isn’t Apollo-linked. Use create_task instead for an ordinary CRM-only task. apollo_owner is distinct from an optional ‘assignee’ (a Morphic workspace member) — do not conflate the two.

Clay

Search Clay’s GTM database, run Clay routines and check their results, read Clay Tables data, and check the workspace’s Clay credit balance. Workspace-wide, one API key for the whole team — connected directly to Clay’s Developer API, not via Composio. Group id: clay.

get_clay_connection_status

Check this workspace’s Clay connection · read-only Check whether THIS WORKSPACE has connected a Clay API key. Clay is workspace-scoped — unlike Amplemarket, every teammate shares the same connection, so there is no per-person answer here. Use this before suggesting any Clay action. Parameters: none

check_clay_credits

Check this workspace’s Clay credit balance · read-only · open-world Read this workspace’s Clay Data Credits / Actions balance. Call this before a bulk search_clay or run_clay_routine call to confirm there’s enough balance for it. Parameters: none

get_clay_search_reference

Get Clay’s search-query authoring reference · read-only · open-world Fetch Clay’s own reference for writing a Clay search query. search_clay takes Clay’s SQL-like DSL (SELECT FROM PEOPLE | COMPANIES | JOBS), not prose — call this first to translate a user’s description of an audience into that syntax. Costs no credits. Parameters: none

list_clay_routines

List registered Clay routines · read-only List the Clay routines registered for this workspace, by name. Call this before run_clay_routine — routines are referenced by name, and Clay has no API to discover them, so only routines an admin has registered can be run. Costs no credits. Parameters: none

search_clay

Search Clay’s GTM database · read-only · open-world Search Clay’s GTM database for people or companies matching a natural-language query. Spends this workspace’s Clay credits — call check_clay_credits first before a large search. Clay and Apollo both do discovery/enrichment and can overlap significantly; ask the user which they mean if both are connected and it isn’t obvious.

run_clay_routine

Run a Clay routine · open-world Run a Clay routine — a custom enrichment/workflow built in the Clay UI — against 1-100 items, by its registered NAME (call list_clay_routines first). Spends this workspace’s Clay credits and can write into the routine’s own downstream destinations (lead lists, sequences). Routines run asynchronously: use get_clay_routine_run with the returned run id to check progress and results rather than assuming this call finishes the work.

get_clay_routine_run

Check a Clay routine run’s progress · read-only · open-world Check progress and results for a routine run started with run_clay_routine. Read-only — does not spend additional credits or re-trigger the routine.

run_clay_table_query

Query a Clay table · read-only · open-world Query data already sitting in a Clay table. Requires an Enterprise Clay plan — if this workspace’s Clay account isn’t on that tier, this returns an honest ‘not available on your plan’ result rather than failing silently.

Clay (MCP)

Prospect and enrich companies and contacts via Clay’s own hosted MCP server, using the asking user’s own OAuth connection. Per person, not per workspace — unlike the Clay group above, which is one shared workspace API key. Group id: clay_mcp.

get_clay_mcp_connection_status

Check your own Clay MCP connection · read-only Check whether the ASKING USER has connected their OWN Clay account via OAuth. Clay MCP is per-person — a connected teammate does NOT let this user act. Use this before suggesting any Clay MCP action. Parameters: none

check_clay_mcp_credits

Check this user’s Clay credit balance · read-only · open-world Check whether this Clay workspace has credits available (workspace, sales-rep, and budget credits where enabled). Call this before find_clay_mcp_company or find_clay_mcp_contacts_at_company, which spend credits. Parameters: none

get_clay_mcp_workspace

Check which Clay workspace this user is connected to · read-only · open-world Report which Clay workspace this user’s connection is pinned to (name, id, URL). Use when the user asks which Clay workspace they are connected to. Parameters: none

find_clay_mcp_company

Prospect a company via Clay · read-only · open-world Prospect and research a single company’s PUBLICLY AVAILABLE info by domain or LinkedIn URL (e.g. ‘Tell me about Stripe’, “What’s OpenAI’s funding?”). NOT for the user’s own CRM accounts/deals. Never add company_data_points unless the user explicitly asked for that data — enrichments cost credits. Returns a task_id — follow up with get_clay_mcp_task_context to read enrichment results. There is NO tool here to run a saved Clay routine, Workflow, or Claygent by name — if asked to run one, say so plainly rather than stuffing its name into a ‘Custom’ data point as a substitute.

find_clay_mcp_contacts_at_company

Find contacts at a company via Clay · read-only · open-world Find TYPES of people at a company by role/title/department (e.g. ‘engineers at Stripe’, ‘VPs at OpenAI’). For SPECIFIC named people, this is the wrong tool. Filters combine with AND; values within one filter combine with OR. Never filter results yourself — re-call this tool with adjusted filters. Never add data points unless the user explicitly asked for them — enrichments cost credits. Returns a task_id — follow up with get_clay_mcp_task_context to read results. There is NO tool here to run a saved Clay routine, Workflow, or Claygent by name — if asked to run one, say so plainly rather than stuffing its name into a ‘Custom’ data point as a substitute.

get_clay_mcp_task_context

Read Clay enrichment results · read-only · open-world Read enrichment results for a prior find_clay_mcp_company or find_clay_mcp_contacts_at_company call, by its task_id. NEVER tell the user data wasn’t found without calling this first — the initial search response only has base fields. Response shape: contacts are a top-level contacts array (NOT nested under companies); each contact’s requested enrichments (e.g. Email) appear in its own enrichments array as {name, state, value} — check state == "completed" and read value, don’t look for a plain top-level email field. If state isn’t "completed" yet, poll again rather than answering with missing data.

Stage Requirements

Discover and propose deterministic entry requirements for a CRM pipeline stage — read the connected pipeline’s stages, existing requirements and revision history, then propose a new or updated requirement for the user to confirm on a review card. Group id: stage-requirements.

list_stage_requirement_stages

List Stage Requirement Stages · read-only List the stable attribute id and every option (id/value/label/outcome/is_terminal) that Stage Requirements can govern for one object type — the connected CRM’s imported pipeline stages, or native Morphic Deal Stage options. Call this BEFORE propose_stage_requirement to resolve stage_attribute_id and target_option_id; defaults to deals/deal_stage.

list_stage_requirement_policies

List Stage Requirement Policies · read-only List every Stage Requirement policy on an object type — status (active/disabled_*), which stage value it governs, and its revision count. Use this to answer ‘what requirements exist today’ or to find the policy_id a ‘change’ or ‘disable’ request refers to.

get_stage_requirement_revision_history

Get Stage Requirement Revision History · read-only List every immutable revision of one Stage Requirement policy (revision number, plain-language summary, created_at) — use this to explain how a requirement has changed over time.

list_stage_requirement_activity_types

List Stage Requirement Activity Types · read-only List the canonical activity types (meeting/call/email/task) and states (logged/completed) an activity requirement leaf can use. Call this if unsure of the exact vocabulary. Parameters: none

propose_stage_requirement

Propose Stage Requirement Validate and canonicalize a Stage Requirement proposal — activates NOTHING. Resolve every schema id yourself first (list_stage_requirement_stages for stage_attribute_id/target_option_id, get_entity_type_schema for field/relation attribute ids) — never guess an id. If a field the user wants doesn’t exist yet, create it first (create_attribute) and confirm that, THEN call this. On success, call present with type=‘stage_requirement_review’ and this tool’s returned body PASSED THROUGH VERBATIM, unmodified — do not re-describe it in markdown. The user confirms or declines the card directly; there is no separate activation tool. Web channel only.

scan_stage_requirement_violations

Scan Stage Requirement Violations · read-only For the opt-in Stage Requirement Violations monitoring routine ONLY. Returns every deal still failing an accepted violation (a provider-sync or import write that landed despite not meeting a requirement) — a deal drops off this list automatically once it leaves the stage, is overridden, or becomes compliant, so this tool never needs a prior-run cursor. If the routine’s object type is connected to a CRM, refresh that CRM’s pipeline first (sync_linked_record or the equivalent refresh tool) so results reflect the latest inbound state — this tool does not fetch provider data itself. Report the list to the user; do not judge compliance yourself.

Workspace

Identify the current user, list workspace members, and read workspace-level configuration. Group id: workspace.

get_current_user

Get Current User · read-only Who is making this request: their name, Morphic user_id, and whether they’re linked to a CRM contact record. Use the returned user_id directly as assignee_user_id when they ask you to assign something to themselves (‘assign it to me’). They are a WORKSPACE MEMBER (staff), not a CRM contact — never search the CRM to identify them. If requester is null this caller’s identity isn’t known; ask who they are rather than guessing. Parameters: none

list_workspaces

List Workspaces · read-only Workspaces this connection may reach. Use the returned slug in ?workspace=<slug> on the connect URL when the user belongs to more than one and has not named one. These are Morphic team workspaces, not CRM records. Parameters: none

list_workspace_members

List Workspace Members · read-only List the members of this workspace with their user_id, name, and email. Use this to resolve a TEAMMATE’s name to a user_id before calling create_activity/update_activity with assignee_user_id. Call this FIRST when the user says create / assign / add / make a task for a named person — before ask_context or search_entities. These are workspace members (staff) — a different thing from CRM contacts/people, which have their own entity ids and are never valid assignees. For the person currently talking to you, use get_current_user instead of scanning this list.

list_task_statuses

List Task Statuses · read-only List task status slugs configured for this workspace (label, slug, whether it counts as completed). Call this before create_activity/update_activity when setting status — only these slugs are valid (typically not_started, in_progress, completed, cancelled, plus any custom statuses). Never invent slugs like pending.

Task Suggestions

Review and accept the agent-generated task suggestions queued for the workspace. Group id: tasks.

list_task_suggestions

List Task Suggestions · read-only List AI-generated task suggestions for a specific CRM entity. These are suggested next actions inferred from ingested emails, meetings, and signals.

accept_task_suggestion

Accept Task Suggestion · idempotent Accept one AI-generated suggestion from list_task_suggestions, converting it into a real task activity linked to the same entity and marking the suggestion accepted. Use this whenever the user approves a suggestion; use create_activity for a task the user described themselves, which has no suggestion behind it.
Search the public web and fetch page content for research that goes beyond workspace data. Group id: search. Web Search · open-world Search the web for current information, news, or external data. This is the DEFAULT web search tool — prefer it over parallel_search. Use it when you need up-to-date, factual, or publicly available information that is not in the CRM or workspace. COST: each call consumes workspace credits, so call it only when the answer genuinely requires external information — do not call it speculatively, and do not repeat a near-identical query. Prefer mode=quick|standard|deep (deeper modes cost more). Optional output_schema enables synthesized output. Returns title, URL, snippet, published date, and optional synthesized output.
Marketplace add-ons billed separately and usable only once installed for the workspace: Parallel Search, Flint and AgentMail. Group id: addons. Parallel Search (paid add-on) · read-only · open-world Search the web using Parallel Search — a paid add-on tool. Must be installed via Marketplace → Add-ons before use. DO NOT use this as your default web search: use web_search for web lookups. Only use parallel_search when (a) the user specifically asks for Parallel / Parallel Search by name, or (b) web_search already ran and returned nothing usable for this query. Never call both for the same question as a matter of course.

flint_action

Flint (paid add-on) · destructive · open-world Perform a WRITE action in Flint — a paid add-on that builds/updates live landing pages and manages connected ad accounts. Must be installed via Marketplace → Add-ons before use. WHEN TO CALL: only when the user explicitly names Flint, or explicitly asks you to create/change a landing page or an ad/ad-account setting. If the request is ambiguous, ask first — do not infer it. NEVER call this to answer a question, to look something up, to check status, or to see what Flint would do. It has no read-only mode: every call makes a real external change (a page published or edited, ad spend or targeting altered) that is visible outside this workspace and may not be undoable. Repeating a call can duplicate the change.

agentmail_action

AgentMail (paid add-on) · destructive · open-world Send, list, or read email through the agent’s own AgentMail inbox — paid add-on, must be installed via Marketplace → Add-ons. ACTIONS and their payload keys: • send — DELIVERS A REAL EMAIL to real recipients immediately. payload: { to: string[] (or a single address string, required), subject: string, body: string (alias: text), cc?: string[] | string }. Only call after the user has explicitly approved sending, and echo the recipients and subject back to them first. There is no undo. • list_messages — list messages in the inbox. payload: { limit?: number }. • read_message — fetch one message. payload: { message_id: string }. list_messages and read_message are not implemented on the backend yet and currently return error_code ‘not_implemented’. Do NOT use this to draft emails for chat. For drafts, write To/Subject/Body in your reply; the web UI shows an editable card automatically.