Skip to main content
Glama
Doist

Twist AI MCP Server

Official
by Doist

Twist AI and MCP SDK

Library for connecting AI agents to Twist. Includes tools that can be integrated into LLMs, enabling them to access and interact with a Twist workspace on the user's behalf.

These tools can be used both through an MCP server, or imported directly in other projects to integrate them to your own AI conversational interfaces.

Using tools

1. Add this repository as a dependency

npm install @doist/twist-ai

2. Import the tools and plug them to an AI

Here's an example using Vercel's AI SDK.

import { fetchInbox, reply, markDone } from '@doist/twist-ai'
import { streamText } from 'ai'

const result = streamText({
    model: yourModel,
    system: 'You are a helpful Twist assistant',
    tools: {
        fetchInbox,
        reply,
        markDone,
    },
})

Related MCP server: Todoist AI MCP Server

Using as an MCP server

Quick Start

You can run the MCP server directly with npx:

npx @doist/twist-ai

Setup Guide

Claude Desktop

Add to your Claude Desktop configuration file (claude_desktop_config.json):

{
    "mcpServers": {
        "twist": {
            "command": "npx",
            "args": ["-y", "@doist/twist-ai"],
            "env": {
                "TWIST_API_KEY": "your-twist-api-key-here"
            }
        }
    }
}

Cursor

Create a configuration file:

  • Global: ~/.cursor/mcp.json

  • Project-specific: .cursor/mcp.json

{
    "mcpServers": {
        "twist": {
            "command": "npx",
            "args": ["-y", "@doist/twist-ai"],
            "env": {
                "TWIST_API_KEY": "your-twist-api-key-here"
            }
        }
    }
}

Then enable the server in Cursor settings if prompted.

Claude Code (CLI)

claude mcp add twist npx @doist/twist-ai

Then set your API key:

export TWIST_API_KEY=your-twist-api-key-here

Visual Studio Code

  1. Open Command Palette → MCP: Add Server

  2. Configure the server:

{
    "servers": {
        "twist": {
            "command": "npx",
            "args": ["-y", "@doist/twist-ai"],
            "env": {
                "TWIST_API_KEY": "your-twist-api-key-here"
            }
        }
    }
}

Getting your Twist API Key

  1. Visit https://twist.com/app_console

  2. Create a new integration or use an existing one

  3. Copy your API key

  4. Add it to your MCP configuration as shown above

Features

A key feature of this project is that tools can be reused, and are not written specifically for use in an MCP server. They can be hooked up as tools to other conversational AI interfaces (e.g. Vercel's AI SDK).

This project is in its early stages. Expect more and/or better tools soon.

Nevertheless, our goal is to provide a small set of tools that enable complete workflows, rather than just atomic actions, striking a balance between flexibility and efficiency for LLMs.

Available Tools

  • userInfo - Get information about the current user and their workspaces

  • fetchInbox - Fetch threads and conversations from the inbox

  • loadThread - Load a specific thread with its comments

  • loadConversation - Load a specific conversation with its messages

  • searchContent - Search across a workspace for threads, comments, and messages

  • createThread - Create a new thread in a channel. Accepts an optional displayInInbox boolean (default false). When true, the thread is unarchived after creation so it appears in the author's Inbox. See also TWIST_CREATE_THREAD_DISPLAY_IN_INBOX.

  • reply - Reply to threads or conversations

  • react - Add reactions to threads, comments, conversations, or messages

  • markDone - Mark threads or conversations as done (read and/or archived)

  • buildLink - Build URLs to Twist resources

For more details on each tool, see the src/tools directory.

Environment Variables

Variable

Default

Description

TWIST_API_KEY

(required)

Your Twist API key.

TWIST_CREATE_THREAD_DISPLAY_IN_INBOX

false

Set to true to unarchive every newly-created thread so it appears in the author's Inbox, without needing to pass displayInInbox: true on each call. Only takes effect when running the MCP locally. The remote/hosted MCP does not have this variable set and will use the per-call displayInInbox parameter only.

Dependencies

Local Development Setup

Prerequisites

  • Node.js 18 or higher

  • npm

  • A Twist account with API access

Setup

  1. Clone the repository:

git clone https://github.com/doist/twist-ai.git
cd twist-ai
  1. Install dependencies:

npm install
  1. Create a .env file with your Twist API key:

TWIST_API_KEY=your-twist-api-key-here
  1. Build the project:

npm run build

Development Commands

  • npm start - Build and run the MCP inspector for testing

  • npm run dev - Development mode with auto-rebuild and restart

  • npm test - Run all tests

  • npm run type-check - Run TypeScript type checking

  • npm run format:check - Run linting and formatting checks

  • npm run format:fix - Auto-fix linting and formatting issues

Contributing

Contributions are welcome! Please ensure:

  1. All tests pass (npm test)

  2. Code is properly typed (npm run type-check)

  3. Code passes linting and formatting checks (npm run format:check)

Use Conventional Commits for commit messages:

  • feat: for new features

  • fix: for bug fixes

  • docs: for documentation changes

  • test: for test changes

  • chore: for maintenance tasks

License

MIT

Available Tools

19 tools
awayA
Idempotent

Manage the current user's away status. Supports getting, setting, and clearing away mode with types: parental, vacation, sickleave, other.

ParametersJSON Schema
NameRequiredDescriptionDefault
fromNoStart date (YYYY-MM-DD). Only used when action is "set". Defaults to today.
typeNoThe away mode type. Required when action is "set".
untilNoEnd date (YYYY-MM-DD). Required when action is "set".
actionYesThe action to perform.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
actionYes
isAwayYes
awayModeNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already convey read-write, idempotent, and non-destructive behavior. The description adds the useful scope that the status belongs to the current user, but it does not disclose additional side effects, prerequisites, or edge cases such as exactly what happens when clearing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise, front-loaded sentence states the purpose and scope first, then the operations and types. There is no filler or redundant introduction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with full parameter schema coverage and an output schema, the description is complete enough. Action-specific requirements are covered by the schema, so the agent has what it needs to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents action, type, from, and until, including action-specific requirements. The description's type list repeats the schema enum and adds no new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource ('current user's away status') and the supported operations ('getting, setting, and clearing'), with the allowed types listed. No sibling tool covers away status, so it is readily distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear, immediate context: this is the tool for managing the current user's away status. It does not explicitly name alternatives or when-not-to-use cases, but none of the sibling tools addresses away status, so the guidance is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create-conversationA

Start a direct or group conversation with one or more users and post an initial message. Reuses the existing conversation if one already exists for the same set of users.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe content of the first message to post.
recipientsYesUser IDs to include in the direct or group conversation (excluding yourself, who is added automatically). Use get-users to resolve names to IDs.
workspaceIdYesThe ID of the workspace the conversation belongs to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
contentYes
createdYes
successYes
messageIdYes
messageUrlYes
recipientsYes
workspaceIdYes
participantsYes
conversationIdYes
conversationUrlYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral context beyond the annotations by explaining that an existing conversation with the same users is reused rather than creating a duplicate. It also transparently states the side effect of posting an initial message. The annotations already convey read/write safety, so no contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. It front-loads the primary action and scope, then adds the reuse behavior as a concise, useful secondary sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, schema, and annotations together cover what the tool does, its side effects, and its parameters, and an output schema exists to document return values. The only minor gap is not explicitly distinguishing this tool from create-thread in the same workspace context, but this is not a major omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are fully documented in the input schema. The description itself does not add extra semantic detail beyond what the schema already provides, which is acceptable but not above the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Start'), names the exact resource ('direct or group conversation'), and states the additional behavior of posting an initial message. It also clearly differentiates from the sibling create-thread by scoping to one-on-one/group conversations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly indicates when to use this tool: when starting a direct or group conversation and posting an initial message. It also adds the important context that existing conversations are reused. It does not explicitly name alternatives or exclusions, but the core usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create-threadB

Create a new thread in a workspace channel. Requires a channel ID, title, and content. Optionally notify specific users or groups.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesThe title of the thread.
groupsNoOptional array of group IDs to notify. Use get-groups to discover group IDs before passing them here.
contentYesThe content/body of the thread.
channelIdYesThe ID of the channel to create the thread in.
recipientsNoOptional array of user IDs to notify. If omitted, Twist defaults to notifying all current members of the channel (equivalent to the API's "EVERYONE" default). Note: workspace users who have not joined this channel will not be notified — add their IDs explicitly if you want to reach them.
displayInInboxNoIf true, unarchives the thread after creation so it appears in the author's Inbox. Defaults to false. Can also be enabled for all calls by setting the TWIST_CREATE_THREAD_DISPLAY_IN_INBOX=true environment variable (local MCP only).

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
titleYes
groupsNo
contentYes
createdYes
creatorYes
successYes
threadIdYes
channelIdYes
threadUrlYes
recipientsNo
workspaceIdYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal this is not read-only, not idempotent, and not destructive. The description adds the side-effect notion that it can optionally notify users or groups, but does not disclose the default notify-everyone behavior when recipients is omitted or the displayInInbox unarchive behavior. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the core purpose front-loaded. No filler, though 'Requires a channel ID, title, and content' is partly redundant with the schema's required list. It remains easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with a rich parameter schema and an output schema, the description plus structured fields is sufficient for an agent to invoke it. It could be more complete about notification defaults and inbox behavior, but those are covered in the parameter schema, and return values are handled by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the structured parameter descriptions already do the heavy lifting. The tool description largely restates required fields and optional notification rather than adding meaning beyond channelId, title, content, recipients, groups, or displayInInbox.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a clear verb and resource: 'Create a new thread in a workspace channel.' It names the primary required inputs, so an agent knows what object this tool acts on. It does not explicitly contrast with the sibling create-conversation, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance versus alternatives such as create-conversation or reply. The statement of required fields helps invocation but does not tell the agent when this tool is the correct choice or when it should choose another sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete-objectA
DestructiveIdempotent

Permanently delete a Twist object. targetType: "thread" deletes a thread (and all of its comments); "comment" deletes a single thread comment; "message" deletes a direct/group conversation message. Always pass targetId. Deletion is irreversible — confirm with the user before invoking. Note: the Twist API only allows deletion by the object's creator or a workspace admin; the call will be rejected otherwise.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetIdYesThe ID of the thread, comment, or conversation message to delete.
targetTypeYesThe type of object to delete: thread, comment, or message.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
successYes
threadIdNo
commentIdNo
messageIdNo
targetTypeYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive, but the description goes further: it states that deletion is permanent and irreversible, that thread deletion cascades to comments, that permission is restricted to creator or workspace admin, and that the call will be rejected otherwise. This is valuable behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the first defines the action and variants, the second mandates the required parameter and warns of irreversibility, and the third covers permission constraints. Information is front-loaded and there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what the tool deletes, what each target type means, the required parameter, the irreversibility, the need for user confirmation, and permission restrictions. An agent has enough to select and invoke it correctly without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaning by explaining the behavioral effect of each targetType value (thread cascades, comment is single, message is direct/group) and explicitly instructs to always pass targetId, which reinforces the schema's required fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Permanently delete') and resource ('Twist object'), then enumerates exactly what each targetType does. It clearly differentiates from siblings like update-object and create-thread by scope and semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear operational context: which object types are valid, that targetId is always required, and that deletion is irreversible and requires confirmation. It also names the permission conditions. It does not explicitly name alternative tools or say when not to use it, but it strongly implies the intended use cases.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch-inboxA
Read-onlyIdempotent

Fetch inbox view with threads, conversations, unread counts, and unread IDs. Provides a complete picture of the inbox state. Use archiveFilter "all" to include threads marked as done alongside active threads.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of items to return.
sinceDateNoOptional date to get items since (YYYY-MM-DD format).
untilDateNoOptional date to get items until (YYYY-MM-DD format).
onlyUnreadNoOnly return unread items.
workspaceIdYesThe workspace ID to fetch inbox for.
archiveFilterNoFilter inbox threads by archive status. "active" (default) shows only current threads, "archived" shows only done/archived threads, "all" shows both active and done threads.active

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
threadsYes
unreadCountYes
workspaceIdYes
totalThreadsYes
conversationsYes
unreadThreadsYes
totalConversationsYes
unreadConversationsYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral detail beyond annotations by specifying that the response includes unread counts and IDs and clarifying how archiveFilter affects which threads are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is front-loaded and informative, and the final sentence provides a concrete parameter usage tip. The middle sentence, 'Provides a complete picture of the inbox state,' is somewhat redundant with the first sentence and could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The combination of a fully described schema, rich annotations, and an output schema means the description does not need to explain parameters or return structure in depth. The description adds the key behavioral nuance about archiveFilter, and there are no obvious gaps that would prevent an agent from calling the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters, including defaults and enum meanings. The description's mention of archiveFilter 'all' adds little beyond the schema's existing enum description, so it earns the baseline score rather than extra credit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: 'Fetch inbox view' and enumerates the contents (threads, conversations, unread counts, unread IDs). This distinguishes it from sibling tools like load-thread or load-conversation, which target individual items rather than the aggregate inbox state.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for getting a complete picture of the inbox, and it gives specific guidance about using archiveFilter 'all' to include done threads. However, it does not explicitly contrast this tool with siblings such as get-mentions, search-content, or load-conversation, or state when one would be preferred over another.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-groupsA
Read-onlyIdempotent

Get groups from a workspace. Retrieves all workspace groups by default, or specific groups if groupIds array is provided. Supports optional case-insensitive search filtering by group name. Use this before passing group IDs to tools that support group notifications.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupIdsNoOptional array of specific group IDs to fetch. If not provided or empty array, fetches all workspace groups.
searchTextNoOptional search text to filter groups by name (case-insensitive).
workspaceIdYesThe workspace ID to get groups from.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
groupsYes
totalGroupsYes
workspaceIdYes
filteredGroupsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral nuance beyond the schema: default fetch-all behavior, empty array semantics, and case-insensitive search. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences lead with the core action, then detail filtering behavior, then add the practical use-case. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple read-only lookup with an output schema present, complete parameter documentation, and annotations covering safety. The description adds the default-retrieval behavior and the notification use-case, making it fully sufficient for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all three parameters. The description largely restates the groupIds and searchText semantics rather than adding meaningful new meaning, keeping this at the baseline level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb-resource relationship ('Get groups from a workspace'), then sharpens scope by explaining the default behavior (all workspace groups), the optional groupIds filter, and case-insensitive search by name. This differentiates it from sibling read tools like get-users or get-workspaces.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete when-to-use signal: 'Use this before passing group IDs to tools that support group notifications.' It does not explicitly name alternative tools or state when not to use it, but the purpose context is clear enough for an agent to select it appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-mentionsA
Read-onlyIdempotent

Fetch threads, comments, and messages that mention the current user. Supports filtering by channel, author, and date range. Use this instead of search-content when no keyword query is needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return.
cursorNoCursor for pagination.
dateToNoEnd date for filtering (YYYY-MM-DD).
dateFromNoStart date for filtering (YYYY-MM-DD).
authorIdsNoFilter by author user IDs.
channelIdsNoFilter by channel IDs.
workspaceIdYesThe workspace ID to search in.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
cursorNo
hasMoreYes
resultsYes
workspaceIdYes
totalResultsYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the read-only safety profile is covered. The description adds useful scoping context (current-user mentions, result types), but does not disclose details like pagination behavior or rate limits. With annotations handling the core behavioral contract, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both meaningful: the first states purpose and result types, the second covers filters and the sibling-tool distinction. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only fetch tool with full parameter descriptions, a required workspaceId, an output schema, and safety annotations, the description covers the essential selection and invocation guidance. Pagination is handled by cursor in the schema, and the search-content alternative is explicitly named, leaving no critical gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter. The description's mention of filtering by channel, author, and date range maps to existing parameters (channelIds, authorIds, dateFrom/dateTo) but adds no syntax or semantic detail beyond what the schema already provides, keeping this at the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch threads, comments, and messages that mention the current user.' It clearly distinguishes the tool from search-content by noting the no-keyword-query case, so an agent can tell them apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to prefer this tool over search-content ('Use this instead of search-content when no keyword query is needed') and describes the available filtering dimensions (channel, author, date range). This gives the agent clear routing context and practical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-usersA
Read-onlyIdempotent

Get users from a workspace. Retrieves all workspace users by default, or specific users if userIds array is provided. Supports optional case-insensitive search filtering by name or email.

ParametersJSON Schema
NameRequiredDescriptionDefault
userIdsNoOptional array of specific user IDs to fetch. If not provided or empty array, fetches all workspace users.
searchTextNoOptional search text to filter users by name or email (case-insensitive).
workspaceIdYesThe workspace ID to get users from.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
usersYes
totalUsersYes
workspaceIdYes
filteredUsersYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is read-only, idempotent, and non-destructive. The description adds useful behavioral context such as the default fallback to all workspace users and case-insensitive filtering by name or email. It does not mention edge cases like empty arrays, pagination, or invalid IDs, but the annotations cover the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no filler. It front-loads the core purpose and then adds default behavior and filtering details efficiently. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that this is a read-only lookup tool with full schema descriptions and an output schema available, the description covers the essential behavior completely. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and every parameter already has a meaningful description. The tool description mostly restates the parameter behavior rather than adding new semantic detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: get users from a workspace. It also explains the default full-list behavior and optional filtering, which makes the tool's purpose easy to identify, though it does not explicitly contrast it with the user-info sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: fetch all workspace users, fetch specific users by ID, or filter by case-insensitive search text. It does not name alternatives or state when not to use it, but the intended call patterns are explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get-workspacesA
Read-onlyIdempotent

Get all workspaces that the user belongs to. Returns a list of workspaces with their IDs, names, creators, creation dates, and optional default channels, conversations, and plan information.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
workspacesYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds a scoping behavior ('that the user belongs to') and return field details, but does not disclose pagination, ordering, or other runtime behavior. This is acceptable with annotations, though not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no fluff. The primary action is front-loaded, and the return value summary is compact. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list operation with an output schema present, the description is complete. It states what is returned and the user scoping, and the output schema handles field-level details. No critical information is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing to explain beyond the implicit authentication context. The description correctly implies that the 'user' is derived from the session, satisfying the baseline for no-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Get' and the resource 'workspaces that the user belongs to', making the action and scope unambiguous. It also lists the returned fields, which further distills the purpose from sibling tools like get-users or get-groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use the tool—when the user needs all workspaces they belong to—but it does not explicitly state alternatives or when-not-to-use cases. There is no mention of exclusion scenarios, so usage guidance remains implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list-channelsA
Read-onlyIdempotent

List channels in a workspace. By default returns only active channels; set includeArchived to true to also include archived channels. Returns channel IDs, names, descriptions, visibility (public/private), archive status, creators, creation dates, URLs, and colors.

ParametersJSON Schema
NameRequiredDescriptionDefault
workspaceIdYesThe workspace ID to list channels from.
includeArchivedNoWhether to include archived channels. If true, both active and archived channels are returned. Defaults to false (active channels only).

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
channelsYes
workspaceIdYes
totalChannelsYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value beyond annotations by disclosing the default filtering behavior (active-only) and the full set of returned channel attributes, which helps the agent predict the response shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The main action is front-loaded, the default behavior is stated early, and the optional toggle and return fields are packed efficiently into a compact, readable description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read-only tool with full schema coverage, an output schema, and safety annotations, the description supplies everything needed to call it correctly: scope, default behavior, optional parameter effect, and return contents. No significant gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented in the schema. The description mostly reiterates the includeArchived default behavior rather than adding new parameter-level semantics, and the baseline of 3 is appropriate when the schema carries the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb and resource: 'List channels in a workspace.' It immediately distinguishes the tool from workspace/user/thread-focused siblings and adds useful scope ('in a workspace') plus the return fields, so an agent can tell exactly what this tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: it lists active channels by default and explains when to set includeArchived to true. It does not explicitly name sibling alternatives, but no other sibling tool appears to list channels, so the primary usage decision—whether to include archived channels—is clearly addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load-conversationA
Read-onlyIdempotent

Load a conversation (direct message) with its metadata and messages. Supports filtering by timestamp and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of messages to return.
newerThanDateNoGet messages newer than this date (YYYY-MM-DD format).
olderThanDateNoGet messages older than this date (YYYY-MM-DD format).
conversationIdYesThe conversation ID to load.
includeParticipantsNoInclude participant user IDs in the response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
messagesYes
conversationYes
totalMessagesYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds useful behavior context by noting that metadata and messages are returned and that timestamp filtering/pagination are supported, but it does not explain ordering semantics, behavior when both date filters are provided, or pagination mechanics beyond the schema's limit field.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences cover the core purpose and key capabilities without wasted words. The main operation is front-loaded and the supporting capabilities follow concisely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only fetch tool with a full input schema and an output schema, the description provides enough scope: it names the resource type, the returned components, and the available filtering/pagination options. Minor behavioral details like result ordering are not specified, but the annotations and schema fill most gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds a high-level grouping of timestamp filtering and pagination but does not provide additional meaning beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a specific verb ('Load') with a clear resource ('a conversation (direct message)') and scope ('with its metadata and messages'). It also mentions filtering and pagination, which clearly separates it from thread-loading or search tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description establishes clear context: this tool loads direct-message conversations, not threads, and supports timestamp filtering and pagination. It does not explicitly name alternatives or state when not to use it, but the 'direct message' qualifier gives enough context to route an agent correctly among the sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load-threadB
Read-onlyIdempotent

Load a thread with its metadata and comments. Supports filtering by timestamp and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of comments to return.
threadIdYesThe thread ID to load.
newerThanDateNoGet comments newer than this date (YYYY-MM-DD format).
olderThanDateNoGet comments older than this date (YYYY-MM-DD format).
includeParticipantsNoInclude participant user IDs in the response.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
threadYes
commentsYes
totalCommentsYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds that it loads metadata and comments and supports timestamp filtering/pagination, which is useful but does not disclose details like pagination mechanics or response shape beyond what annotations/schema already imply.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded: it states the primary action and resource first, then mentions filtering/pagination in a compact second sentence. No redundant filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a read-only operation with a rich schema and output schema. However, it doesn't clarify how pagination works (e.g., whether limit is the only control or if there is an offset/cursor), and it doesn't mention the distinction from load-conversation, which an agent might need to choose correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are documented in the schema. The description adds only a high-level hint about timestamp filtering and pagination, which maps to newerThanDate, olderThanDate, and limit. No additional parameter meaning beyond the schema is provided.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('Load') and resource ('a thread'), and specifies that it returns metadata and comments. It does not explicitly distinguish itself from the sibling load-conversation, but the resource and filtering details make the core purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: use this when you need a thread's metadata and comments, and mentions filtering by timestamp and pagination. However, it does not explicitly contrast with siblings like load-conversation or fetch-inbox, nor state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mark-doneA
DestructiveIdempotent

Mark threads or conversations as done. Supports individual IDs or bulk operations (mark all in workspace/channel). For threads: can mark as read, archive in inbox, or clear all unread. For conversations: can mark as read and archive.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoSpecific thread or conversation IDs to mark as done. Use this OR bulk selectors.
typeYesThe type of items to mark as done: thread or conversation.
archiveNoArchive items in the inbox (threads only, default: true).
markReadNoMark items as read (default: true).
channelIdNoMark all threads in this channel as done (threads only).
clearUnreadNoClear all unread markers for workspace (threads only, requires workspaceId, default: false).
workspaceIdNoMark all threads in this workspace as done (threads only).

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
typeYes
failedYes
itemTypeYes
completedYes
selectorsNo
operationsYes
failureCountYes
successCountYes
totalRequestedYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true. The description adds meaningful context by specifying what 'mark done' actually does: mark as read, archive, and clear unread. It does not contradict annotations and discloses the mutating behaviors beyond what the structured fields alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core action, and every sentence adds useful information. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema covers all parameters and an output schema exists, so the description does not need to explain return values. It explains the major behavioral modes and per-type differences. It slightly undersells how the bulk selectors combine with flags, but overall it is sufficiently complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter. The description restates the higher-level intent of ids, channelId, workspaceId, and the boolean flags, but it does not add semantic detail beyond what the input schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: mark threads or conversations as done. It also distinguishes the main modes (individual IDs vs bulk workspace/channel) and the per-type behaviors, making the tool's purpose clear even among siblings like delete-object and update-object.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context: individual IDs versus bulk selectors, and thread-specific versus conversation-specific operations. It does not explicitly name alternatives or when-not-to-use cases, but the intended usage is well implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reactA
Destructive

Add or remove an emoji reaction on a thread, comment, or conversation message. Use targetType to specify the type of object (thread, comment, or message) and targetId for the ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
emojiYesThe emoji to react with (e.g., "👍", "❤️", "🎉").
targetIdYesThe ID of the thread, comment, or message to react to.
operationNoWhether to add or remove the reaction.add
targetTypeYesThe type of object to react to: thread, comment, or message.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
emojiYes
successYes
targetIdYes
operationYes
targetUrlYes
targetTypeYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the tool is read/write, non-idempotent, and destructive, so the description doesn't contradict them. The description adds context about target types, but it does not disclose behavior such as whether adding an existing reaction replaces it, whether removal is idempotent, or what the response contains. Given annotation coverage, a mid-range score is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The action and target types are front-loaded, and the pointer to targetType/targetId is efficient and directly useful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with a complete input schema and output schema, covers the essential information an agent needs to select and invoke the tool. It could mention the operation default or enum, but the schema already documents those details, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds minimal value beyond the schema by restating targetType/targetId roles, but it does not introduce new parameter details or usage nuances.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action—'Add or remove an emoji reaction'—and names the resource types explicitly (thread, comment, conversation message). It clearly differentiates the tool from siblings like reply, delete-object, or update-object by focusing on emoji reactions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context on when to use the tool: whenever an emoji reaction needs to be added or removed on a thread, comment, or message. It does not explicitly name alternatives or exclusions, but none of the sibling tools target reactions, so the usage scope is adequately defined.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

replyA

Post a reply to a thread (as a comment) or conversation (as a message). Thread replies notify everyone who has interacted with the thread by default unless specific user recipients, groups, or a notifyAudience are provided.

ParametersJSON Schema
NameRequiredDescriptionDefault
groupsNoOptional array of group IDs to notify (only for thread replies). Use get-groups to discover group IDs before passing them here.
contentYesThe content of the reply.
targetIdYesThe ID of the thread or conversation to reply to.
recipientsNoOptional array of user IDs to notify (only for thread replies). If omitted with no groups and no notifyAudience, thread replies default to notifying everyone who has interacted with the thread.
targetTypeYesThe type of object to reply to: thread (posts a comment) or conversation (posts a message).
notifyAudienceNoOptional broader audience to notify in addition to recipients and groups (only for thread replies). 'channel' notifies everyone in the channel; 'thread' notifies everyone who has interacted with the thread.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
groupsNo
contentYes
createdYes
replyIdYes
successYes
replyUrlYes
targetIdYes
recipientsNo
targetTypeYes
notifyAudienceNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses a meaningful side effect: thread replies notify all thread participants by default unless recipients, groups, or notifyAudience are provided. This is valuable behavior information for an agent deciding on notification impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, with the primary action stated first and the notification behavior following. Every word earns its place, and there is no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description, combined with the well-covered schema and output schema, gives an agent enough to call the tool correctly. It captures the core dual behavior and the notification side effect, though it could explicitly mention how to discover user/group IDs beyond what the schema already notes for groups.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains each parameter. The description adds a concise summary of the notification default, but it does not meaningfully expand on what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Post a reply to a thread (as a comment) or conversation (as a message).' It clearly distinguishes the tool's operation from sibling tools like create-thread or create-conversation by focusing on replying to existing objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it clear this tool is for replying to existing threads or conversations, which implies when it should be used rather than creating new content. It adds notification-default context that helps with optional parameters, but it does not explicitly name alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search-contentA
Read-onlyIdempotent

Search across a workspace for threads, comments, and messages. Supports filtering by channels, authors, dates, and mentions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return.
queryYesThe search query string.
cursorNoCursor for pagination.
dateToNoEnd date for filtering (YYYY-MM-DD).
dateFromNoStart date for filtering (YYYY-MM-DD).
authorIdsNoFilter by author user IDs.
channelIdsNoFilter by channel IDs.
mentionSelfNoFilter by mentions of current user.
workspaceIdYesThe workspace ID to search in.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
queryYes
cursorNo
hasMoreYes
resultsYes
workspaceIdYes
totalResultsYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive, covering the main safety profile. The description adds useful scope about the content types searched (threads, comments, messages) and available filters, but it does not describe return format, pagination behavior, or other operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler. The main purpose is front-loaded, and the filter capability is summarized efficiently, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only search tool with complete parameter descriptions and an output schema, the description is largely sufficient. It covers what is searched and the key filtering dimensions. The only notable gap is lack of explicit guidance on how this tool relates to overlapping sibling tools, but that is more of a usage-guidance concern.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already well documented. The description's mention of filtering by channels, authors, dates, and mentions adds a helpful summary but does not provide semantic detail beyond what the schema already supplies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: searching across a workspace for threads, comments, and messages. It communicates the tool's scope without being a mere restatement of the name, though it does not explicitly differentiate itself from sibling tools like get-mentions or load-thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through 'Search across a workspace' and mentions supported filters, which gives agents a reasonable sense of when to invoke it. However, it does not explicitly state when not to use it or name alternatives, especially since get-mentions overlaps with the mention filter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update-objectA
Idempotent

Update an existing Twist object. targetType: "thread" updates a thread's title and/or body; "comment" updates a thread comment's body; "message" updates a direct/group conversation message's body. Always pass targetId. content is required for "comment" and "message"; for "thread" it is optional as long as title is provided (i.e. a thread can be renamed without re-sending the body). title is only valid when targetType is "thread".

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoThe new title. Only valid when targetType is "thread".
contentNoThe new content/body. Required for comments and messages; for threads, optional if title is provided.
targetIdYesThe ID of the thread, comment, or conversation message to update.
targetTypeYesThe type of object to update: thread, comment, or message.

Output Schema

ParametersJSON Schema
NameRequiredDescription
typeYes
titleNo
contentYes
successYes
threadIdNo
channelIdNo
commentIdNo
messageIdNo
threadUrlNo
commentUrlNo
lastEditedNo
messageUrlNo
workspaceIdYes
conversationIdNo

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide idempotentHint=true, readOnlyHint=false, and destructiveHint=false, so the safety profile is covered. The description adds no behavioral context beyond those hints, such as side effects, permissions, rate limits, or error behavior; it focuses on parameter applicability rather than runtime behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact at four sentences and front-loads the core purpose. Each sentence contributes necessary conditional logic, and it avoids filler while covering the polymorphic behavior completely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the polymorphic behavior of targetType, the description fully covers the conditional requirements for all three object types, says targetId is always required, and clarifies the thread rename case. With a complete input schema and an output schema present, nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics: it explains how targetType drives which fields are updated, that title is only valid for threads, and that content is conditionally required. This goes beyond the individual property descriptions in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Update an existing Twist object.' It then enumerates the exact variants by targetType (thread, comment, message) and which fields each updates, distinguishing this tool from create/delete siblings in the same family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear conditional usage rules: when targetType is each value, which fields are required or optional, and that targetId must always be passed. It does not explicitly name alternative tools like create-thread or delete-object, but the context makes the update-vs-create/delete distinction obvious from sibling names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

user-infoA
Read-onlyIdempotent

Get comprehensive user information including user ID, name, email, timezone, bot status, default workspace, and away mode status.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
botYes
nameYes
typeYes
emailYes
userIdYes
timezoneYes
defaultWorkspaceYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is established. The description adds the list of returned fields but does not disclose whether the information is about the current user or another user, which is a meaningful behavioral nuance beyond what annotations cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It conveys the core purpose and enumerates the key included fields efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema, zero parameters, and read-only annotations covers much of the needed context. The main gap is the missing explicit statement about whose user information is returned, which is particularly relevant given siblings like 'get-users'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema places no burden on the description to explain parameter meaning. The description's field list is useful context for what the returned data will contain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get') with a clear resource ('comprehensive user information') and enumerates the exact fields returned, making the tool's purpose unmistakable. It also implicitly differentiates from sibling 'get-users' by focusing on a single user's detailed info rather than a list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance is given about when to use this tool versus siblings like 'get-users' or 'get-workspaces'. The zero-parameter schema implies the current user, but the description never states that this returns the authenticated user's information, leaving an inference gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 19 tool updatesv7.0.0
    • Changedaway2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedbuild-link2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate-conversation2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedcreate-thread2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddelete-object2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedfetch-inbox2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-groups2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-mentions2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-users2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget-workspaces2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist-channels2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedload-conversation2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedload-thread2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmark-done2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreact2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreply2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch-content2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedupdate-object2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeduser-info2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 1 tool updatev5.6.0
    • Addedcreate-conversation
  3. 18 tool updatesv5.5.1
    • First observedaway
    • First observedbuild-link
    • First observedcreate-thread
    • First observeddelete-object
    • First observedfetch-inbox
    • First observedget-groups
    • First observedget-mentions
    • First observedget-users
    • First observedget-workspaces
    • First observedlist-channels
    • First observedload-conversation
    • First observedload-thread
    • First observedmark-done
    • First observedreact
    • First observedreply
    • First observedsearch-content
    • First observedupdate-object
    • First observeduser-info

TDQS

A3.7/5.0
Disambiguation5/5

Each tool targets a distinct resource or action: user self-management, workspace lookups, inbox/thread/conversation loading, search/mentions, creation, update/delete, replies, reactions, and done state. Even similar tools like get-mentions and search-content are clearly differentiated by intent.

Naming Consistency3/5

The tool names are readable and mostly action-oriented, but retrieval verbs are inconsistent: get-workspaces, fetch-inbox, load-thread, search-content, and list-channels all describe read operations. Names like user-info and away break the verb-noun pattern entirely.

Tool Count3/5

At 19 tools, the set sits in the borderline 16-25 range and feels somewhat heavy. Most tools have legitimate purposes, but a few could potentially be consolidated or omitted without losing core functionality.

Completeness4/5

The core collaboration workflows are well covered: reading inbox/threads/conversations, searching, creating threads/conversations, replying, updating/deleting objects, reacting, and marking done. Minor gaps exist around channel/workspace administration and group management, but agents can accomplish most typical tasks.

Maintenance

ActivityActive
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Doist/twist-ai'

If you have feedback or need assistance with the MCP directory API, please join our Discord server