How it works
Fishladder is a remote MCP server. Add it to Claude (Settings → Connectors → Add custom connector) with this URL, then sign in to Fishladder when Claude asks:
https://app.ladder.fish/api/mcp- Claude acts as you. It can only do what you can do in Fishladder, and changes appear under your name. A write tool asks for your confirmation before it runs.
- The tools offered depend on your access. Viewers get read tools only; tools for modules you can't open aren't offered at all; tools marked Admins need the admin role. So the list below is the most anyone sees.
- HubSpot replaces the CRM. The HubSpot tools appear only when your team has HubSpot connected, and the CRM tools disappear then (the built-in CRM is switched off).
- One team per connection. Every result names the team it read from. Use whoami, list_teams and switch_team when data looks missing.
- Restricted boards stay restricted. Boards in project groups you can't open, and their tasks, don't appear in any result and can't be changed.
- Results carry a
urlfor the thing they describe, and an empty result carries anoteexplaining why, written to be passed on to you.
For examples of what to ask, see Using the Claude connector. Inputs marked * are required.
Team & account
list_team_membersList team membersReadEveryoneList the people on this team with their user IDs. Call this to turn a name mentioned by the user into an assigneeId or ownerId before filtering or creating anything.
No inputs.
whoamiWho this Fishladder connection is signed in asReadEveryoneReport which Fishladder account this connection is authenticated as, which team it is reading from, and what that account can do there. Use it when they ask who they are connected as, and whenever results look wrong or a team name cannot be found — the common cause is that the connector was authorized by a different account than they have in mind, and no other tool can reveal that.
No inputs.
list_teamsList your Fishladder teamsReadEveryoneList the Fishladder teams this person belongs to, and say which one this connection reads from. Use this when an answer looks wrong or empty and they expected data — the connection covers one team at a time, and they may be thinking of another. Also use it when they ask which teams they have, or before switch_team if the name they gave is ambiguous. To change team, call switch_team — it takes effect immediately, with no reconnect. If the team they want is not in this list, call whoami: the connector is probably authorized as a different account than they expect.
No inputs.
switch_teamSwitch Fishladder teamWriteEveryoneChange which Fishladder team this conversation reads from and writes to. Accepts the team name as the person would say it. Use list_teams first if you are unsure what exists, or if the name given is ambiguous. Everything after this — tasks, CRM, wiki — comes from the new team, and their role and modules there may differ.
| Input | Type | Description |
|---|---|---|
team* | string | Team name, or part of it. Case-insensitive. |
Projects (tasks & boards)
list_tracker_projectsList tracker boardsReadEveryoneProjectsList tracker projects (task boards). Call this first when the user names a board or you need a projectId for search_tasks or create_task.
| Input | Type | Description |
|---|---|---|
includeArchived | boolean | Include archived boards (default false). |
limit | integer | Maximum rows to return (default 50, max 200). |
create_tracker_boardCreate a tracker boardWriteAdminsProjectsCreate a tracker board — the columns and statuses that tasks live on. Use this when someone is starting a new piece of work and there is no board for it yet; check list_tracker_projects first so you do not make a second board for something that already has one. A board is created from a template, which decides its starting columns and statuses. Pass skipTasks true unless they want the template's example tasks as well.
| Input | Type | Description |
|---|---|---|
name* | string | What the board is called. |
description | string | What the board is for. |
template | string | Template to build it from. Defaults to blank. Ask if you are unsure rather than guessing — the template decides the columns and statuses, and changing them afterwards is more work than choosing correctly. |
skipTasks | boolean | Leave out the template's example tasks. Defaults to true here. |
search_tasksSearch tasksReadEveryoneProjectsSearch tracker tasks by free text, project, assignee, or priority. Use this for any question about work items — what someone is working on, what is overdue, or whether something already exists before creating it.
| Input | Type | Description |
|---|---|---|
query | string | Free-text match against task title and description. |
projectId | string | Restrict to one tracker project (see list_tracker_projects). |
assigneeId | string | Restrict to one assignee (see list_team_members). |
priority | string | Filter by priority: "none", "low", "medium", "high", "urgent". |
includeCompleted | boolean | Include tasks in a closed status (default false). |
limit | integer | Maximum rows to return (default 50, max 200). |
create_taskCreate a taskWriteMembers & adminsProjectsCreate a tracker task. Search first with search_tasks to avoid duplicates, and resolve the assignee with list_team_members rather than guessing an ID.
| Input | Type | Description |
|---|---|---|
projectId* | string | Tracker project to create the task in (see list_tracker_projects). |
title* | string | Short imperative title. |
description | string | Optional detail, plain text. |
assigneeId | string | Optional assignee user ID (see list_team_members). |
priority | string | Optional priority: "none", "low", "medium", "high", "urgent". |
dueDate | string | Optional due date as YYYY-MM-DD. |
update_taskUpdate a taskWriteMembers & adminsProjectsUpdate a tracker task: change its status, mark it complete or reopen it, or edit its title, description, assignee, priority or due date. Find the task with search_tasks first. Only the fields you pass are changed; everything else is left alone. To move a task to a named column, read the status IDs from search_tasks rather than guessing.
| Input | Type | Description |
|---|---|---|
taskId* | string | Task to update (see search_tasks). |
title | string | New title. |
description | string | New description, plain text. |
assigneeId | string | New assignee user ID (see list_team_members). |
priority | string | New priority: "none", "low", "medium", "high", "urgent". |
dueDate | string | New due date as YYYY-MM-DD. |
statusId | string | Move the task to this status/column. Must belong to the same board. |
completed | boolean | True marks the task complete, false reopens it. |
attach_file_to_taskAttach a file to a taskWriteMembers & adminsProjectsAttach a file to a tracker task — PNG, JPEG, GIF, WEBP or PDF — passed as base64. Use it for something you produced in this conversation, such as a chart you generated or a report you assembled. You CANNOT use it for a screenshot or image the person uploaded to the chat: you were shown that image, you do not hold its bytes, and inventing base64 would attach garbage. In that case say so plainly and give them the task link so they can drop it on the task themselves. Maximum 10MB.
| Input | Type | Description |
|---|---|---|
taskId* | string | Task to attach to (see search_tasks). |
fileName* | string | File name including its extension, for example "pipeline-chart.png". |
contentBase64* | string | The file contents, base64 encoded. |
contentType | string | Ignored — the format is read from the contents. |
get_task_attach_linkGet a link for attaching a file to a taskReadEveryoneProjectsReturn a link that opens a task with its attachment area ready, so the person can paste or drop a file in one step. Use this whenever they want to attach something YOU do not hold the contents of — above all a screenshot or file they pasted into this chat, which you were shown but cannot forward. Say plainly that you cannot upload it for them, give them this link, and tell them to press Cmd-V (Ctrl-V on Windows) when it opens.
| Input | Type | Description |
|---|---|---|
taskId* | string | Task to attach to (see search_tasks). |
add_task_drive_linkAdd a Google Drive link to a taskWriteMembers & adminsProjectsAdd a Google Drive, Docs, Sheets or Slides link to a task's Google Drive section. Use this — not the description — when someone wants a Drive file attached to a task. Adding the same file twice is harmless. Find the task with search_tasks.
| Input | Type | Description |
|---|---|---|
taskId* | string | The task (see search_tasks). |
url* | string | The Google Drive / Docs / Sheets / Slides URL. |
list_task_drive_linksList a task's Google Drive linksReadEveryoneProjectsList the Google Drive files linked to a task (its Google Drive section).
| Input | Type | Description |
|---|---|---|
taskId* | string | The task (see search_tasks). |
Roadmap
list_roadmap_projectsList roadmap projectsReadEveryoneRoadmapList roadmap projects (the strategic plan: title, status, start/target dates). Use this when the user asks what is planned, in flight, or shipping — not for individual tasks.
| Input | Type | Description |
|---|---|---|
status | string | Filter by status, e.g. "planned", "in_progress", "completed". |
limit | integer | Maximum rows to return (default 50, max 200). |
create_roadmap_projectCreate a roadmap projectWriteMembers & adminsRoadmapCreate an item on the roadmap — a strategic piece of work with a status and optional start and target dates. This is the plan, not the day-to-day board: use create_task for the work underneath it. Search list_roadmap_projects first so you extend the plan rather than duplicating something already on it.
| Input | Type | Description |
|---|---|---|
title* | string | What the roadmap item is called. |
description | string | What it covers. Plain text. |
status | string | One of: planned, in_progress, completed, on_hold, cancelled. Defaults to planned. |
startDate | string | Start date as YYYY-MM-DD. |
targetDate | string | Target date as YYYY-MM-DD. |
trackerProjectId | string | Optional tracker board to link this to, so the work underneath is reachable from the roadmap item. See list_tracker_projects. |
update_roadmap_projectUpdate a roadmap projectWriteMembers & adminsRoadmapUpdate a roadmap item: change its status, dates, description or title, or link it to a tracker board. Find it with list_roadmap_projects first. Only the fields you pass are changed; everything else is left alone.
| Input | Type | Description |
|---|---|---|
projectId* | string | Roadmap item to update (see list_roadmap_projects). |
title | string | New title. |
description | string | New description. Replaces the existing one. |
status | string | One of: planned, in_progress, completed, on_hold, cancelled. |
startDate | string | Start date as YYYY-MM-DD. |
targetDate | string | Target date as YYYY-MM-DD. |
trackerProjectId | string | Tracker board to link this to. See list_tracker_projects. |
Calendar
list_calendarList what is dueReadEveryoneCalendarList what is due or scheduled in a time frame, across the whole workspace: task due dates, roadmap project target dates, deal expected-close dates, quote expirations, interviews, security questionnaire due dates, audit milestones and calendar events. Use this for any "what is due / coming up / deadlines / what did we miss" question, optionally narrowed to named projects. Finished work is left out unless asked for.
| Input | Type | Description |
|---|---|---|
days | integer | How many days from today to cover (default 14). Negative looks back, e.g. -7 for the past week. |
start | string | Start date as YYYY-MM-DD. Use with end or days instead of the default "from today". |
end | string | Inclusive end date as YYYY-MM-DD. Maximum range is 400 days. |
types | string[] | Limit to these kinds of item. task = task due dates, roadmap = project target dates, crm_close = deal close dates, cpq_expiry = quote expirations, interview, ts_due = questionnaires, milestone = audit milestones, event = calendar events. Default: all. |
projects | string[] | Project names (or ids) to narrow to — task boards or roadmap projects. Partial names match. When given, only tasks and project target dates are returned. |
includeCompleted | boolean | Include finished tasks and completed roadmap projects (default false). |
timezone | string | IANA time zone that decides what "today" is, e.g. "America/New_York". Default UTC. |
limit | integer | Maximum items to return (default 200, max 500). |
River wiki
list_river_spacesList Fishladder wiki spacesReadEveryoneRiverList the spaces (sections) of the team's River wiki in Fishladder. A space can sit inside another space: parentSpaceId names it, and path reads like "Customer Success / Cursor". Call this before create_river_page to choose where a new page belongs.
| Input | Type | Description |
|---|---|---|
limit | integer | Maximum rows to return (default 50, max 200). |
search_river_pagesSearch Fishladder wikiReadEveryoneRiverSearch the team's River wiki inside Fishladder — internal docs, specs, runbooks, process and policy pages written by this team. Use this for questions about how the team does something ("how does our escalation process work", "what is our release process"). This is distinct from a general file store such as Google Drive: it searches only pages authored in Fishladder. Call get_river_page for the full text of a result.
| Input | Type | Description |
|---|---|---|
query | string | Free-text match against page title and excerpt. |
limit | integer | Maximum rows to return (default 50, max 200). |
get_river_pageRead a Fishladder wiki pageReadEveryoneRiverFetch the full text of one River wiki page in Fishladder, as Markdown, along with its version number and any open comment or suggestion threads. Use after search_river_pages when the excerpt is not enough to answer the question. The result can be edited and sent back through update_river_page (pass version as baseVersion) without losing formatting.
| Input | Type | Description |
|---|---|---|
pageId* | string | Page ID from search_river_pages. |
add_page_commentComment on a wiki page passageWriteMembers & adminsRiverAttach a comment to a specific passage of a River wiki page WITHOUT changing the page — the passage is highlighted and the comment appears in a margin panel, labeled as coming from Claude. Use this for review feedback instead of editing reviewer notes into the body. Quote the passage exactly as get_river_page returned it.
| Input | Type | Description |
|---|---|---|
pageId* | string | Page to comment on (see search_river_pages). |
quotedText* | string | The exact passage the comment is about, quoted verbatim from get_river_page. |
comment* | string | The comment itself. |
occurrence | integer | When the quoted text appears more than once: which occurrence (0-based, in page order). Defaults to the first. |
suggest_page_editSuggest an edit to a wiki pageWriteMembers & adminsRiverPropose replacing a specific passage of a River wiki page with new text. This does NOT change the page: the proposal appears as a tracked change that a person accepts or rejects in Fishladder. Use it for concrete wording fixes; use add_page_comment for open questions. Quote the passage exactly as get_river_page returned it. An empty replacement proposes deletion.
| Input | Type | Description |
|---|---|---|
pageId* | string | Page to suggest on (see search_river_pages). |
quotedText* | string | The exact passage to replace, quoted verbatim from get_river_page. |
replacement* | string | The text it should become. Empty string proposes deleting the passage. |
note | string | Optional rationale shown with the suggestion. |
occurrence | integer | When the quoted text appears more than once: which occurrence (0-based, in page order). Defaults to the first. |
reply_page_commentReply to a wiki page commentWriteMembers & adminsRiverReply to an existing comment or suggestion thread on a River wiki page. Thread IDs come from get_river_page (openThreads) or from add_page_comment/suggest_page_edit results.
| Input | Type | Description |
|---|---|---|
threadId* | string | Thread to reply to. |
comment* | string | The reply. |
resolve_page_commentResolve a wiki page commentWriteMembers & adminsRiverMark a comment thread on a River wiki page as resolved — the highlight is removed and the thread moves to the resolved list. Only for plain comments: a suggestion is accepted or rejected by a person in Fishladder, never through a tool.
| Input | Type | Description |
|---|---|---|
threadId* | string | Thread to resolve. |
create_river_pageCreate a Fishladder wiki pageWriteMembers & adminsRiverCreate a new page in the team's River wiki inside Fishladder — a doc, spec, runbook or process note. Search with search_river_pages first so you update an existing page instead of duplicating it. If the team has more than one space, call list_river_spaces and ask which one to use.
| Input | Type | Description |
|---|---|---|
title* | string | Page title. |
content | string | Page body as Markdown: headings, bullet/numbered/task lists, links, bold/italic/strike, inline code, fenced code blocks, blockquotes, pipe tables. Plain text is fine as-is; blank lines separate paragraphs. Raw HTML is not interpreted. |
spaceId | string | Space to create the page in (see list_river_spaces). Optional when the team has only one. |
parentId | string | Optional parent page ID, to nest this page beneath it. |
update_river_pageEdit a Fishladder wiki pageWriteMembers & adminsRiverEdit an existing page in the team's River wiki inside Fishladder. Only the fields you pass change — sending just a title renames the page and leaves its body alone. Passing content replaces the whole body rather than appending to it, so read the page with get_river_page first and send everything it should end up saying, along with the version you read as baseVersion — if the page changed meanwhile, this call fails and you should read it again. Inline comments survive the rewrite as long as their quoted text does. The previous version is kept in the page history. To move the page, pass spaceId and/or parentId (or moveToTopLevel) — a move needs no content, and child pages move with it. The result includes the page's location (space and parent pages).
| Input | Type | Description |
|---|---|---|
pageId* | string | Page to edit (see search_river_pages). |
baseVersion* | integer | The version number from get_river_page. If the page changed since you read it, this call fails with a conflict — read it again and resend. |
title | string | New title. Omit to leave it unchanged. |
content | string | New body as Markdown, replacing the current body (same support as create_river_page). Raw HTML is not interpreted. |
spaceId | string | Move the page (and its child pages) to this space (see list_river_spaces). |
parentId | string | Move the page beneath this parent page (must be in the target space). |
moveToTopLevel | boolean | Move the page to the top level of its space (no parent). |
link_river_pageLink a wiki page to a recordWriteMembers & adminsRiverLink a River wiki page to something else in Fishladder — most often a task (so the spec shows up on the task) or a board, roadmap project, CRM record, quote, job or candidate. Use it after create_river_page when the page belongs to a piece of work. Get the page ID from search_river_pages / create_river_page and the task ID from search_tasks.
| Input | Type | Description |
|---|---|---|
pageId* | string | The River page to link. |
entityType* | string | What the page is linked to. tracker_task = a task, tracker_project = a board.One of: tracker_task, tracker_project, roadmap_project, roadmap_initiative, crm_company, crm_contact, crm_deal, cpq_quote, hiring_job, hiring_candidate |
entityId* | string | ID of the task / board / record. |
Canvases
list_canvasesList hosted diagramsReadEveryoneRiverList the interactive diagrams and documents hosted on the team's Fishladder. Returns titles and IDs, not the documents themselves — call get_canvas for one of those. Check here before creating a canvas, so an existing diagram gets updated rather than duplicated.
No inputs.
get_canvasRead a hosted diagramReadEveryoneRiverFetch a hosted diagram including its full HTML source. Read this before calling update_canvas so an edit builds on what is there rather than replacing it blind.
| Input | Type | Description |
|---|---|---|
canvasId* | string | ID of the canvas (see list_canvases). |
create_canvasHost an interactive diagramWriteMembers & adminsRiverPublish an interactive HTML diagram or document to Fishladder and get back a URL the team can open. Use this for diagrams whose interactivity carries the meaning — hover detail, expandable nodes, filtering. For a static flowchart, a Mermaid code block in a River wiki page is lighter and easier to edit later. Call list_canvases first to avoid creating a second copy of a diagram that already exists.
| Input | Type | Description |
|---|---|---|
title* | string | Short name for the diagram. |
html* | string | A complete, self-contained HTML document. Inline all CSS and JavaScript, and embed any images as data: URIs — the page is rendered with a strict policy that blocks every outbound request, so external stylesheets, fonts, scripts and image URLs will silently fail to load. Scripts themselves run normally, so interactivity works. |
description | string | Optional one-line summary of what the diagram shows. |
update_canvasUpdate a hosted diagramWriteMembers & adminsRiverUpdate a hosted diagram. Only the fields you pass change — sending just a title renames it and leaves the document alone. Passing html replaces the whole document rather than appending to it, so call get_canvas first and send everything it should end up with, not a fragment. The previous document is kept in the canvas history.
| Input | Type | Description |
|---|---|---|
canvasId* | string | ID of the canvas (see list_canvases). |
title | string | New title. Omit to leave unchanged. |
html | string | Replacement document. Omit to leave unchanged. A complete, self-contained HTML document. Inline all CSS and JavaScript, and embed any images as data: URIs — the page is rendered with a strict policy that blocks every outbound request, so external stylesheets, fonts, scripts and image URLs will silently fail to load. Scripts themselves run normally, so interactivity works. |
description | string | New one-line summary. Omit to leave unchanged. |
Presentations
list_presentationsList slide decksReadEveryoneList the team's slide decks in Fishladder with their build status. A deck still showing "building" is not finished — decks are generated asynchronously and take minutes.
No inputs.
get_presentationRead a slide deckReadEveryoneFetch one slide deck with its slides and live build status. Call this to check whether a deck you started has finished: status goes building → generating_images → assembling → complete, or failed with a reason. Read it before editing a slide, so an edit builds on what is there.
| Input | Type | Description |
|---|---|---|
presentationId* | string | ID of the deck (see list_presentations). |
create_presentationStart building a slide deckWriteAdminsPresentationsStart building a PowerPoint deck from the team's Fishladder data — roadmap, projects, goals and feedback, chosen with the include flags. IMPORTANT: this returns immediately with a deck that is NOT built yet. Generation is asynchronous and takes minutes. Tell the person it has started, then use get_presentation to check whether it finished — do not report it as ready. Limits: 10 builds an hour per team, 2 at a time. For an interactive diagram, use create_canvas instead — slides are PowerPoint and cannot hold one, though a slide can link to a canvas.
| Input | Type | Description |
|---|---|---|
title* | string | Title of the deck. |
audienceType | string | Who it is for: executive, engineering, investor, client or team. Defaults to executive. |
theme | string | Visual theme: default, dark, minimal or bold. Defaults to default. |
includeInitiatives | boolean | Include roadmap initiatives. |
includeProjects | boolean | Include projects. |
includeGoals | boolean | Include goals. |
includeFeedback | boolean | Include customer feedback. |
additionalNotes | string | Extra guidance for the deck, up to 2000 characters. |
add_presentation_slideAdd a slideWriteMembers & adminsPresentationsAdd a slide to an existing deck. Appended at the end unless you give sortOrder. Slides are PowerPoint and therefore static — for an interactive diagram, publish a canvas with create_canvas and reference its URL from a bullet.
| Input | Type | Description |
|---|---|---|
presentationId* | string | Deck to add to (see list_presentations). |
title* | string | Slide title. |
slideType | string | One of: title, section_divider, narrative_text, key_metrics, custom. Defaults to custom. |
content | object | Slide body. Shape depends on slideType: "narrative_text" takes {"body": "a paragraph"}; "title" and "section_divider" need no content; everything else, including the default "custom", takes {"bullets": ["point one", "point two"]}. Unknown types still render a title and bullets, so bullets are the safe default. |
sortOrder | integer | Position in the deck, 0-based. Appended when omitted. |
update_presentation_slideEdit a slideWriteMembers & adminsPresentationsEdit one slide. Only the fields you pass change — sending just a title leaves the body alone. Passing content replaces the whole body rather than merging into it, so call get_presentation first and send everything the slide should end up with.
| Input | Type | Description |
|---|---|---|
slideId* | string | Slide to edit (from get_presentation). |
title | string | New title. Omit to leave unchanged. |
content | object | Replacement body. Omit to leave unchanged. Shape depends on slideType: "narrative_text" takes {"body": "a paragraph"}; "title" and "section_divider" need no content; everything else, including the default "custom", takes {"bullets": ["point one", "point two"]}. Unknown types still render a title and bullets, so bullets are the safe default. |
sortOrder | integer | New position in the deck, 0-based. |
CRM
list_crm_companiesSearch CRM companiesReadEveryoneCRMSearch CRM companies by name or domain. Use this when the user mentions a customer or prospect and you need their record or companyId.
| Input | Type | Description |
|---|---|---|
query | string | Free-text match against company name and domain. |
lifecycleStage | string | Filter by lifecycle stage, e.g. "prospecting", "customer". |
limit | integer | Maximum rows to return (default 50, max 200). |
list_crm_contactsSearch CRM contactsReadEveryoneCRMSearch CRM contacts by name, email or job title. Use this to answer "who do we know at X", and before create_crm_contact so you update an existing person instead of duplicating them.
| Input | Type | Description |
|---|---|---|
query | string | Free-text match against name, email and job title. |
companyId | string | Only contacts at this company (see list_crm_companies). |
limit | integer | Maximum rows to return (default 50, max 200). |
create_crm_companyAdd a company to the CRMWriteMembers & adminsCRMAdd a company to the CRM. Search with list_crm_companies first — a duplicate customer record splits their deals and history across two entries, which someone then has to merge.
| Input | Type | Description |
|---|---|---|
name* | string | Company name. |
domain | string | Primary domain, e.g. "acme.com". Worth setting — it is how duplicates are spotted. |
industry | string | Industry, free text. |
website | string | Full website URL. |
description | string | What the company does, plain text. |
lifecycleStage | string | One of "prospecting", "qualified", "customer", "churned". Defaults to prospecting. |
create_crm_contactAdd a contact to the CRMWriteMembers & adminsCRMAdd a person to the CRM. Search with list_crm_contacts first to avoid duplicating them. Attach them to a company with companyId, resolved via list_crm_companies — a contact with no company is hard to find again.
| Input | Type | Description |
|---|---|---|
firstName* | string | First name. |
lastName* | string | Last name. |
email | string | Email address. |
title | string | Job title. |
phone | string | Phone number. |
companyId | string | Company they work at (see list_crm_companies). |
lifecycleStage | string | One of "prospecting", "qualified", "customer", "churned". Defaults to prospecting. |
update_crm_companyUpdate a CRM companyWriteMembers & adminsCRMUpdate a company already in the CRM — its lifecycle stage, industry, domain, website or description. Only the fields you pass change. Find the company with list_crm_companies.
| Input | Type | Description |
|---|---|---|
companyId* | string | Company to update (see list_crm_companies). |
name | string | New name. |
domain | string | New primary domain. |
industry | string | New industry. |
website | string | New website URL. |
description | string | New description, plain text. |
lifecycleStage | string | One of "prospecting", "qualified", "customer", "churned". |
update_crm_contactUpdate a CRM contactWriteMembers & adminsCRMUpdate a person already in the CRM — their job title, email, phone, company or lifecycle stage. Only the fields you pass change. Find them with list_crm_contacts.
| Input | Type | Description |
|---|---|---|
contactId* | string | Contact to update (see list_crm_contacts). |
firstName | string | New first name. |
lastName | string | New last name. |
email | string | New email address. |
title | string | New job title. |
phone | string | New phone number. |
companyId | string | Move them to this company (see list_crm_companies). |
lifecycleStage | string | One of "prospecting", "qualified", "customer", "churned". |
list_crm_dealsList CRM dealsReadEveryoneCRMList CRM deals with value, stage and status. Use this for pipeline questions — what is open, what closed, how much is in flight. Values are returned in cents.
| Input | Type | Description |
|---|---|---|
status | string | Filter by status: "open", "won", "lost". |
companyId | string | Restrict to one company (see list_crm_companies). |
ownerId | string | Restrict to one deal owner (see list_team_members). |
limit | integer | Maximum rows to return (default 50, max 200). |
HubSpot
search_hubspotSearch HubSpotReadEveryoneHubSpot connectedSearch the team's connected HubSpot portal for companies or contacts by name, domain or email. Use this to find the HubSpot record ID before link_hubspot_record. Returns name, domain or email, and a link to the record in HubSpot.
| Input | Type | Description |
|---|---|---|
query* | string | Name, domain or email to search for. |
objectType | string | Default company.One of: company, contact |
limit | integer | Maximum results (default 10, max 50). |
list_hubspot_linksList linked HubSpot recordsReadEveryoneHubSpot connectedList the HubSpot companies and contacts linked to a task, roadmap project or River page, with a link to each record in HubSpot.
| Input | Type | Description |
|---|---|---|
targetType* | string | What the HubSpot record is linked to: a tracker task, a task board (every task on it then belongs to that client), a roadmap project, or a River page.One of: task, board, project, river_page |
targetId* | string | ID of the task (search_tasks), task board (list_tracker_projects), roadmap project (list_roadmap_projects) or River page (search_river_pages). |
link_hubspot_recordLink a HubSpot recordWriteMembers & adminsHubSpot connectedLink a HubSpot company or contact to a task, roadmap project or River page. Find the record with search_hubspot first. Linking something already linked is a no-op. Nothing is changed in HubSpot.
| Input | Type | Description |
|---|---|---|
targetType* | string | What the HubSpot record is linked to: a tracker task, a task board (every task on it then belongs to that client), a roadmap project, or a River page.One of: task, board, project, river_page |
targetId* | string | ID of the task (search_tasks), task board (list_tracker_projects), roadmap project (list_roadmap_projects) or River page (search_river_pages). |
objectType | string | Default company.One of: company, contact |
objectId* | string | The HubSpot record ID, from search_hubspot. |
unlink_hubspot_recordUnlink a HubSpot recordWriteMembers & adminsHubSpot connectedRemove a HubSpot company or contact link from a task, roadmap project or River page. Get the link ID from list_hubspot_links. The record itself is untouched in HubSpot.
| Input | Type | Description |
|---|---|---|
targetType* | string | What the HubSpot record is linked to: a tracker task, a task board (every task on it then belongs to that client), a roadmap project, or a River page.One of: task, board, project, river_page |
targetId* | string | ID of the task (search_tasks), task board (list_tracker_projects), roadmap project (list_roadmap_projects) or River page (search_river_pages). |
linkId* | string | The link ID, from list_hubspot_links. |
Feedback
list_feedbackSearch customer feedbackReadEveryoneSearch customer feedback entries. Use this when the user asks what customers are asking for, or wants evidence behind a roadmap decision.
| Input | Type | Description |
|---|---|---|
query | string | Free-text match against title, details, and the problem being solved. |
status | string | Filter by status, e.g. "open", "planned", "shipped". |
limit | integer | Maximum rows to return (default 50, max 200). |
Generated from the connector's tool definitions, so it always matches what Claude is offered.