Connect with your existing agent

Bring your own agent. Every tool says what it takes and gives back.

How to connect your own AI agent to Cade, and every tool it gets, generated from the server's own tool definitions, so it is always what an agent sees in tools/list. A result is text and, matching its schema, structuredContent, so an agent can pass one tool's IDs to the next.

Connect your agent

1. In Slack open Cade's Home tab, press Configure, then AI agent and Create key. Cade shows the key to you only, once, with this Cade's MCP endpoint (the same window shows the endpoint again, and whether you have a key). Revoke key in the same window ends it.

2. Add Cade to your agent as a remote MCP server (Streamable HTTP), with the key in the header x-apikey. Replace the two placeholders with the endpoint and key from step 1:

Claude Code

claude mcp add --transport http cade https://YOUR-CADE-WORKER/mcp --header "x-apikey: YOUR_API_KEY"

Gemini CLI

gemini mcp add --transport http cade https://YOUR-CADE-WORKER/mcp --header "x-apikey: YOUR_API_KEY"

Cursor, Codex and other clients

Add a remote MCP server with the endpoint and the header x-apikey set to your key. The Claude.ai and Gemini web apps can't send a custom header, so they can't connect yet.

3. Ask your agent something like "list my Cade tasks". Everything runs as you, so it reads only what you can read, and anything that changes a task or posts a message is shown to you first.

get_task

Reads one task from Cade's own database: its details, people, links, summary and notes. It includes no thread, but names the one the task was made from, which get_thread_history reads.

Arguments inputSchema

NameTypeRequiredNotes
task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
fieldsstring[]: title | project | channel_id | status | priority | due_date | incident | has_subtasks | blocked | blocked_reason | link | owner | reviewer | tester | summary | summary_by | notes | notes_link | created_by | prs | completed_at | original_thread | original_thread_state | releasesOnly these fields, to keep the result small; task_id is always there. Default: all

Result outputSchema, in structuredContent

NameTypeRequiredNotes
task_idstringyesThe task's ID, for the other tools
titlestringThe task's title
projectstringThe project's name
channel_idstringThe task's channel ID
statusstring: TODO | IN_PROGRESS | IN_REVIEW | IN_TESTING | CLIENT_REVIEW | DONEThe task's status
prioritystring: Urgent | High | Medium | LowThe task's priority
due_datestringDD/MM/YYYY, or empty for none
incidentbooleanWhether it is an incident: something broken now, always Urgent
has_subtasksbooleanWhether it is done in parts, so Cade suggests no status changes from messages
blockedbooleanWhether it is blocked: it keeps its status and shows as blocked on its card
blocked_reasonstringWhy it is blocked, in a short phrase, or empty
linkstringA link to the task's message
ownerstring[]The task's owners, as Slack user IDs: show their names, not the IDs
reviewerstring[]The task's reviewers, as Slack user IDs: show their names, not the IDs
testerstring[]The task's testers, as Slack user IDs: show their names, not the IDs
user_namesobjectThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID
created_bystringWho raised it: a Slack user ID, show the name, not the ID
completed_atstringWhen it was marked Done, or empty (YYYY-MM-DD HH:MM, UTC)
notes_linkstringA link to the notes page, or empty
summarystringThe summary of the issue, or empty
summary_bystringWho wrote the summary, or empty: a Slack user ID, show the name, not the ID
notesstringThe notes people wrote, or empty
original_thread_statestring: found | none | unknownfound: original_thread names it; none: made from no other thread; unknown: no messages kept yet
original_threadobject or nullThe thread a task was made from, or null
original_thread.thread_idstringThe thread's ID, for get_thread_history
original_thread.linkstringA link to the thread
prsobject[]The pull requests linked to the task, each with where it is and the release it was sent with · A pull request linked to the task
prs[].urlstringyesThe pull request's address
prs[].labelstringyesrepo/number
prs[].statestring: PENDING | PENDING_APPROVAL | APPROVEDyesPENDING: not sent to the client yet; PENDING_APPROVAL: sent, waiting for the approver; APPROVED. A Done task's are all APPROVED
prs[].releaseobject or nullyesThe release it was sent with, or null while pending
prs[].release.release_idintegerThe release's number
prs[].release.notestringWhat the release completes
prs[].release.statusstring: PENDING_APPROVAL | APPROVEDPENDING_APPROVAL: waiting for the approver; APPROVED
releasesobject[]The partial releases sent to the client for approval, oldest first (those not approved are not kept): which PRs, what they complete, who sent them and who approved · A partial release: pull requests sent to the client for approval before the whole task is done
releases[].release_idintegeryesThe release's number
releases[].prsstring[]yesThe pull requests' addresses
releases[].notestringyesWhat the release completes
releases[].statusstring: PENDING_APPROVAL | APPROVED | NOT_APPROVEDyesPENDING_APPROVAL: waiting for the approver; APPROVED; NOT_APPROVED: turned down, its PRs are pending again
releases[].sent_bystringyesWho sent the release: a Slack user ID, show the name, not the ID
releases[].sent_atstringyesWhen it was sent (YYYY-MM-DD HH:MM, UTC)
releases[].decided_bystringyesWho decided it, or empty while waiting: a Slack user ID, show the name, not the ID
releases[].decided_atstringyesWhen it was decided, or empty (YYYY-MM-DD HH:MM, UTC)

get_thread_history

Reads a whole Slack thread from Slack, oldest message first. Slack's free plan hides messages older than 90 days; for a task Cade tracks, get_task_history has the messages Cade kept.

Give one of thread_id or link.

Arguments inputSchema

NameTypeRequiredNotes
thread_idstringThe thread's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
linkstringInstead of thread_id: a link to a message in the thread, such as https://team.slack.com/archives/C0123ABCD/p1700000000123456

Result outputSchema, in structuredContent

NameTypeRequiredNotes
thread_idstringyesThe thread's ID, for get_thread_history
channel_namestringyesThe channel's name
messagesobject[]yesOldest first · A message in a thread
messages[].tsstringyesSlack's message time
messages[].timestringyesWhen it was sent (YYYY-MM-DD HH:MM, UTC)
messages[].user_idstringyesThe sender: a Slack user ID (show the name, not the ID), a bot's name or ID, or unknown
messages[].botbooleanyesWhether a bot sent it
messages[].textstringyesWhat it says, with <@U…> mentions as sent
messages[].filesstring[]yesNames of attached files
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

get_task_history

Reads the messages Cade kept of a task's own thread, oldest first: what was done about the task. Unlike get_thread_history it doesn't ask Slack, so it still has messages Slack hides after 90 days.

Arguments inputSchema

NameTypeRequiredNotes
task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100

Result outputSchema, in structuredContent

NameTypeRequiredNotes
task_idstringyesThe task's ID, for the other tools
titlestringyesThe task's title
messagesobject[]yesOldest first · A message in a thread
messages[].tsstringyesSlack's message time
messages[].timestringyesWhen it was sent (YYYY-MM-DD HH:MM, UTC)
messages[].user_idstringyesThe sender: a Slack user ID (show the name, not the ID), a bot's name or ID, or unknown
messages[].botbooleanyesWhether a bot sent it
messages[].textstringyesWhat it says, with <@U…> mentions as sent
messages[].filesstring[]yesNames of attached files
original_threadobject or nullyesThe thread a task was made from, or null
original_thread.thread_idstringThe thread's ID, for get_thread_history
original_thread.linkstringA link to the thread
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

get_tasks

Lists Cade tasks, most urgent first: your own or everyone's in the channels you can read, open ones by default. It can also give the tasks done in a period, with those not done, for an executive summary.

Arguments inputSchema

NameTypeRequiredNotes
minebooleanOnly the tasks you are owner, reviewer or tester of
rolestring: owner | reviewer | testerOnly tasks where you have this role (implies mine)
assigneestringOnly tasks this person is on, as a Slack user ID such as U0123ABCD
unassignedbooleanOnly tasks nobody is owner, reviewer or tester of
statusstring: open | all | TODO | IN_PROGRESS | IN_REVIEW | IN_TESTING | CLIENT_REVIEW | DONEopen (default: everything not done), all, or one status
projectstringOnly this project's tasks, by the name get_projects gives
completed_fromstringOnly tasks marked Done on or after this day (status defaults to DONE then) (YYYY-MM-DD)
completed_tostringOnly tasks marked Done on or before this day (YYYY-MM-DD)
include_openbooleanWith completed_from or completed_to: give the tasks not done too, listed first, as well as those done in the days. Can't be combined with status
fieldsstring[]: title | project | channel_id | status | priority | due_date | incident | has_subtasks | blocked | blocked_reason | link | owner | reviewer | tester | summary | summary_by | notes | notes_link | created_by | prs | completed_atThe fields to give for each task, besides task_id which is always there. Default: all but summary, summary_by, notes, notes_link, created_by, prs, completed_at. Add summary or notes to get them for every task listed
limitintegerHow many tasks to return, most urgent first. Default 20 · min 1, max 100

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many tasks match and you can see
tasksobject[]yesThe ones shown, grouped by project, most urgent first within each · Every field, or just those asked for in fields
tasks[].task_idstringyesThe task's ID, for the other tools
tasks[].titlestringThe task's title
tasks[].projectstringThe project's name
tasks[].channel_idstringThe task's channel ID
tasks[].statusstring: TODO | IN_PROGRESS | IN_REVIEW | IN_TESTING | CLIENT_REVIEW | DONEThe task's status
tasks[].prioritystring: Urgent | High | Medium | LowThe task's priority
tasks[].due_datestringDD/MM/YYYY, or empty for none
tasks[].incidentbooleanWhether it is an incident: something broken now, always Urgent
tasks[].has_subtasksbooleanWhether it is done in parts, so Cade suggests no status changes from messages
tasks[].blockedbooleanWhether it is blocked: it keeps its status and shows as blocked on its card
tasks[].blocked_reasonstringWhy it is blocked, in a short phrase, or empty
tasks[].linkstringA link to the task's message
tasks[].ownerstring[]The task's owners, as Slack user IDs: show their names, not the IDs
tasks[].reviewerstring[]The task's reviewers, as Slack user IDs: show their names, not the IDs
tasks[].testerstring[]The task's testers, as Slack user IDs: show their names, not the IDs
tasks[].summarystringThe summary of the issue, or empty
tasks[].summary_bystringWho wrote the summary, or empty: a Slack user ID, show the name, not the ID
tasks[].notesstringThe notes people wrote, or empty
tasks[].notes_linkstringA link to the notes page, or empty
tasks[].created_bystringWho raised it: a Slack user ID, show the name, not the ID
tasks[].prsobject[]The pull requests linked to the task, each with its state and the release it was sent with · A pull request linked to the task
tasks[].prs[].urlstringyesThe pull request's address
tasks[].prs[].labelstringyesrepo/number
tasks[].prs[].statestring: PENDING | PENDING_APPROVAL | APPROVEDyesPENDING: not sent to the client yet; PENDING_APPROVAL: sent, waiting for the approver; APPROVED. A Done task's are all APPROVED
tasks[].prs[].releaseobject or nullyesThe release it was sent with, or null while pending
tasks[].prs[].release.release_idintegerThe release's number
tasks[].prs[].release.notestringWhat the release completes
tasks[].prs[].release.statusstring: PENDING_APPROVAL | APPROVEDPENDING_APPROVAL: waiting for the approver; APPROVED
tasks[].completed_atstringWhen it was marked Done, or empty (YYYY-MM-DD HH:MM, UTC)
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

get_releases

Lists the partial releases of tasks: pull requests sent to the client for approval before the whole task is done. Approving or turning one down is the approver's click in Slack, not a tool.

Arguments inputSchema

NameTypeRequiredNotes
statusstring: PENDING_APPROVAL | APPROVED | NOT_APPROVED | allDefault PENDING_APPROVAL
task_idstringOnly this task's releases
projectstringOnly this project's tasks, by the name get_projects gives
limitintegerHow many releases to return, oldest first. Default 20 · min 1, max 100

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many match and you can see
releasesobject[]yesThe releases that match, oldest first · A release, with its task
releases[].release_idintegeryesThe release's number
releases[].prsobject[]yesThe release's pull requests · A pull request in the release
releases[].prs[].urlstringyesThe pull request's address
releases[].prs[].labelstringyesrepo/number
releases[].notestringyesWhat the release completes
releases[].statusstring: PENDING_APPROVAL | APPROVED | NOT_APPROVEDyesPENDING_APPROVAL: waiting for the approver; APPROVED; NOT_APPROVED: turned down, its PRs are pending again
releases[].sent_bystringyesWho sent the release: a Slack user ID, show the name, not the ID
releases[].sent_atstringyesWhen it was sent (YYYY-MM-DD HH:MM, UTC)
releases[].decided_bystringyesWho decided it, or empty while waiting: a Slack user ID, show the name, not the ID
releases[].decided_atstringyesWhen it was decided, or empty (YYYY-MM-DD HH:MM, UTC)
releases[].task_idstringyesThe task's ID, for the other tools
releases[].titlestringyesThe task's title
releases[].projectstringyesThe project's name
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

update_release

Changes a release still waiting for approval: its pull requests and what it completes. Cade updates the approver's request and the task's card, and tells the thread. It never approves or turns a release down: that is the approver's click in Slack. Call this only with changes the person has seen and approved.

Arguments inputSchema

NameTypeRequiredNotes
release_idintegeryesThe release's number, as get_releases gives it · min 1
prsobjectPull requests to add to and remove from the release, as links. Added ones must be linked to the task already (update_task prs.add) and not in another release; a release keeps at least one
prs.addstring[]Pull requests to add to the release, as links
prs.removestring[]Pull requests to take out of the release, as links; they go back to pending
notestringWhat the release completes, replacing the earlier note

Result outputSchema, in structuredContent

NameTypeRequiredNotes
release_idintegeryesThe release's number
task_idstringyesThe task's ID, for the other tools
changedbooleanyesWhether the release changed
releaseobjectyesThe release as it is now
release.release_idintegeryesThe release's number
release.prsstring[]yesThe pull requests' addresses
release.notestringyesWhat the release completes
release.statusstring: PENDING_APPROVAL | APPROVED | NOT_APPROVEDyesPENDING_APPROVAL: waiting for the approver; APPROVED; NOT_APPROVED: turned down, its PRs are pending again
release.sent_bystringyesWho sent the release: a Slack user ID, show the name, not the ID
release.sent_atstringyesWhen it was sent (YYYY-MM-DD HH:MM, UTC)
release.decided_bystringyesWho decided it, or empty while waiting: a Slack user ID, show the name, not the ID
release.decided_atstringyesWhen it was decided, or empty (YYYY-MM-DD HH:MM, UTC)
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

get_channels

Lists the Slack channels Cade is in and you can read, project channels first. It is where to start to browse for conversations that should become tasks: pick a channel, then read its threads with get_channel_threads.

Arguments inputSchema

NameTypeRequiredNotes
limitintegerHow many channels to return. Default 50 · min 1, max 200

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many channels Cade is in that you can read
channelsobject[]yesProject channels first, then by name · A channel Cade is in
channels[].channel_idstringyesA Slack channel ID, such as C0123ABCD
channels[].namestringyesThe channel's name
channels[].privatebooleanyesWhether the channel is private
channels[].projectstringyesSet if this is a project's channel, else empty

get_channel_threads

Lists a channel's recent conversations that Cade doesn't track as tasks, newest first. Use it to find conversations that should become tasks: read one with get_thread_history and make the task with create_task.

Arguments inputSchema

NameTypeRequiredNotes
channel_idstringyesThe channel's ID, as get_channels gives it, such as C0123ABCD
daysintegerHow many days back to look. Default 14 · min 1, max 90
with_repliesbooleanOnly the messages that have replies, the conversations that happened. Default false: every message of people
limitintegerHow many threads to return, newest first. Default 10 · min 1, max 50

Result outputSchema, in structuredContent

NameTypeRequiredNotes
channel_idstringyesA Slack channel ID, such as C0123ABCD
channel_namestringyesThe channel's name
totalintegeryesHow many matching threads there are in that time
threadsobject[]yesNewest first · A conversation that is not a task
threads[].thread_idstringyesFor get_thread_history and create_task
threads[].timestringyesWhen it was sent (YYYY-MM-DD HH:MM, UTC)
threads[].user_idstringyesA Slack user ID, show the name, not the ID
threads[].textstringyesThe start of what it says, up to 300 characters, with <@U…> mentions as sent
threads[].filesstring[]yesNames of attached files
threads[].reply_countintegeryesHow many replies it has
threads[].last_replystringyesWhen the last reply was sent, or empty for none (YYYY-MM-DD HH:MM, UTC)
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

create_task

Creates a task, or an incident, in a project's channel as the person you act for: from a Slack thread (moved into the new task) or from scratch, with its summary saved on the notes page. An incident is always Urgent and due immediately. Suggest the title, priority, due date and summary and ask for the person's input, and call this only with a task the person has seen and approved. Check with get_tasks that the task doesn't exist already. Each call makes a new task. Offer to assign people afterwards with update_task.

Arguments inputSchema

NameTypeRequiredNotes
titlestringyesOne short line saying what has to be done
projectstringThe project to make it in, by the name get_projects gives. Can be left out when the thread is in a project's channel or there is only one project
prioritystring: Urgent | High | Medium | LowDefault Medium. Not for an incident
due_datestringDD/MM/YYYY or YYYY-MM-DD. Use a date the thread gives or clearly implies, never an invented one; leave out for none. Not for an incident
incidentbooleanMake an incident: only for something broken now that blocks people or the business, always Urgent and due immediately. When unsure, leave it false (a task). Default false
summarystringThe summary of the issue only, saved on the notes page: what the problem or request is, who raised it and when, the impact and the details needed to understand it, for someone who wasn't in the discussion. Write it from the thread it is made from, and leave out what that thread doesn't say. Plain text, people's names rather than @mentions. At most 8000 characters
thread_idstringThe thread to make it from. One that is already a task, was moved into one, or is a bot's or a direct message can't be used
linkstringInstead of thread_id: a link to a message in the thread

Result outputSchema, in structuredContent

NameTypeRequiredNotes
task_idstringyesThe task's ID, for the other tools
linkstringyesA link to the task's message
projectstringyesThe project's name
incidentbooleanyesWhether it was made as an incident
summary_savedbooleanyesWhether the summary was saved on the notes page
notes_linkstringyesA link to the notes page, or empty

get_projects

Lists the projects Cade tracks tasks for, in the channels you can read.

Arguments inputSchema

None.

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many projects you can see
projectsobject[]yesThe projects you can see · A project
projects[].namestringyesThe project's name
projects[].channel_idstringyesThe project's channel ID

get_user

Gives a Slack user's name from their ID or mention, and with profile also their email, phone number and job title.

Arguments inputSchema

NameTypeRequiredNotes
user_idstringyesA Slack user ID such as U0123ABCD, or a <@…> mention
profilebooleanAlso give their email, phone number and title. Private: ask for it only when needed, such as to reach someone on WhatsApp (https://wa.me/<number with country code, digits only>?text=<URL-encoded message> opens the chat). Default false

Result outputSchema, in structuredContent

NameTypeRequiredNotes
user_idstringyesA Slack user ID, show the name, not the ID
namestringyesReal name
handlestringyesDisplay name, or empty
profileobject or nullyesOnly when asked for with profile, otherwise null
profile.emailstringOr empty
profile.phonestringOr empty
profile.titlestringOr empty

get_users

Lists the people of the Slack workspace with their user IDs, leaving out bots and deactivated accounts. In a large workspace use find_user_by_name instead.

Arguments inputSchema

NameTypeRequiredNotes
limitintegerHow many people to return. Default 50 · min 1, max 200
fieldsstring[]: name | usernameOnly these fields for each person, to keep the result small; user_id is always there. Default: all

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many people there are
usersobject[]yesThe people, with their user IDs · A person in the workspace
users[].user_idstringyesA Slack user ID, show the name, not the ID
users[].namestringReal name
users[].usernamestringSlack username

get_team_availability

Shows who in the team has room for work, least loaded first: their open tasks, how many are overdue or urgent, their Slack status and time zone. Use it to pick whom to assign a task to.

Arguments inputSchema

NameTypeRequiredNotes
usersstring[]Only these people, as Slack user IDs such as U0123ABCD
projectstringCount only this project's tasks, and cover only the people picked as working on it (everyone if none were picked). The project's name, as get_projects gives it
fieldsstring[]: name | open_tasks | owner | reviewer | tester | overdue | urgent_or_high | status | status_until | time_zone | away | presenceThe fields to give, to keep the result small; user_id is always there. Default: all but presence. Add presence to look up whether the person is active in Slack right now (one Slack call each)
limitintegerHow many people to return, least loaded first. Default 50 · min 1, max 200

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many people were looked at
peopleobject[]yesLeast loaded first, people with an away status last · A person's load and availability
people[].user_idstringyesA Slack user ID, show the name, not the ID
people[].namestringReal name
people[].open_tasksintegerOpen tasks they are owner, reviewer or tester of
people[].ownerintegerOpen tasks they are the owner of
people[].reviewerintegerOpen tasks they are the reviewer of
people[].testerintegerOpen tasks they are the tester of
people[].overdueintegerOpen tasks past their due date
people[].urgent_or_highintegerOpen Urgent or High priority tasks
people[].statusstringTheir Slack status text, or empty
people[].status_untilstringWhen the status ends, in UTC, or empty (YYYY-MM-DD)
people[].time_zonestringTheir time zone, such as Asia/Colombo
people[].presencestring: active | away | unknownOnly when asked for in fields. 'away' often only means Slack is closed, so it is a weak sign that someone is unavailable
people[].awaybooleanWhether the status text suggests vacation, sick leave or being out of office: don't assign someone who is away

get_availability

Shows how much room one person has for work: their open tasks, how many are overdue or urgent, their Slack status and time zone. To compare the whole team use get_team_availability.

Arguments inputSchema

NameTypeRequiredNotes
user_idstringyesThe person, as a Slack user ID such as U0123ABCD
projectstringCount only this project's tasks. If the project has people picked, the person must be one of them. The project's name, as get_projects gives it
fieldsstring[]: name | open_tasks | owner | reviewer | tester | overdue | urgent_or_high | status | status_until | time_zone | away | presenceThe fields to give, to keep the result small; user_id is always there. Default: all but presence. Add presence to look up whether the person is active in Slack right now (one Slack call each)

Result outputSchema, in structuredContent

NameTypeRequiredNotes
personobjectyesA person's load and availability
person.user_idstringyesA Slack user ID, show the name, not the ID
person.namestringReal name
person.open_tasksintegerOpen tasks they are owner, reviewer or tester of
person.ownerintegerOpen tasks they are the owner of
person.reviewerintegerOpen tasks they are the reviewer of
person.testerintegerOpen tasks they are the tester of
person.overdueintegerOpen tasks past their due date
person.urgent_or_highintegerOpen Urgent or High priority tasks
person.statusstringTheir Slack status text, or empty
person.status_untilstringWhen the status ends, in UTC, or empty (YYYY-MM-DD)
person.time_zonestringTheir time zone, such as Asia/Colombo
person.presencestring: active | away | unknownOnly when asked for in fields. 'away' often only means Slack is closed, so it is a weak sign that someone is unavailable
person.awaybooleanWhether the status text suggests vacation, sick leave or being out of office: don't assign someone who is away

find_user_by_name

Finds people in the Slack workspace by part of their name and gives each one's user ID, which update_task takes to assign someone and get_tasks takes as assignee.

Arguments inputSchema

NameTypeRequiredNotes
namestringyesPart of the person's name, such as Ann or ann.lee
fieldsstring[]: name | usernameOnly these fields for each person, to keep the result small; user_id is always there. Default: all

Result outputSchema, in structuredContent

NameTypeRequiredNotes
totalintegeryesHow many people match
usersobject[]yesUp to 10 of them · A person in the workspace
users[].user_idstringyesA Slack user ID, show the name, not the ID
users[].namestringReal name
users[].usernamestringSlack username

send_task_message

Posts a message in a task's own thread in Slack as Cade, with a line under it saying who it is from. A mention notifies that person; @channel, @here and @everyone are not sent as mentions. Call this only with text the person has seen and approved.

Arguments inputSchema

NameTypeRequiredNotes
task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
textstringyesThe message, as plain text, written as the person would. Mention a person as <@U0123ABCD>, with their user ID and never their name: only the ID notifies them, and a name written out notifies no one. The preview shows the name, but the call keeps the ID. At most 3000 characters
summary_idintegerAn executive summary's number, as get_executive_summary gives it. Give it when the message tells the thread what a client call decided (see update_executive_summary_after_call): Cade then marks the task as told, and refuses to send if it was told already · min 1

Result outputSchema, in structuredContent

NameTypeRequiredNotes
task_idstringyesThe task's ID, for the other tools
sentbooleanyesWhether the message was posted
linkstringyesA link to the task's thread, or empty

update_task

Changes a task in one call: its status, priority, due date, people, pull requests and the summary on its notes page. Cade posts the field changes in the task's thread and asks the people it assigns to pick it up; the summary is saved quietly. Call this only with changes the person has seen and approved.

Arguments inputSchema

NameTypeRequiredNotes
task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
statusstring: TODO | IN_PROGRESS | IN_REVIEW | IN_TESTING | CLIENT_REVIEW | DONEThe task's new status. A task in Client review can't be changed here: its approver decides
prioritystring: Urgent | High | Medium | LowThe task's new priority. An incident's never changes
due_datestringDD/MM/YYYY or YYYY-MM-DD, or "none" to remove the due date. Use a date the thread gives or clearly implies, never an invented one. An incident's never changes
blockedbooleantrue to mark the task blocked, false to unblock it. A blocked task keeps its status and shows as blocked on its card. Mark it only when the thread says it cannot go on until something else happens
blocked_reasonstringWhy it is blocked, in a short phrase of at most 100 characters (with blocked: true). Replaces the earlier reason
has_subtasksbooleantrue when the task is done in parts (subtasks): Cade then suggests no status changes from people's messages, and the status is set by hand. Pull requests are still tracked
summarystringThe summary of the task's issue only: what the problem or request is, who raised it and when, the impact and the details needed to understand it, for someone who wasn't in the discussion. Write it from the thread the task was made from (get_task names it; if there is none, from the task's own thread), and leave out what that thread doesn't say, and what was done and how it ended. Plain text, short paragraphs, "- " for bullets, people's names rather than @mentions. At most 8000 characters. Replaces any earlier one
prsobjectPull requests (GitHub, GitLab or Bitbucket) to link to and unlink from the task, as links. Adding asks the task's reviewers to review; one already sent to the client for approval can't be unlinked here. Cade can't see repositories, so check a pull request with your own tools first
prs.addstring[]Pull requests to link to the task, as links
prs.removestring[]Pull requests to unlink from the task, as links
ownerobjectWho to add to and remove from the task's owners
owner.addstring[]Who to add, as Slack user IDs such as U0123ABCD
owner.removestring[]Who to remove, as Slack user IDs such as U0123ABCD
reviewerobjectWho to add to and remove from the task's reviewers
reviewer.addstring[]Who to add, as Slack user IDs such as U0123ABCD
reviewer.removestring[]Who to remove, as Slack user IDs such as U0123ABCD
testerobjectWho to add to and remove from the task's testers
tester.addstring[]Who to add, as Slack user IDs such as U0123ABCD
tester.removestring[]Who to remove, as Slack user IDs such as U0123ABCD

Result outputSchema, in structuredContent

NameTypeRequiredNotes
task_idstringyesThe task's ID, for the other tools
changedbooleanyesWhether a field changed (and was posted in the thread)
summary_savedbooleanyesWhether the summary was saved on the notes page
notes_linkstringyesA link to the notes page, or empty

send_approval_request

Asks a person to approve a task that is in Client review: posts a request in the task's thread that mentions them, with Approve and Not approve buttons only they can click. Approving moves the task to Done; not approving sends it back to In progress. Call this only with an approver the person has chosen and approved. Each call posts a new request.

Arguments inputSchema

NameTypeRequiredNotes
task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
approverstringyesWho approves it, as a Slack user ID such as U0123ABCD: the client, or whoever handles them. find_user_by_name gives it

Result outputSchema, in structuredContent

NameTypeRequiredNotes
task_idstringyesThe task's ID, for the other tools
approverstringyesWho was asked: a Slack user ID, show the name, not the ID
linkstringyesA link to the task's thread, or empty
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

get_server_info

Gives the version of Cade's tool set the server has now and the one this session loaded, and says whether the person should disconnect and connect Cade again to load the new tools.

Arguments inputSchema

None.

Result outputSchema, in structuredContent

NameTypeRequiredNotes
server_versionstringyesCade's version
toolset_versionstringyesThe version of the tool set the server has now: it changes whenever a tool, a description or the instructions change
session_toolset_versionstringyesThe version of the tool set this session loaded when it connected, or empty if the client doesn't say
statusstring: CURRENT | OUTDATED | UNKNOWNyesCURRENT: this session has the latest tools; OUTDATED: the person should disconnect and connect again; UNKNOWN: the client doesn't say which it loaded

get_executive_summary

Reads an executive summary Cade kept of a project: what it said of each task as written and as agreed after the client call, and whether each task's thread has been told. It is where to start to write the next summary: its period ends where the next begins, and get_tasks (completed_from, completed_to, include_open) gives the tasks to cover.

Arguments inputSchema

NameTypeRequiredNotes
projectstringyesThe project, by the name get_projects gives
datestringThe summary in force on that day. Default: the last one (YYYY-MM-DD)

Result outputSchema, in structuredContent

NameTypeRequiredNotes
projectstringyesThe project's name
summaryobject or nullyesThe summary, or null if the project has none yet
summary.summary_idintegerFor get_executive_summary_doc and update_executive_summary_after_call
summary.created_atstringWhen it was written (YYYY-MM-DD HH:MM, UTC)
summary.created_bystringWho wrote the summary: a Slack user ID, show the name, not the ID
summary.fromstringFirst day of its period (YYYY-MM-DD)
summary.tostringLast day of its period (YYYY-MM-DD)
summary.doc_urlstringWhere it is in the Google Doc
summary.callobject or nullWhat was said of the call as a whole, or null until it was recorded
summary.call.notesstringWhat was said of the call
summary.call.recorded_bystringWho recorded the call: a Slack user ID, show the name, not the ID
summary.call.recorded_atstringWhen it was recorded (YYYY-MM-DD HH:MM, UTC)
summary.itemsobject[]Each task with the summary as written (before) and as agreed after the call (after) · A task's line in the summary
summary.items[].task_idstringyesEmpty for something added in the call that has no task
summary.items[].titlestringyesThe task's title when it was written
summary.items[].statusstringyesIts status when it was written
summary.items[].incidentbooleanyesWhether the task is an incident
summary.items[].kindstring: COMPLETED | ACTIVE | ADDEDyesCOMPLETED: done in the period; ACTIVE: not done; ADDED: added in the call
summary.items[].beforeobject or nullyesAs written; null for what the call added
summary.items[].before.includedbooleanWhether the summary mentions it
summary.items[].before.healthstring or null: ON_TRACK | AT_RISK | DELAYED | BLOCKED | For active work
summary.items[].before.progressstringShort free text, such as 3/5
summary.items[].before.notesstringOne point per line
summary.items[].afterobject or nullyesAs agreed after the call; null until the call is recorded
summary.items[].after.includedbooleanWhether the summary mentions it
summary.items[].after.healthstring or null: ON_TRACK | AT_RISK | DELAYED | BLOCKED | For active work
summary.items[].after.progressstringShort free text, such as 3/5
summary.items[].after.notesstringOne point per line
summary.items[].changestring: pending | unchanged | changed | removed | addedyespending: no call recorded yet
summary.items[].informed_atstringyesWhen the task's thread was told about this change, or empty. Tell it only if this is empty (YYYY-MM-DD HH:MM, UTC)
earlierobject[]yesThe project's other summaries, newest first (at most 10) · Another summary of the project
earlier[].summary_idintegeryesThe executive summary's number
earlier[].created_atstringyesWhen it was written (YYYY-MM-DD HH:MM, UTC)
earlier[].fromstringyesA day, YYYY-MM-DD
earlier[].tostringyesA day, YYYY-MM-DD
user_namesobjectyesThe names of the people whose user IDs, or <@…> mentions, are in this result, by user ID (at most 50; for any other ID use get_user). Show the name, never the ID

get_executive_summary_doc

Reads a summary's section from the project's Google Doc as it reads now, after people edited it, such as in the client call. Compare it with get_executive_summary to find what the call changed, then record it with update_executive_summary_after_call.

Arguments inputSchema

NameTypeRequiredNotes
projectstringyesThe project, by the name get_projects gives
summary_idintegerThe summary, as get_executive_summary gives it. Default: the last one · min 1

Result outputSchema, in structuredContent

NameTypeRequiredNotes
projectstringyesThe project's name
summary_idintegeryesThe executive summary's number
doc_urlstringyesWhere it is in the Google Doc
linesobject[]yesThe section's lines, in order · A line of the section
lines[].typestring: heading | paragraph | itemyesWhat kind of line it is
lines[].levelintegeryesHow deeply it is nested, 0 for the top
lines[].textstringyesThe line's text
lines[].task_idstringyesThe task the line links to, or empty
lines[].writtenbooleanyesWhether Cade wrote this line (false: people added it)

create_executive_summary

Writes an executive summary to the top of the project's Google Doc (its Summary tab) and keeps what it says of each task. Each call writes a new one. Call this only with a summary the person has seen and approved.

Arguments inputSchema

NameTypeRequiredNotes
projectstringyesThe project, by the name get_projects gives
fromstringFirst day of the period (YYYY-MM-DD). Default: the day after the last summary's period, or 7 days ago if there is none
tostringLast day of the period (YYYY-MM-DD). Default: today
itemsobject[]A line for each task the person said something about. A task not listed keeps what the last summary said (an active one with none is ON_TRACK) and completed ones are included; the result names the active ones it carried over. Only tasks of the project completed in the period or not done can be listed · A task's line in the summary
items[].task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
items[].includedbooleanWhether the summary mentions it. Default true
items[].healthstring: ON_TRACK | AT_RISK | DELAYED | BLOCKEDON_TRACK, AT_RISK, DELAYED or BLOCKED, for work not done. Judge it from what the tasks and threads show, never guess
items[].progressstringShort free text, such as 3/5 or 2 of 4 CRMs live, from what the tasks show
items[].notesstringOne point per line

Result outputSchema, in structuredContent

NameTypeRequiredNotes
projectstringyesThe project's name
summary_idintegeryesFor get_executive_summary_doc and update_executive_summary_after_call
fromstringyesA day, YYYY-MM-DD
tostringyesA day, YYYY-MM-DD
doc_urlstringyesWhere it is in the Google Doc
carried_overstring[]yesTask IDs of the active tasks you didn't list, which kept what the last summary said

update_executive_summary_after_call

Records the summary as it was agreed in the client call, next to the summary as it was written, so both are kept and can be compared. It posts nothing and changes no task or Google Doc. After it, tell each changed task's thread with send_task_message (summary_id), and offer create_task, one at a time, for what the call added. Call this only with what the person has seen and approved.

Arguments inputSchema

NameTypeRequiredNotes
summary_idintegeryesThe summary, as get_executive_summary gives it · min 1
itemsobject[]The tasks whose health, progress, notes or inclusion the call changed (included false takes one out). The after version starts as the written one. Recording again replaces the earlier recording, but a task whose thread was told keeps that unless it changed again · A task whose line the call changed
items[].task_idstringyesThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
items[].includedbooleanWhether the summary mentions it
items[].healthstring: ON_TRACK | AT_RISK | DELAYED | BLOCKEDON_TRACK, AT_RISK, DELAYED or BLOCKED, for work not done. Judge it from what the tasks and threads show, never guess
items[].progressstringShort free text, such as 3/5 or 2 of 4 CRMs live, from what the tasks show
items[].notesstringOne point per line
addedobject[]What the call added: a title for each, with task_id if it is already a task · Something the call added
added[].titlestringyesWhat was added
added[].task_idstringThe task's ID, channel and message time joined by a colon, such as C0123ABCD:1700000000.000100
added[].healthstring: ON_TRACK | AT_RISK | DELAYED | BLOCKEDON_TRACK, AT_RISK, DELAYED or BLOCKED, for work not done. Judge it from what the tasks and threads show, never guess
added[].progressstringShort free text, such as 3/5 or 2 of 4 CRMs live, from what the tasks show
added[].notesstringOne point per line
notesstringAnything about the call as a whole

Result outputSchema, in structuredContent

NameTypeRequiredNotes
summary_idintegeryesThe executive summary's number
changedstring[]yesTask IDs whose summary line the call changed or took out
addedintegeryesHow many items the call added