mcp-server-mattermost
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MCP_HOST | No | HTTP bind host | 127.0.0.1 |
| MCP_PORT | No | HTTP port | 8000 |
| MCP_TRANSPORT | No | Transport: stdio or http | stdio |
| MATTERMOST_URL | Yes | Mattermost server URL | |
| MATTERMOST_TOKEN | Yes | Bot or personal token. Required for static_token auth mode (default). | |
| MATTERMOST_TIMEOUT | No | Request timeout in seconds | 30 |
| MATTERMOST_AUTH_MODE | No | Auth mode: static_token, client_token, or oauth_proxy | static_token |
| MATTERMOST_LOG_LEVEL | No | Logging level | INFO |
| MATTERMOST_LOG_FORMAT | No | Log output format: json or text | json |
| MATTERMOST_VERIFY_SSL | No | Verify SSL certificates | true |
| MATTERMOST_API_VERSION | No | Mattermost API version | v4 |
| MATTERMOST_MAX_RETRIES | No | Max retry attempts | 3 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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. |
| 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. |
| list_bookmarksA | 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. |
| update_bookmarkA | 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. |
| update_bookmark_sort_orderA | 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. |
| add_user_to_channelA | 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. |
| 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. |
| create_direct_channelA | 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. |
| get_channelA | 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. |
| get_channel_by_nameA | 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. |
| get_channel_membersA | 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. |
| join_channelA | 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. |
| leave_channelA | 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. |
| list_my_channelsA | 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:
Channels without a membership record report 0 for all counters and 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. |
| list_public_channelsA | 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. |
| mark_channel_viewedA | Mark a channel as read for the authenticated user. Clears unread counters and advances Do NOT call on accounts shared with humans — it clears their UI badge. |
| download_fileA | Download a file attachment and save it to a local directory. Counterpart of upload_file: fetches the content of a file by its ID (from a post's file_ids or get_file_info) and writes it to disk. Returns the local path so the file can be read or processed further. Use on_conflict="rename" to save all same-named attachments without replacing any. Always use the returned path; parallel calls may assign numbers in any order. Each repeated call in rename mode saves another copy. overwrite=True cannot be combined with on_conflict="error" or "rename". Files larger than 100 MB are refused. |
| get_file_infoA | Get metadata about an uploaded file. Returns file name, size, type, and upload information. Use to check file details before downloading or sharing. |
| get_file_linkA | 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. |
| 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. |
| 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. |
| get_channel_messagesA | 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:
Returns For keyword search use |
| 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:
|
| search_messagesA | 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:
|
| 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:
|
| add_reactionA | 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. |
| get_reactionsA | 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. |
| get_threadA | Get all messages in a thread. Returns the root post and all replies in chronological order. Use to read full conversation context before replying. |
| pin_messageA | 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. |
| remove_reactionA | Remove your emoji reaction from a message. Removes a reaction previously added by the authenticated user. Removing a non-existent reaction has no effect. |
| unpin_messageA | Unpin a message from a channel. Removes the message from the channel's pinned posts. Unpinning a non-pinned message has no effect. |
| get_teamA | Get team details by ID. Returns team name, description, and settings. Use when you have the team ID and need detailed information. |
| get_team_membersA | Get members of a team. Returns list of users who belong to the team. Use to discover users before sending direct messages or mentions. |
| list_teamsA | List teams the current user belongs to. Returns team name, description, and settings. Use this to discover available teams before listing channels. |
| get_meA | 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. |
| get_userA | 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. |
| get_user_by_usernameA | 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. |
| get_user_statusA | 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. |
| search_usersA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 39 tools
Every tool targets a distinct resource and action, and the descriptions actively cross-reference related tools to prevent confusion. Even similar lookup pairs like get_user/get_user_by_username and get_channel/get_channel_by_name are clearly separated by what identifier they accept.
Tool names mostly follow a clear verb_noun pattern with consistent prefixes like get_, create_, delete_, update_, and list_. Minor inconsistencies exist, such as mixing get_channel_messages with list_my_channels, and special names like get_me and update_bookmark_sort_order break the strict pattern.
At 39 tools, this exceeds the 25-tool threshold and feels heavy even for a broad Mattermost integration. Each tool is individually useful, but the count makes the surface harder for an agent to navigate effectively.
The set covers messaging, files, reactions, bookmarks, users, teams, and channels well, but there are notable lifecycle gaps: create_channel has no update/archive/delete counterpart, and add_user_to_channel has no remove_user_from_channel. These missing operations could cause dead ends in admin workflows.