mcp-server-mattermost
MCP server that lets AI assistants read, search, post, and manage content in a Mattermost workspace via 38 tools.
Channels: list, create, join, leave, get details, get by name, mark viewed, manage members, create DMs
Messages: post, read recent/unread/since-timestamp, search, edit, delete, with rich attachments
Reactions & Threads: add/remove/list emoji reactions, pin/unpin messages, fetch full thread history
Users: get current user, get/search users by ID or username, check online status
Teams: list teams, get team details and members
Files: upload files, fetch metadata and public download links
Bookmarks (Entry+ edition): list, create, update, delete, and reorder channel bookmarks
Provides tools to read, search, and post messages in Mattermost, manage channels, reactions, threads, files, users, teams, and bookmarks.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-server-mattermostSearch for messages about the outage last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-server-mattermost
Let AI assistants read, search, and post in your Mattermost workspace
38 tools · Channels · Messages · Reactions · Threads · Files · Users
Features
Channels — list, create, join, manage channels and DMs Messages — send, search, edit, delete with rich attachments Reactions & Threads — emoji reactions, pins, full thread history Users & Teams — lookup, search, status Files — upload, metadata, download links Bookmarks — save links and files in channels (Entry+ edition)
Related MCP server: Slack MCP Server
Example Queries
Once configured, you can ask your AI assistant:
"List all channels and find where the deployment discussion is happening"
"What did I miss in #engineering since yesterday morning?"
"Show me my unread channels and summarize the threads I was mentioned in"
"Send a build status alert to #engineering with a red attachment"
"Search for messages about the outage last week and summarize"
"Summarize this thread and post the key decisions"
"Find who worked on the authentication bug last week"
"Upload the report.pdf to #general and share the link"
Available Tools
Tool | Description | Key Parameters |
| List public channels in a team |
|
| List your channels with unread counts |
|
| Get channel details by ID |
|
| Get channel by name |
|
| Create a new channel |
|
| Join a public channel |
|
| Leave a channel |
|
| Mark a channel as viewed (reset unread counters) |
|
| List channel members |
|
| Add user to channel |
|
| Create DM channel |
|
Tool | Description | Key Parameters |
| Send a message to a channel |
|
| Get messages: recent, unread window, or |
|
| Search messages by term |
|
| Edit a message |
|
| Delete a message |
|
Tool | Description | Key Parameters |
| Add emoji reaction |
|
| Remove emoji reaction |
|
| Get all reactions on a post |
|
| Pin a message |
|
| Unpin a message |
|
| Get thread messages |
|
Tool | Description | Key Parameters |
| Get current user info | — |
| Get user by ID |
|
| Get user by username |
|
| Search users |
|
| Get online status |
|
Tool | Description | Key Parameters |
| List your teams | — |
| Get team details |
|
| List team members |
|
Tool | Description | Key Parameters |
| Upload a file |
|
| Get file metadata |
|
| Get download link |
|
Note: Requires Entry, Professional, Enterprise, or Enterprise Advanced edition (not available in Team Edition). Minimum version: v10.1.
Tool | Description | Key Parameters |
| List channel bookmarks |
|
| Create link or file bookmark |
|
| Update bookmark properties |
|
| Delete a bookmark |
|
| Reorder bookmark |
|
Quick Start
Get a Mattermost bot token
Add to your MCP client config:
{
"mcpServers": {
"mattermost": {
"command": "uvx",
"args": ["mcp-server-mattermost"],
"env": {
"MATTERMOST_URL": "https://your-server.com",
"MATTERMOST_TOKEN": "your-token"
}
}
}
}Restart your client
Full setup guide — Claude Desktop, Cursor, Claude Code, Opencode, Docker, pip
Configuration
Variable | Required | Default | Description |
| Yes | — | Mattermost server URL |
| No |
| Auth mode: |
| Conditional | — | Bot or personal token. Required for |
| No | 30 | Request timeout in seconds |
| No | 3 | Max retry attempts |
| No | true | Verify SSL certificates |
| No | 100 | Max HTTP connections in the shared pool |
| No | 20 | Max idle keepalive connections, clamped to max connections |
| No | 30.0 | Idle keepalive connection lifetime in seconds |
| No | — | Path to extra PEM CAs appended to the default trust store |
| No | INFO | Logging level |
| No | json | Log output format: |
| No | v4 | Mattermost API version |
For client_token and oauth_proxy modes — including Mattermost OAuth App
registration, all MATTERMOST_OAUTH_* settings, and MCP client connection — see
Authentication.
Docker
Stdio mode (default)
docker run -i --rm \
-e MATTERMOST_URL=https://your-mattermost.com \
-e MATTERMOST_TOKEN=your-token \
legard/mcp-server-mattermost{
"mcpServers": {
"mattermost": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MATTERMOST_URL=https://your-mattermost.com",
"-e", "MATTERMOST_TOKEN=your-token",
"legard/mcp-server-mattermost"
]
}
}
}HTTP mode (production)
For networked HTTP use per-client auth. static_token over HTTP serves an unauthenticated endpoint acting
with the shared token (the server starts but logs a loud warning) — see
Authentication → HTTP transport.
docker run -d -p 8000:8000 \
-e MCP_TRANSPORT=http \
-e MCP_HOST=0.0.0.0 \
-e MATTERMOST_AUTH_MODE=client_token \
-e MATTERMOST_URL=https://your-mattermost.com \
-e MATTERMOST_HTTP_HOST_ORIGIN_PROTECTION=auto \
-e MATTERMOST_HTTP_ALLOWED_HOSTS=mcp.example.com \
legard/mcp-server-mattermostclient_token means each MCP client authenticates with its own Mattermost token, sent as
Authorization: Bearer <token> — a client configured without one gets 401. The two
MATTERMOST_HTTP_* variables turn on Host/Origin (DNS-rebinding) protection, which is off by
default; see HTTP transport security.
Health check: curl http://localhost:8000/health
HTTP mode with Mattermost OAuth proxy
Register a Mattermost OAuth 2.0 Application first:
Mattermost field | Production value |
Is Trusted | Yes |
Is Public Client | No |
Callback URLs |
|
Then run the MCP server:
docker run -d -p 8000:8000 \
-e MCP_TRANSPORT=http \
-e MCP_HOST=0.0.0.0 \
-e MATTERMOST_AUTH_MODE=oauth_proxy \
-e MATTERMOST_URL=https://mattermost.internal \
-e MATTERMOST_OAUTH_MATTERMOST_PUBLIC_URL=https://mattermost.example.com \
-e MATTERMOST_OAUTH_MCP_PUBLIC_URL=https://mcp.example.com \
-e MATTERMOST_OAUTH_CLIENT_ID=your-mattermost-oauth-app-id \
-e MATTERMOST_OAUTH_CLIENT_TYPE=confidential \
-e MATTERMOST_OAUTH_CLIENT_SECRET=your-mattermost-oauth-app-secret \
legard/mcp-server-mattermostIf your Mattermost login uses Keycloak SSO, users authenticate through Keycloak inside the Mattermost OAuth login flow. The MCP server does not need a Keycloak client.
Connect Claude Code with Dynamic Client Registration:
claude mcp add --transport http mattermost https://mcp.example.com/mcpDo not pass --client-id for this server; the MCP client registers with the MCP server,
and the MCP server uses the fixed Mattermost OAuth App upstream.
Environment Variables (Docker)
Variable | Default | Description |
|
| Transport: |
|
| HTTP bind host (use |
|
| HTTP port |
Documentation
📖 mcp-server-mattermost.readthedocs.io
Quick Start — Installation and setup
Configuration — Environment variables
Tools Reference — Detailed API documentation
llms.txt — AI-readable documentation index
Development
# Clone and install
git clone https://github.com/cloud-ru-tech/mcp-server-mattermost
cd mcp-server-mattermost
uv sync --dev
# Run unit tests
uv run pytest
# Run integration tests (requires Docker or external Mattermost)
uv run pytest tests/integration -v
# Type checking
uv run mypy src/
# Linting
uv run ruff check src/ tests/
# Run locally
MATTERMOST_URL=https://... MATTERMOST_TOKEN=... uv run mcp-server-mattermostIntegration Tests
Integration tests run against a real Mattermost server via Docker (Testcontainers) or external server.
# With Docker (Testcontainers) — automatic setup
uv run pytest tests/integration -v
# Against external Mattermost server
export MATTERMOST_URL=https://your-server.com
export MATTERMOST_TOKEN=your-bot-token
uv run pytest tests/integration -v
# Run specific test module
uv run pytest tests/integration/test_channels.py -vIntegration tests are excluded from the default pytest run. Unit tests run with:
uv run pytest # Unit tests onlyDebugging
Use the MCP Inspector to debug:
npx @modelcontextprotocol/inspector uvx mcp-server-mattermostContributing
Contributions welcome! See CONTRIBUTING.md for guidelines.
License
MIT — see LICENSE for details.
Built with FastMCP · Mattermost API v4
Available Tools
38 toolsadd_reactionAIdempotent
Add an emoji reaction to a message.
Adds a reaction from the authenticated user. Common emojis: thumbsup, thumbsdown, smile, heart, eyes. Adding the same reaction twice has no additional effect.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| emoji_name | Yes | Emoji name without colons (e.g., 'thumbsup', 'smile') |
Output Schema
| Name | Required | Description |
|---|---|---|
| post_id | Yes | Post that was reacted to |
| user_id | Yes | User who reacted |
| create_at | Yes | Reaction timestamp |
| emoji_name | Yes | Emoji name without colons |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotent and non-destructive behavior. Description adds detail that adding the same reaction twice has no effect, reinforcing idempotency. Also notes the action is by the authenticated user, which is useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the primary action. No unnecessary words, every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and annotations, the description covers key behavioral aspects like idempotency and common usage. Could briefly mention the response, but output schema likely handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema provides 100% coverage with clear descriptions for both parameters. Description adds a list of common emojis and format notes, but this is supplementary and not essential. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Add' and resource 'emoji reaction to a message', specifying it's from the authenticated user. Differentiates from sibling tools like 'remove_reaction'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly identifies when to use (to add a reaction), and by listing common emojis provides practical guidance. Does not explicitly state when not to use or mention alternatives, but it's clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_user_to_channelAIdempotent
Add a user to a channel.
Requires permission to manage channel members. Adding a user who is already in the channel has no additional effect.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | 26-character user identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| roles | Yes | Space-separated role names |
| user_id | Yes | User identifier |
| msg_count | Yes | Messages seen count, including replies in threads |
| channel_id | Yes | Channel identifier |
| mention_count | Yes | Unread @-mentions count, including thread replies |
| last_update_at | Yes | Last update timestamp |
| last_viewed_at | Yes | Last viewed timestamp |
| msg_count_root | Yes | Root messages seen count, excluding thread replies |
| mention_count_root | Yes | Unread root @-mentions count, excluding thread replies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotency and non-destructiveness. The description adds behavioral detail: 'Adding a user who is already in the channel has no additional effect,' reinforcing idempotency without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two short sentences, each adding essential information without redundancy. It is well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and clear annotations, the description adequately covers purpose, permissions, and behavioral effects. No additional context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters. The description does not add additional meaning beyond what the schema already provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a user to a channel') with a specific verb and resource. It distinguishes from sibling tools like 'join_channel' (self-join) and 'leave_channel', providing clear purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a prerequisite ('Requires permission to manage channel members'), guiding the agent on when this tool is appropriate. It doesn't explicitly state when not to use it, but the condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bookmarkA
Create a channel bookmark.
Creates a link bookmark (URL) or file bookmark (attached file). For link type, link_url is required. For file type, file_id is required (from upload_file).
Note: Requires Entry, Professional, Enterprise, or Enterprise Advanced edition (not available in Team Edition). Minimum version: v10.1.
| Name | Required | Description | Default |
|---|---|---|---|
| emoji | No | Emoji icon | |
| file_id | No | File ID (required for file type) | |
| link_url | No | URL (required for link type) | |
| image_url | No | Preview image URL | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| display_name | Yes | Bookmark display name | |
| bookmark_type | Yes | Bookmark type: 'link' or 'file' |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique bookmark identifier |
| type | Yes | Bookmark type: 'link' or 'file' |
| emoji | No | Emoji icon |
| file_id | Yes | File ID for file bookmarks (empty for links) |
| link_url | No | URL for link bookmarks |
| owner_id | Yes | User ID who created the bookmark |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| file_info | No | File metadata for file bookmarks |
| image_url | No | Preview image URL |
| parent_id | No | Parent bookmark ID |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel this bookmark belongs to |
| sort_order | Yes | Position in bookmark list |
| original_id | No | Original bookmark ID if copied |
| display_name | Yes | Bookmark display name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that this is a creation operation (non-destructive, consistent with destructiveHint=false). It adds context about dependencies (file_id from upload_file) and edition/version limitations, enhancing transparency beyond minimal annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: two short paragraphs with clear front-loading of the purpose. Every sentence adds necessary information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7 parameters, 3 required, and presence of an output schema, the description adequately covers creation details. It explains type-specific requirements and edition/version constraints, though it could optionally mention that the bookmark is created in the specified channel.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All 7 parameters are described in the schema (100% coverage). The description adds value by clarifying the conditional requirements for link_url and file_id based on bookmark_type, which goes beyond the schema's individual property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a channel bookmark' and distinguishes between link and file bookmark types, making the purpose unambiguous. Compared to sibling tools like list_bookmarks or delete_bookmark, the action is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage conditions: for link type require link_url, for file type require file_id from upload_file. It also notes edition and version requirements. However, it does not explicitly state when not to use this tool or suggest alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_channelA
Create a new channel in a team.
Creates either a public (O) or private (P) channel. The authenticated user becomes the channel admin. Each call creates a new channel; use get_channel_by_name to check if it exists.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Channel name (lowercase, no spaces) | |
| header | No | Channel header | |
| purpose | No | Channel purpose | |
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| channel_type | No | Channel type: O=public, P=private, D=direct message, G=group message | O |
| display_name | Yes | Human-readable channel name |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique channel identifier |
| name | Yes | URL-friendly channel name |
| type | Yes | Channel type: O=public, P=private, D=direct, G=group |
| header | Yes | Channel header text |
| purpose | Yes | Channel purpose description |
| team_id | Yes | Team this channel belongs to |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| update_at | Yes | Last update timestamp in milliseconds |
| creator_id | Yes | User ID who created the channel |
| display_name | Yes | Human-readable channel name |
| last_post_at | Yes | Timestamp of last post |
| total_msg_count | Yes | Total message count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the annotations: the authenticated user becomes admin, and each call creates a new channel (non-idempotent). It correctly notes O and P types, though the schema includes D and G. No contradiction with destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding value: purpose, channel types, admin and idempotency guidance. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 params, schema coverage 100%, output schema exists), the description covers key behaviors and provides a useful check-idempotency tip. Slightly incomplete by not mentioning output structure, but output schema handles that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds contextual insight (admin, idempotency) but does not elaborate on specific parameters beyond the schema's descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Create' and the resource 'a new channel in a team'. It distinguishes from siblings by specifying channel types (public/private) and notes the user becomes admin, which differentiates from other channel creation tools like create_direct_channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using get_channel_by_name to check existence, which guides against duplicates. However, it does not mention when not to use this tool (e.g., for direct channels) or prerequisites like team membership, leaving some gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_direct_channelAIdempotent
Create a direct message channel between two users.
Returns an existing DM channel if one already exists between the users. Use this to get a channel ID for sending private messages. Then use post_message with the returned channel_id to send messages.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id_1 | Yes | 26-character user identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| user_id_2 | Yes | 26-character user identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique channel identifier |
| name | Yes | URL-friendly channel name |
| type | Yes | Channel type: O=public, P=private, D=direct, G=group |
| header | Yes | Channel header text |
| purpose | Yes | Channel purpose description |
| team_id | Yes | Team this channel belongs to |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| update_at | Yes | Last update timestamp in milliseconds |
| creator_id | Yes | User ID who created the channel |
| display_name | Yes | Human-readable channel name |
| last_post_at | Yes | Timestamp of last post |
| total_msg_count | Yes | Total message count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the idempotentHint annotation by stating 'Returns an existing DM channel if one already exists.' It adds behavioral context beyond annotations, clarifying the tool is non-destructive and suitable for private messaging.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-loaded with the primary purpose, followed by key behaviors and usage guidance. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input schema (2 params), annotations (idempotent, non-destructive), and output schema presence, the description fully covers the tool's purpose, idempotency, and next-step guidance (use post_message).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with clear descriptions for both user IDs, including examples. The tool description adds no additional parameter semantics beyond what the schema provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a direct message channel between two users and distinguishes itself from siblings like 'create_channel' by specifying the DM nature and the idempotent behavior of returning an existing channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells when to use it (to get a channel ID for private messages) and implicitly guides not to use it when a channel already exists by mentioning the return of existing DMs. It could explicitly contrast with sibling tools but is still effective.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_bookmarkA
Delete a channel bookmark.
Archives the bookmark (soft delete via delete_at timestamp). The bookmark will no longer appear in the channel.
Note: Requires Entry, Professional, Enterprise, or Enterprise Advanced edition (not available in Team Edition). Minimum version: v10.1.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| bookmark_id | Yes | 26-character bookmark identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique bookmark identifier |
| type | Yes | Bookmark type: 'link' or 'file' |
| emoji | No | Emoji icon |
| file_id | Yes | File ID for file bookmarks (empty for links) |
| link_url | No | URL for link bookmarks |
| owner_id | Yes | User ID who created the bookmark |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| file_info | No | File metadata for file bookmarks |
| image_url | No | Preview image URL |
| parent_id | No | Parent bookmark ID |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel this bookmark belongs to |
| sort_order | Yes | Position in bookmark list |
| original_id | No | Original bookmark ID if copied |
| display_name | Yes | Bookmark display name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description fully discloses the soft-delete mechanism ('Archives the bookmark (soft delete via delete_at timestamp)') and the effect ('will no longer appear in the channel'). No contradictions or gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise (3 sentences + note), front-loaded with the core action, and every sentence adds value. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete tool with 2 parameters and an output schema, the description is complete: it explains the action, behavior (soft delete), version/edition requirements, and effect on the UI. No missing information given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers both parameters with full descriptions (channel_id and bookmark_id). The description adds no additional parameter semantics beyond what the schema already provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Delete a channel bookmark' and explains soft-delete behavior. It distinguishes from sibling tools like update_bookmark and list_bookmarks by specifying the delete action and archival behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes edition requirements (Entry, Professional, Enterprise, Advanced) and minimum version (v10.1), explicitly excluding Team Edition. This provides clear context for when the tool is available. However, it does not explicitly compare to alternatives like update_bookmark or permanent delete, though soft-delete is noted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_messageA
Delete a message permanently.
Can only delete your own messages (unless admin). Deleted messages cannot be recovered. All reactions and thread context will be lost.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Fully describes permanent deletion, permission restrictions, and side effects (loss of reactions and thread context). No annotations, so description carries full burden and does so thoroughly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with front-loaded action verb. No wasted words; each sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple delete operation with one parameter, the description covers permissions, permanence, and side effects. No output schema needed, and no gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add further meaning to the post_id parameter beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Delete a message permanently' as the core action, with specific verb and resource. Distinguishes from siblings like update_message or pin_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Specifies that only own messages can be deleted unless admin, providing clear context. Mentions irreversibility and loss of reactions/thread context, guiding when not to use. No explicit alternative comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channelARead-onlyIdempotent
Get detailed information about a specific channel.
Returns channel metadata including name, purpose, header, and member count. Use when you have the channel ID. For lookup by channel name, use get_channel_by_name instead.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique channel identifier |
| name | Yes | URL-friendly channel name |
| type | Yes | Channel type: O=public, P=private, D=direct, G=group |
| header | Yes | Channel header text |
| purpose | Yes | Channel purpose description |
| team_id | Yes | Team this channel belongs to |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| update_at | Yes | Last update timestamp in milliseconds |
| creator_id | Yes | User ID who created the channel |
| display_name | Yes | Human-readable channel name |
| last_post_at | Yes | Timestamp of last post |
| total_msg_count | Yes | Total message count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent and read-only; description adds value by specifying returned fields (name, purpose, header, member count) without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then return info, then usage guidance. No redundant or tangential content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present, description adequately covers need; hints at returned fields and is sufficient for a simple lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter description; description reinforces purpose but adds minimal new information beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb+resource ('Get detailed information about a specific channel') and explicitly distinguishes from sibling tool 'get_channel_by_name', making purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage condition ('Use when you have the channel ID') and directs to alternative for name lookup, giving clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channel_by_nameARead-onlyIdempotent
Get a channel by its name within a team.
Returns channel metadata including name, purpose, header, and member count. Use when you know the channel name but not the ID. For lookup by ID, use get_channel instead.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| channel_name | Yes | Channel name (lowercase, no spaces) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique channel identifier |
| name | Yes | URL-friendly channel name |
| type | Yes | Channel type: O=public, P=private, D=direct, G=group |
| header | Yes | Channel header text |
| purpose | Yes | Channel purpose description |
| team_id | Yes | Team this channel belongs to |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| update_at | Yes | Last update timestamp in milliseconds |
| creator_id | Yes | User ID who created the channel |
| display_name | Yes | Human-readable channel name |
| last_post_at | Yes | Timestamp of last post |
| total_msg_count | Yes | Total message count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds return field context (name, purpose, header, member count) consistent with read-only behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose, no redundancy. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given simplicity, annotations, and output schema, description provides sufficient context for selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. Description adds value by hinting at return fields, though schema already details parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool gets a channel by name, returns metadata, and distinguishes from get_channel by ID lookup. Specific verb-resource pair.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (know name, not ID) and when not (use get_channel for ID lookup), providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channel_membersARead-onlyIdempotent
Get members of a channel.
Returns list of users who are members of the channel. Use to see who can receive messages in a channel.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-indexed) | |
| per_page | No | Results per page | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, establishing safe read behavior. The description adds that it returns a list of users, which is useful but does not disclose additional traits like pagination behavior or rate limits. The description is adequate but not rich beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The key action and purpose are front-loaded: 'Get members of a channel.' Every sentence adds value without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the existence of an output schema (context signal), the description need not detail return values. It explains the primary function and use case. Minor gap: does not mention pagination explicitly, but the schema handles that. Overall, complete for a read operation with well-documented parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters have descriptions in the input schema (100% coverage), so the schema already explains them. The tool description does not add meaning beyond what the schema provides, earning the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get members of a channel' and explains the resource (members) and action (get). It distinguishes itself from siblings like 'add_user_to_channel' by focusing on reading membership rather than modifying it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a use case: 'Use to see who can receive messages in a channel.' This helps the agent understand when to invoke the tool. However, it does not explicitly exclude scenarios or mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_channel_messagesARead-onlyIdempotent
Get messages from a channel — recent history, the user's unread window, or posts changed since a watermark.
Three mutually-exclusive modes. Pick by user intent:
"Show last N" / "what's in this channel" → default (page, per_page). Reverse-chronological.
truncated=True⇒ more posts exist; paginate."What did I miss" →
unread_only=True. The user's unread window anchored atlast_viewed_at, withlimit_beforecontext posts. Quirk: on a never-viewed channel (last_viewed_at == 0)orderis empty even whenunread_msg_count > 0— callmark_channel_viewedonce to bootstrap."Sync everything since " →
since=<unix_ms>. Posts withupdate_at > since, including edits of older posts and tombstones (delete_at != 0, emptymessage). Server caps at 1000; ontruncated=Truestep the watermark forward in smaller windows.
Returns {order, posts, truncated}. posts may contain more entries
than order (root posts pulled in by thread replies). System posts
(type starts with "system_") appear in unread_only/since
responses but are NOT counted in unread_msg_count.
For keyword search use search_messages; for full threads use get_thread.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-indexed) | |
| since | No | Unix timestamp in milliseconds (>= 10^12, i.e. >= 2001-01-01); return posts modified after this time. Mutually exclusive with unread_only and pagination. Use ChannelWithUnreads.last_viewed_at from list_my_channels. | |
| per_page | No | Results per page | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| limit_after | No | In unread_only mode: unread posts to return (1-200) | |
| unread_only | No | Return only the user's unread window via /posts/unread | |
| limit_before | No | In unread_only mode: read context posts before the first unread (max 200) | |
| collapsed_threads | No | Set True only if the user has CRT (Collapsed Reply Threads) enabled. Team default is CRT off — leave False unless you know otherwise. Requires unread_only=True or since=<ms>; the default /posts endpoint rejects CRT-aware queries. |
Output Schema
| Name | Required | Description |
|---|---|---|
| order | Yes | Post IDs in display order |
| posts | Yes | Map of post ID to Post object |
| truncated | No | True when the response hit a Mattermost response cap — more posts exist beyond this batch |
| next_post_id | No | Next post ID for pagination |
| prev_post_id | No | Previous post ID for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint and idempotentHint. The description adds extensive behavioral details: quirk about never-viewed channel, server cap at 1000 for since, truncated flag, system posts behavior, and that posts may contain more entries than order. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for modes, but slightly long. Every sentence provides value, so it earns its length. Minor reduction for not being more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, 3 modes, quirks), the description is thorough. Output schema exists, so return values need not be explained. Covers all necessary context for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning by explaining parameter interactions (mutual exclusivity of unread_only and since with pagination) and specific guidance for collapsed_threads. This goes beyond schema commentary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves messages from a channel and lists three mutually exclusive modes. It differentiates from sibling tools like search_messages and get_thread by specifying their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use each mode (default for recent history, unread_only for missed posts, since for syncing), and warns about CRT usage. Also directs to search_messages for keyword search and get_thread for full threads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_infoARead-onlyIdempotent
Get metadata about an uploaded file.
Returns file name, size, type, and upload information. Use to check file details before downloading or sharing.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | 26-character file identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique file identifier |
| name | Yes | File name |
| size | Yes | File size in bytes |
| width | No | Image width in pixels |
| height | No | Image height in pixels |
| post_id | No | Associated post ID |
| user_id | Yes | Uploader user identifier (CreatorId in Go) |
| create_at | Yes | Upload timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp |
| extension | Yes | File extension without dot |
| mime_type | Yes | MIME type |
| update_at | Yes | Last update timestamp |
| channel_id | Yes | Channel where file was uploaded |
| has_preview_image | No | Has generated preview |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds minimal behavioral context beyond listing returned fields. No additional traits like auth requirements or performance implications are noted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states purpose, second summarizes return values and use case. Every word is informative, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description doesn't need to detail return structure. It lists key fields, covers the single parameter, and provides usage context. Complete for a simple read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed description including format example. The description does not add new parameter semantics beyond what the schema provides, so baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets metadata about an uploaded file and lists specific return fields (name, size, type, upload information). This distinguishes it from siblings like get_file_link and upload_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description provides explicit use case: 'Use to check file details before downloading or sharing.' It implicitly suggests when not to use (e.g., for downloading, use get_file_link), but doesn't state exclusions explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_linkARead-onlyIdempotent
Get a public link to download a file.
Link can be shared with users who don't have Mattermost access. Link may expire based on server settings.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | 26-character file identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| link | Yes | Public download URL |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and idempotent. Description adds disclosure about external sharing and expiration, which is helpful beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with main action. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple retrieval tool with one parameter and output schema, the description covers purpose, sharing capability, and expiry caveat. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the single parameter with a detailed description (100% coverage). Description adds no further parameter info, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get a public link to download a file' with specific verb and resource. Distinct from siblings like get_file_info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides context that link can be shared externally and may expire. Does not explicitly list alternatives but generally clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meARead-onlyIdempotent
Get the current authenticated user's profile.
Returns user information including username, email, and status. Use to get your own user ID for operations like create_direct_channel.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique user identifier |
| Yes | Email address | |
| roles | Yes | Space-separated system roles |
| locale | Yes | User locale preference |
| nickname | Yes | Nickname |
| username | Yes | Unique username |
| create_at | No | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if active) |
| last_name | Yes | Last name |
| update_at | No | Last update timestamp in milliseconds |
| first_name | Yes | First name |
| mfa_active | No | Multi-factor auth enabled |
| auth_service | Yes | Authentication service |
| email_verified | No | Email verification status |
| last_picture_update | No | Last avatar update timestamp |
| last_password_update | No | Last password change timestamp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds value by specifying return fields (username, email, status). No contradictions; the description complements 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the core purpose. Every sentence adds value: purpose, return info, and a usage example. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter, read-only tool with rich annotations and explicit return info, the description is fully complete. It covers purpose, usage, and what to expect, leaving no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has zero parameters, so baseline 4 applies. The description adds no parameter details (not needed), but it does provide context on what the return data includes, which is useful beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get the current authenticated user's profile' with specific verb and resource. It distinguishes from siblings like get_user and get_user_by_username by focusing on the authenticated user, and explicitly mentions using it to get your own user ID for operations like create_direct_channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'Use to get your own user ID for operations like create_direct_channel.' While it doesn't explicitly state when not to use it or name alternatives, the context implies for current user only, which is sufficient for this simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reactionsARead-onlyIdempotent
Get all reactions on a message.
Returns list of reactions with emoji names and user IDs. Use to see who reacted to a message and with what emoji.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint; the description adds that it returns a list with emoji names and user IDs, which is useful but not extensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and resource, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with one required parameter, annotations, and an output schema, the description covers purpose, usage, and return format adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description of post_id is thorough (including example), and the tool description adds no extra parameter-specific information, so baseline 3 is appropriate with 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get all reactions on a message' with a specific verb and resource, and distinguishes from sibling tools like add_reaction and remove_reaction by indicating it retrieves reactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says 'Use to see who reacted to a message and with what emoji,' providing clear context for when to invoke the tool, but does not mention exclusions or alternatives like get_channel_messages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamARead-onlyIdempotent
Get team details by ID.
Returns team name, description, and settings. Use when you have the team ID and need detailed information.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique team identifier |
| name | Yes | URL-friendly team name |
| type | Yes | Team type: O=open, I=invite-only |
| Yes | Team contact email | |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if active) |
| invite_id | Yes | Invite link identifier |
| update_at | Yes | Last update timestamp in milliseconds |
| description | Yes | Team description |
| display_name | Yes | Human-readable team name |
| allowed_domains | Yes | Allowed email domains |
| allow_open_invite | Yes | Allow public joining |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. Description adds return value details (name, description, settings) but no additional behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy, efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage, and return fields. With output schema present, return is adequate. Missing error handling or prerequisites, but low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description adds no extra meaning beyond 'by ID'. Baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Get team details by ID' and lists return fields. Distinguishes from siblings like list_teams and get_team_members.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you have the team ID and need detailed information.' Implies not to use without ID, but does not explicitly name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_team_membersARead-onlyIdempotent
Get members of a team.
Returns list of users who belong to the team. Use to discover users before sending direct messages or mentions.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-indexed) | |
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| per_page | No | Results per page |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is clear. The description adds that it returns a list of users, but does not disclose pagination behavior (parameters exist) or any potential limitations (e.g., team membership visibility). With annotations present, the bar is lower, but the description misses the nuance of paginated results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with clear purpose: purpose, output, and use case. No wasted words, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (so return values need not be detailed), the description sufficiently covers purpose and usage. However, it omits mention of pagination behavior, which is relevant given the cursor parameters. Still, for a simple read operation, it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage, including details like team_id format and pagination parameters. The description adds no additional parameter semantics beyond what the schema already provides, so baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('get') and resource ('team members'). Description explicitly states it returns a list of users belonging to a team and provides a concrete use case ('discover users before sending direct messages or mentions'), distinguishing it from sibling member-list tools like get_channel_members.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description includes a use case ('discover users before sending direct messages or mentions'), which guides when to use. However, it does not explicitly mention when not to use or contrast with alternatives, though the context from sibling names provides some implicit differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadARead-onlyIdempotent
Get all messages in a thread.
Returns the root post and all replies in chronological order. Use to read full conversation context before replying.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| order | Yes | Post IDs in display order |
| posts | Yes | Map of post ID to Post object |
| truncated | No | True when the response hit a Mattermost response cap — more posts exist beyond this batch |
| next_post_id | No | Next post ID for pagination |
| prev_post_id | No | Previous post ID for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds specificity about returning messages in chronological order, which is 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each with clear purpose. No fluff, front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single parameter, comprehensive annotations, and presence of an output schema, the description sufficiently covers behavioral and usage aspects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with clear parameter info. The description does not add additional parameter details beyond the schema, so baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it gets all messages in a thread, distinguishing it from sibling tools like get_channel_messages. It specifically mentions returning root post and replies, and advises when to use it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using it to read full conversation context before replying, providing a clear usage scenario. Does not mention when not to use or alternatives, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_userARead-onlyIdempotent
Get a user's profile by their ID.
Returns user information including username, email, and status. Use when you have the user ID. For lookup by @username, use get_user_by_username instead.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | 26-character user identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique user identifier |
| Yes | Email address | |
| roles | Yes | Space-separated system roles |
| locale | Yes | User locale preference |
| nickname | Yes | Nickname |
| username | Yes | Unique username |
| create_at | No | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if active) |
| last_name | Yes | Last name |
| update_at | No | Last update timestamp in milliseconds |
| first_name | Yes | First name |
| mfa_active | No | Multi-factor auth enabled |
| auth_service | Yes | Authentication service |
| email_verified | No | Email verification status |
| last_picture_update | No | Last avatar update timestamp |
| last_password_update | No | Last password change timestamp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint. The description adds return fields (username, email, status) but no new behavioral traits beyond what annotations indicate. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-loaded with main purpose, no filler, each sentence adds essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single parameter, comprehensive annotations, and output schema, the description fully covers what an agent needs: action, input, output, and usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter description. The description only mentions 'by their ID' which adds minimal semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Get' and resource 'user's profile' with method 'by their ID'. It clearly distinguishes from sibling 'get_user_by_username' by specifying ID-based lookup vs username.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use when you have the user ID' and provides the alternative 'For lookup by @username, use get_user_by_username instead.' This gives clear context for when to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_by_usernameARead-onlyIdempotent
Get a user's profile by their username.
Returns user information including username, email, and status. Use when you know the @username but not the user ID. For lookup by ID, use get_user instead.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | Mattermost username |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique user identifier |
| Yes | Email address | |
| roles | Yes | Space-separated system roles |
| locale | Yes | User locale preference |
| nickname | Yes | Nickname |
| username | Yes | Unique username |
| create_at | No | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if active) |
| last_name | Yes | Last name |
| update_at | No | Last update timestamp in milliseconds |
| first_name | Yes | First name |
| mfa_active | No | Multi-factor auth enabled |
| auth_service | Yes | Authentication service |
| email_verified | No | Email verification status |
| last_picture_update | No | Last avatar update timestamp |
| last_password_update | No | Last password change timestamp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so description adds value by stating what is returned ('username, email, and status'). No contradiction, but additional behavioral detail is minimal beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a distinct purpose: purpose, output, usage guidance. Zero wasted words, efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple tool with one parameter and an output schema (implied by context). Description covers input, output, and alternative tool. Complete for its complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed parameter description ('Mattermost username', pattern, length). Description adds the '@username' context but doesn't significantly extend meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'Get a user's profile by their username' with specific verb+resource. Differentiates from get_user (by ID) and search_users, so purpose is clear and distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use: 'Use when you know the @username but not the user ID' and provides alternative 'For lookup by ID, use get_user instead'. Provides clear context and exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_statusARead-onlyIdempotent
Get a user's online/offline status.
Returns: online, away, dnd (do not disturb), or offline. Use to check if a user is available before sending a message.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | Yes | 26-character user identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| manual | Yes | Manually set status |
| status | Yes | Status: online, away, dnd, offline |
| user_id | Yes | User identifier |
| last_activity_at | Yes | Last activity timestamp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds the specific status values returned, providing useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no wasted words. The purpose is front-loaded, followed by return values and usage hint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with good annotations and output schema, the description is complete. It covers purpose, output values, and usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a detailed parameter description. The tool description does not add extra meaning beyond the schema, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get a user's online/offline status.' It lists the possible return values (online, away, dnd, offline) and distinguishes from sibling tools like get_user which focus on profile info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a direct usage note: 'Use to check if a user is available before sending a message.' This provides clear context, though it lacks explicit when-not or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
join_channelAIdempotent
Join a public channel.
Adds the authenticated user to the channel. Cannot be used to join private channels. Joining a channel you're already in has no additional effect.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| roles | Yes | Space-separated role names |
| user_id | Yes | User identifier |
| msg_count | Yes | Messages seen count, including replies in threads |
| channel_id | Yes | Channel identifier |
| mention_count | Yes | Unread @-mentions count, including thread replies |
| last_update_at | Yes | Last update timestamp |
| last_viewed_at | Yes | Last viewed timestamp |
| msg_count_root | Yes | Root messages seen count, excluding thread replies |
| mention_count_root | Yes | Unread root @-mentions count, excluding thread replies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotent, not destructive), description adds that joining a channel you're already in has no effect, which aligns with idempotency. Also clarifies public-only restriction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-load the core action and provide essential constraints. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple action and presence of output schema, the description covers purpose, scope (public), and behavioral effects (idempotent). Complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with a descriptive example. Description adds no extra meaning beyond what the schema provides, so baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool joins a public channel and adds the authenticated user. Distinguishes from private channels and notes idempotent behavior. Differentiates from sibling tools like leave_channel and add_user_to_channel.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly suggests use for public channels only and notes no effect if already a member. Does not explicitly compare with alternatives like add_user_to_channel for adding others.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leave_channelAIdempotent
Leave a channel.
Removes the authenticated user from the channel. Cannot leave Town Square or other default channels. Can rejoin public channels later with join_channel.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the user is removed, and adds context about default channels and rejoin capability. Annotations indicate idempotent and non-destructive, but description does not contradict. Could clarify behavior if user is not a member.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with action, no wasted words. Efficient and clear.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers action, constraints, and post-action behavior (rejoin). Annotations provide additional safety info.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of channel_id. Description adds no further parameter details, so baseline score is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (leave) and resource (channel). It distinguishes itself from siblings like join_channel and add_user_to_channel by specifying constraints like cannot leave default channels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use (leave a channel) and when-not-to (cannot leave Town Square or other default channels). Mentions alternative join_channel for rejoining.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bookmarksARead-onlyIdempotent
List all bookmarks in a channel.
Returns bookmarks in sort order. Use to see saved links and files pinned to a channel. For searching messages, use search_messages instead.
Note: Requires Entry, Professional, Enterprise, or Enterprise Advanced edition (not available in Team Edition). Minimum version: v10.1.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| bookmarks_since | No | Timestamp to filter bookmarks updated since |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds valuable behavioral context: 'Returns bookmarks in sort order' and edition/version constraints, without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise, purposeful sentences. No filler, each sentence adds distinct value: purpose, sort order, usage guidance, and prerequisite notes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple listing tool with output schema present and annotations covering safety. Description fully captures all necessary context: what it does, how it behaves, when to use, and requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with detailed parameter descriptions. Description adds 'sort order' context not in schema, but baseline is 3 due to complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States 'List all bookmarks in a channel' with a clear verb and resource. Immediately distinguishes from the sibling 'search_messages', making its unique purpose obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('to see saved links and files pinned to a channel') and when not to ('For searching messages, use search_messages instead'). Also includes edition and version requirements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_channelsARead-onlyIdempotent
List channels you are a member of in a team.
Returns your channels with unread counters and the read marker for the authenticated user. Two counter pairs are provided:
unread_msg_count/mention_countcount thread replies too (the channel badge with Collapsed Reply Threads off — the team default).unread_msg_count_root/mention_count_rootcount only root posts (the badge with Collapsed Reply Threads on).
last_viewed_at is the user's read marker for the channel. Pass it as
get_channel_messages(channel_id, since=last_viewed_at) for incremental sync, or
use get_channel_messages(channel_id, unread_only=True) for the unread window
(preferred — deterministic and edit-noise-free).
Channels without a membership record report 0 for all counters and last_viewed_at.
Use channel_types to narrow results: ["O", "P"] for workspace channels without DMs, or ["D"] for direct messages only. Use only_unread=True to get only channels with unread messages. For discovering public channels you haven't joined yet, use list_public_channels.
| Name | Required | Description | Default |
|---|---|---|---|
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| only_unread | No | Return only channels with unread messages | |
| channel_types | No | Channel types to include: O=public, P=private, D=direct message, G=group message. Omit to return all types. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds meaningful behavioral context: explains the two counter pairs (with and without thread replies), the semantics of last_viewed_at, and that channels without membership return zeros. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
First sentence immediately states purpose. The description is well-structured with bullet-like formatting for counter pairs. Each sentence provides distinct information, but could be slightly tightened (e.g., merging counter explanations). Still, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple counters, read marker, filtering options), the description covers all usage aspects, edge cases, and relations to other tools. Output schema exists, so return value explanation is not needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. Description adds value by explaining the meaning of counters and how last_viewed_at is used in subsequent calls. It also gives practical values for channel_types. This enriches parameter understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List channels you are a member of in a team,' specifying both the resource (channels) and the scope (your memberships). It distinguishes from sibling 'list_public_channels' by saying 'For discovering public channels you haven't joined yet, use list_public_channels.' Verb and resource are precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use channel_types to narrow results (with examples), use only_unread=True for unread channels, and explicitly names alternative list_public_channels for channels not joined. This covers when and when not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_public_channelsARead-onlyIdempotent
List public channels available in a team.
Returns all public channels for discovery, including ones you haven't joined. Results are paginated. Use page/per_page to retrieve all channels. Useful for finding channels to join. For channels you are already a member of (including private), use list_my_channels.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-indexed) | |
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| per_page | No | Results per page |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. Description adds pagination behavior and scope (including unjoined channels), which are useful beyond annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no wasted words, front-loaded with the main purpose. Efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values are handled. Description covers the essential: what is returned, pagination, and scope. Could mention that team_id is required, but that's already in schema. Still complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description mentions page and per_page in context of pagination, but does not add details beyond schema (e.g., defaults, bounds). Minimal added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it lists public channels for discovery, including unjoined ones. Distinguishes from sibling list_my_channels which returns channels the user is a member of. Verb+resource is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: for finding channels to join. Provides exclusion: use list_my_channels for channels you are already a member of. Could mention more alternatives but sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_teamsARead-onlyIdempotent
List teams the current user belongs to.
Returns team name, description, and settings. Use this to discover available teams before listing channels.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description adds value by specifying return fields (team name, description, settings). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences that front-load the action and provide essential detail. No redundancy or wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, presence of output schema, and annotations that cover safety, the description sufficiently explains the tool's purpose and usage. Minor omission: no mention of pagination or performance, but acceptable for a simple list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so the description cannot add anything beyond the schema. Baseline score of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'list' and resource 'teams' with a clear scope 'current user belongs to'. It distinguishes from siblings like 'get_team' and channel-listing tools by providing a use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use this to discover available teams before listing channels.' While no explicit exclusions are given, the context signals differentiate it from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_channel_viewedA
Mark a channel as read for the authenticated user.
Clears unread counters and advances last_viewed_at. Use when the user
asks to clear unreads, when a bot has processed
get_channel_messages(unread_only=True) and needs to advance read state
for the next poll, or as a one-shot bootstrap on a channel with
last_viewed_at == 0 so unread_only queries return posts.
Do NOT call on accounts shared with humans — it clears their UI badge.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavioral effects: 'Clears unread counters and advances last_viewed_at'. Warns about clearing UI badges for shared accounts. No annotations contradicted; destructiveHint=false is consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with dense but clear sentences. It is well-structured and front-loaded with the primary purpose, but slightly longer than necessary due to detailed usage examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, usage guidance, behavioral effects, and an anti-pattern. It is fully sufficient for correct agent invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of the channel_id format. The tool description adds no additional parameter semantics beyond what the schema already provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Mark a channel as read' and the resource 'channel for authenticated user'. It distinguishes this tool from siblings like leave_channel or create_channel by focusing on read state management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides three specific use cases (user asks to clear unreads, bot processing unread messages, bootstrap with last_viewed_at==0) and an explicit anti-pattern ('Do NOT call on accounts shared with humans').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_messageAIdempotent
Pin a message in a channel.
Pinned messages appear in the channel's pinned posts section. Pinning an already pinned message has no additional effect.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique post identifier |
| type | Yes | Post type (empty for regular posts) |
| edit_at | Yes | Last edit timestamp |
| message | Yes | Post content (supports Markdown) |
| root_id | Yes | Root post ID if in thread |
| user_id | Yes | Author user identifier |
| file_ids | Yes | Attached file IDs |
| hashtags | Yes | Space-separated hashtags |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| is_pinned | Yes | Whether post is pinned |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel where posted |
| original_id | Yes | Original post ID if edited |
| pending_post_id | Yes | Client-side pending ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint and destructiveHint; the description adds explicit confirmation that pinning an already pinned message has no effect, and explains where pinned messages appear (channel's pinned posts section).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: one sentence for the main action followed by two short clarifying sentences. It is front-loaded and contains no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and annotations, the description covers the main behavior and idempotency. It lacks mention of permissions or prerequisites, but given the output schema exists, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a clear description of the 'post_id' parameter. The tool description does not add further parameter semantics, but baseline is 3 because schema already handles it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Pin a message in a channel' with the specific verb 'pin' and resource 'message' in a channel. It adds context about pinned posts section but does not explicitly distinguish from the sibling tool 'unpin_message'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide guidance on when to use this tool vs alternatives like 'unpin_message' or other channel operations. It only states the action and idempotency, but no when-to-use or when-not-to-use advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_messageA
Post a message to a Mattermost channel.
Send text messages with Markdown support. Use root_id to reply in a thread. Use file_ids to attach uploaded files. Use attachments for rich formatted content. To read all messages in a thread, use get_thread.
Attachment examples:
Status alert: {"color": "danger", "title": "Build Failed", "text": "Tests failed on main"}
Success notification: {"color": "good", "title": "Deployed", "text": "v1.2.3 is live"}
With fields: {"title": "Ticket", "fields": [{"title": "Status", "value": "Open", "short": true}]}
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message content (supports Markdown) | |
| root_id | No | Root post ID for threading | |
| file_ids | No | File IDs to attach (from upload_file) | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| attachments | No | Rich message attachments with colors, fields, images |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique post identifier |
| type | Yes | Post type (empty for regular posts) |
| edit_at | Yes | Last edit timestamp |
| message | Yes | Post content (supports Markdown) |
| root_id | Yes | Root post ID if in thread |
| user_id | Yes | Author user identifier |
| file_ids | Yes | Attached file IDs |
| hashtags | Yes | Space-separated hashtags |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| is_pinned | Yes | Whether post is pinned |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel where posted |
| original_id | Yes | Original post ID if edited |
| pending_post_id | Yes | Client-side pending ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description only states 'Post a message' which implies mutation. Annotations provide destructiveHint=false but no readOnlyHint. Does not disclose rate limits, authentication needs, side effects, or behavior on error. Minimal addition beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: 4 sentences plus examples. Front-loaded with main purpose. Every sentence earns its place. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main use cases (post, reply, attach files, rich content) and points to get_thread for reading. Output schema exists, so return values need not be explained. Could mention channel membership requirement, but overall adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds value by explaining the purpose of each parameter (e.g., 'Use root_id to reply in a thread') and provides concrete examples for attachments, enhancing understanding beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Post' and resource 'message to a Mattermost channel'. Distinguishes from sibling tool 'get_thread' by directing users to use that for reading messages in a thread. Provides specific use cases like replying in threads and attaching files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use get_thread instead (for reading). Gives guidance on using root_id for threading, file_ids for attachments, and attachments for rich content. Lacks explicit prerequisites like channel membership or permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_reactionAIdempotent
Remove your emoji reaction from a message.
Removes a reaction previously added by the authenticated user. Removing a non-existent reaction has no effect.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| emoji_name | Yes | Emoji name without colons (e.g., 'thumbsup', 'smile') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint and destructiveHint. The description adds 'Removing a non-existent reaction has no effect', reinforcing idempotency and safety. No contradiction, and additional context is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with core action. Every sentence provides essential information without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool (2 parameters, no output schema, annotations covering idempotency/destructive), the description is complete. It covers purpose, scope, and edge cases (non-existent reaction) adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions and examples for both parameters. The description adds no extra parameter information, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Remove your emoji reaction from a message' with a specific verb and resource, and clarifies it only affects own reactions. It implicitly distinguishes from add_reaction and get_reactions siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use versus alternatives like add_reaction. The verb 'remove' implies purpose, but an agent may benefit from a note that this only removes own reactions and not others'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesARead-onlyIdempotent
Search for messages matching specific criteria across channels.
Searches message content within a team. For simply reading recent channel messages, use get_channel_messages instead.
Search syntax examples:
Simple text: "deployment error"
From user: "from:username bug"
In channel: "in:channel-name release"
Date range: "after:2024-01-01 before:2024-02-01"
Combined: "from:alice in:dev-ops deployment failed"
| Name | Required | Description | Default |
|---|---|---|---|
| terms | Yes | Search terms (Mattermost syntax) | |
| team_id | Yes | 26-character team identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| is_or_search | No | Use OR instead of AND for multiple terms |
Output Schema
| Name | Required | Description |
|---|---|---|
| order | Yes | Post IDs in display order |
| posts | Yes | Map of post ID to Post object |
| truncated | No | True when the response hit a Mattermost response cap — more posts exist beyond this batch |
| next_post_id | No | Next post ID for pagination |
| prev_post_id | No | Previous post ID for pagination |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint. The description adds behavioral context like search syntax and cross-channel capability, which complements the annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: purpose, clarifier, then bullet examples. Every sentence adds value with zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With output schema present, return values are covered. Description explains purpose, usage, parameter syntax, and alternative tool, making it fully informative given the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). The description adds useful search syntax examples that clarify the 'terms' parameter usage, providing value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Search for messages matching specific criteria across channels.' and distinguishes from 'get_channel_messages' by mentioning when to use that alternative instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides a comparative alternative and search syntax examples, giving clear context on when to use the tool, though it doesn't explicitly state exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_usersARead-onlyIdempotent
Search for users by name or username.
Searches across username, first name, last name, and nickname. Use to find users when you don't know their exact username or ID.
| Name | Required | Description | Default |
|---|---|---|---|
| term | Yes | Search term | |
| team_id | No | Limit search to a specific team |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and description adds that it searches across username, first name, last name, and nickname. No contradictions; fully transparent about behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the main purpose. No wasted words. Perfectly sized for quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with 2 parameters, high schema coverage, and annotations, the description covers purpose, usage, and search scope. Output schema exists, so return details are likely documented elsewhere. Minor gap: doesn't mention result pagination, but output schema may cover it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but description adds meaning by explaining that the search term applies to multiple fields (username, first name, etc.), which is not evident from the schema's 'Search term' description. Adds value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Search for users by name or username' and specifies it searches across multiple fields. Distinguishes from sibling tools like get_user (by ID) and get_user_by_username (exact username) by focusing on partial matches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use to find users when you don't know their exact username or ID,' providing clear context for when to use this tool over exact lookups. Could be improved by naming alternatives, but context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unpin_messageAIdempotent
Unpin a message from a channel.
Removes the message from the channel's pinned posts. Unpinning a non-pinned message has no effect.
| Name | Required | Description | Default |
|---|---|---|---|
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique post identifier |
| type | Yes | Post type (empty for regular posts) |
| edit_at | Yes | Last edit timestamp |
| message | Yes | Post content (supports Markdown) |
| root_id | Yes | Root post ID if in thread |
| user_id | Yes | Author user identifier |
| file_ids | Yes | Attached file IDs |
| hashtags | Yes | Space-separated hashtags |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| is_pinned | Yes | Whether post is pinned |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel where posted |
| original_id | Yes | Original post ID if edited |
| pending_post_id | Yes | Client-side pending ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate idempotent and non-destructive behavior. The description adds the important detail that unpinning a non-pinned message has no effect, which reinforces idempotency and clarifies the tool's safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, the first being the main action. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool, the description covers the action, effect, edge case, and implicit requirements. The output schema exists, so return values need not be explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already provides a detailed description of the post_id parameter. The description does not add any additional parameter semantics beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Unpin a message from a channel') with a specific verb and resource, and the tool's purpose is distinct from sibling tools like pin_message and delete_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not provide explicit guidance on when to use it versus alternatives (e.g., pin_message). The context of unpinning is understood but not compared directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bookmarkAIdempotent
Update a channel bookmark.
Partially updates bookmark properties. Only provided fields are updated; others remain unchanged.
Note: Requires Entry, Professional, Enterprise, or Enterprise Advanced edition (not available in Team Edition). Minimum version: v10.1.
| Name | Required | Description | Default |
|---|---|---|---|
| emoji | No | New emoji icon | |
| link_url | No | New URL | |
| image_url | No | New preview image URL | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| bookmark_id | Yes | 26-character bookmark identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| display_name | No | New display name |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique bookmark identifier |
| type | Yes | Bookmark type: 'link' or 'file' |
| emoji | No | Emoji icon |
| file_id | Yes | File ID for file bookmarks (empty for links) |
| link_url | No | URL for link bookmarks |
| owner_id | Yes | User ID who created the bookmark |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| file_info | No | File metadata for file bookmarks |
| image_url | No | Preview image URL |
| parent_id | No | Parent bookmark ID |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel this bookmark belongs to |
| sort_order | Yes | Position in bookmark list |
| original_id | No | Original bookmark ID if copied |
| display_name | Yes | Bookmark display name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint and destructiveHint. Description adds partial update semantics, complementing annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences, front-loaded with action. Edition note is useful but slightly disrupts flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers partial update, edition, and version; output schema handles return values. No missing critical context for a simple update.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage with descriptions; description adds no parameter-level detail, meeting baseline but not exceeding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Update a channel bookmark' and 'Partially updates bookmark properties', distinguishing it from create_bookmark and delete_bookmark siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides edition and version constraints, implying only one tool for partial updates. Could explicitly mention when not to use, but sibling names clarify alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bookmark_sort_orderAIdempotent
Reorder a channel bookmark.
Moves the bookmark to the specified position. Other bookmarks are automatically adjusted. Returns all affected bookmarks with updated positions.
Note: Requires Entry, Professional, Enterprise, or Enterprise Advanced edition (not available in Team Edition). Minimum version: v10.1.
| Name | Required | Description | Default |
|---|---|---|---|
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| bookmark_id | Yes | 26-character bookmark identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| new_sort_order | Yes | New position in bookmark list |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (idempotentHint: true, destructiveHint: false) are consistent. The description adds that other bookmarks are automatically adjusted and returns all affected bookmarks with updated positions, providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (5 lines), front-loaded with the primary action, and each sentence adds meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (3 parameters, no nested objects, output schema present), the description covers behavior, side effects, edition restrictions, and version requirements, making it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description adds the concept of moving to a specified position and auto-adjustment, which enhances understanding beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Reorder a channel bookmark') and the specific resource (channel bookmark). It distinguishes from sibling tools like update_bookmark by focusing on sort order manipulation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description specifies edition requirements (not Team Edition) and minimum version (v10.1). It implies usage for reordering bookmarks but does not explicitly mention when not to use or alternatives, though context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_messageA
Edit an existing message.
Can only edit your own messages (unless admin). The message will show as edited. Original content is replaced; edit history is not preserved.
Attachment examples:
Status alert: {"color": "danger", "title": "Build Failed", "text": "Tests failed on main"}
With fields: {"title": "Ticket", "fields": [{"title": "Status", "value": "Open", "short": true}]}
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | New message content | |
| post_id | Yes | 26-character post/message identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') | |
| attachments | No | Rich message attachments with colors, fields, images |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Unique post identifier |
| type | Yes | Post type (empty for regular posts) |
| edit_at | Yes | Last edit timestamp |
| message | Yes | Post content (supports Markdown) |
| root_id | Yes | Root post ID if in thread |
| user_id | Yes | Author user identifier |
| file_ids | Yes | Attached file IDs |
| hashtags | Yes | Space-separated hashtags |
| create_at | Yes | Creation timestamp in milliseconds |
| delete_at | Yes | Deletion timestamp (0 if not deleted) |
| is_pinned | Yes | Whether post is pinned |
| update_at | Yes | Last update timestamp in milliseconds |
| channel_id | Yes | Channel where posted |
| original_id | Yes | Original post ID if edited |
| pending_post_id | Yes | Client-side pending ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=false annotation, it explains that the message will show as edited, original content is replaced, and edit history is not preserved. This adds behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise: one line for purpose, then bullet points for behavioral details and attachment examples. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all relevant aspects: editing, permissions, edit behavior, and rich attachment examples. The tool is simple and description is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. The description includes attachment examples, which add significant meaning beyond the schema for that parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Edit an existing message', which is a clear verb+resource. It distinguishes from siblings like delete_message and post_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states 'Can only edit your own messages (unless admin)', providing clear context on when to use. It implies not to use if not own message and not admin. No explicit alternatives, but the condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileA
Upload a file to a channel.
The file will be attached to messages in the specified channel. Returns file ID that can be used when posting messages with file_ids parameter.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | No | Override filename | |
| file_path | Yes | Local path to the file to upload | |
| channel_id | Yes | 26-character channel identifier (e.g., 'o5w8h47pdfbzjc4d8w7dhnhren') |
Output Schema
| Name | Required | Description |
|---|---|---|
| client_ids | No | Client-provided IDs |
| file_infos | Yes | Uploaded file information |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include destructiveHint: false, indicating no destructive behavior. The description adds context about the file being attached to messages and returning a file ID for later use. It does not contradict annotations and provides meaningful behavioral insight beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences, front-loading the action 'Upload a file to a channel'. Every sentence provides essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main action, return value, and relationship to messages. Given the simple nature of the tool and that an output schema exists, it is fairly complete. Minor omissions like file size limits or accepted types are not critical for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 does not add additional meaning beyond stating the file will be attached to messages, which is implicit from the tool's purpose. Thus, the description adds marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool uploads a file to a channel and attaches it to messages. It distinguishes from sibling tools like get_file_info which only retrieve file details, and no other upload tool exists, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that the file will be attached to messages in the specified channel, giving clear context for when to use this tool. However, it does not explicitly mention when not to use it or provide alternatives, such as using existing file IDs from other tools.
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.
38 tool updates
v0.5.1- First observed
add_reaction - First observed
add_user_to_channel - First observed
create_bookmark - First observed
create_channel - First observed
create_direct_channel - First observed
delete_bookmark - First observed
delete_message - First observed
get_channel - First observed
get_channel_by_name - First observed
get_channel_members - First observed
get_channel_messages - First observed
get_file_info - First observed
get_file_link - First observed
get_me - First observed
get_reactions - First observed
get_team - First observed
get_team_members - First observed
get_thread - First observed
get_user - First observed
get_user_by_username - First observed
get_user_status - First observed
join_channel - First observed
leave_channel - First observed
list_bookmarks - First observed
list_my_channels - First observed
list_public_channels - First observed
list_teams - First observed
mark_channel_viewed - First observed
pin_message - First observed
post_message - First observed
remove_reaction - First observed
search_messages - First observed
search_users - First observed
unpin_message - First observed
update_bookmark - First observed
update_bookmark_sort_order - First observed
update_message - First observed
upload_file
TDQS
Each tool targets a distinct action and resource, such as channel operations (create, join, leave, list, etc.), bookmark CRUD, message functions, reactions, threads, files, users, and teams. No two tools have overlapping purposes that would cause confusion for an agent.
All tool names follow a consistent verb_noun pattern in snake_case, e.g., create_channel, get_channel_members, post_message. The naming is predictable and uniform, with only one longer name (update_bookmark_sort_order) that still adheres to the style.
With 38 tools, the server covers a wide range of Mattermost functionality, but this exceeds the typical 3-15 range for a well-scoped set. While each tool serves a purpose, the count feels heavy and could be streamlined (e.g., merging some getters).
The tool surface covers core operations for channels, messages, reactions, threads, files, users, and teams. Minor gaps exist, such as the lack of channel deletion or archiving, but the essential workflows for an agent are well-supported.
Maintenance
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
Carbon Voice MCP serves as a bridge that connects AI assistants like ChatGPT, Claude, and Cursor to a user's Carbon Voice account, turning voice messages and conversations into a private, on-demand knowledge base. It provides 28 specialized tools for comprehensive voice messaging management, including creating and sending messages, accessing conversation history with instant transcription, running AI actions (summarization, TLDR generation, meeting notes), and managing workspace collaboration through folders, contacts, and team communications.
Run your website's AI support agent from Claude, Cursor or any MCP client. Manage the knowledge base, edit agent instructions, read conversations and leads, reply live to visitors, and check plan usage. 54 tools, OAuth sign-in, no API key. Free with every Asyntai account: https://asyntai.com/documentation/mcp/
One place to build, share, and govern the skills and tools your AI agents use at work.
Control your Discord community: send/read messages, manage channels and forums, and handle webhook…
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables Claude to interact with Mattermost through search functionality, user management, channel operations, and team information retrieval. Supports message search by keywords/users/dates, thread viewing, and displays all timestamps in Korean Standard Time (KST).9-
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Slack workspaces through comprehensive channel management, messaging, direct messages, search functionality, and user management capabilities.30112MIT
- FlicenseNot gradedqualityDmaintenanceThis server enables interaction with Mattermost workspaces to manage channels, messages, threads, and user profiles via the Mattermost REST API. It provides a comprehensive suite of tools for reading channel history, posting messages, and managing reactions within a trusted environment.-
- FlicenseNot gradedqualityCmaintenanceEnables interaction with Mattermost workspaces to manage channels, messages, threads, reactions, and user profiles via the REST API. This server allows AI models to perform both read and write operations, such as posting messages and retrieving channel history, within a trusted environment.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/cloud-ru-tech/mcp-server-mattermost'
If you have feedback or need assistance with the MCP directory API, please join our Discord server