stashcat-api-mcp
Click on "Deploy 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., "@stashcat-api-mcp send 'Hello team!' to channel #general"
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.
stashcat-api-mcp
MCP (Model Context Protocol) server for the Stashcat / schul.cloud messenger API.
Allows AI assistants (e.g. Claude Desktop) to interact with Stashcat: read and send messages, manage channels and conversations, browse files, and more.
Requirements
Node.js 20+
A Stashcat account
Related MCP server: Mattermost MCP Server
Installation
git clone https://github.com/dclausen01/stashcat-api-mcp.git
cd stashcat-api-mcp
npm install
npm run buildConfiguration
Copy .env.example to .env and fill in your credentials:
cp .env.example .envSTASHCAT_BASE_URL=https://api.stashcat.com/
STASHCAT_EMAIL=your-email@example.com
STASHCAT_PASSWORD=your-password
STASHCAT_APP_NAME=stashcat-mcp
STASHCAT_DEVICE_ID= # Optional; auto-generated if omitted
STASHCAT_SECURITY_PASSWORD= # Optional; defaults to STASHCAT_PASSWORD
# Enables automatic E2E message decryption
SESSION_FILE_PATH=./stashcat-session.jsonThe server logs in once, unlocks E2E encryption, and persists the session to SESSION_FILE_PATH. On subsequent starts it reuses the saved session and only re-authenticates when the session has expired. E2E decryption is re-unlocked automatically on each start.
Usage with Claude Desktop
Add the server to your claude_desktop_config.json:
{
"mcpServers": {
"stashcat": {
"command": "node",
"args": ["/absolute/path/to/stashcat-api-mcp/dist/index.js"],
"env": {
"STASHCAT_EMAIL": "your-email@example.com",
"STASHCAT_PASSWORD": "your-password",
"STASHCAT_BASE_URL": "https://api.stashcat.com/"
}
}
}
}Available Tools
Tool | Description |
| Profile of the authenticated user |
| Profile of a specific user |
| Companies the user belongs to |
| Details of a company |
| Members of a company |
| Get all members (no pagination) |
| List managed users (for admins) |
| List company groups |
| Subscribed channels of a company |
| Search visible/joinable channels |
| Detailed info about a channel |
| Members of a channel |
| Join a channel |
| Leave a channel |
| Create a new channel |
| Edit channel settings |
| Delete a channel permanently |
| Invite users to a channel |
| Accept a channel invitation |
| Decline a channel invitation |
| Remove a user from a channel |
| Grant moderator status |
| Revoke moderator status |
| Mark/unmark channel as favorite |
| Enable push notifications |
| Disable push notifications |
| All direct messages and group chats |
| Details of a conversation |
| Create a new encrypted conversation |
| Archive a conversation |
| Mark/unmark conversation as favorite |
| Fetch messages from a channel or conversation |
| Send a text message |
| Delete a message |
| Mark messages as read |
| Like a message |
| Get flagged messages |
| Remove like from a message |
| List users who liked a message |
| Flag a message |
| Unflag a message |
| List files and folders |
| Metadata for a file |
| Storage quota info |
| Rename a file |
| Delete one or more files |
| Upload a file to a channel/conversation/personal |
| Download a file as base64 |
| Move a file to another folder |
| Copy a file to another location |
| Create a new folder |
| Delete a folder |
| Recent notifications |
| Number of unread notifications |
| Account settings |
| Active devices |
| Change status message |
| Change account password |
| Deactivate an active device |
| Upload profile image (base64) |
| Reset profile image to default |
| Delete a specific notification |
| List calendar events in a time range |
| Details for a specific event |
| Create a new calendar event |
| Edit an existing event |
| Delete calendar events |
| Accept/decline event invitation |
| Invite users to an event |
| CalDAV sync URLs |
| Channels with events |
| List all broadcast lists |
| Create a new broadcast list |
| Delete a broadcast list |
| Rename a broadcast list |
| Add members to a broadcast list |
| Remove members from a broadcast list |
| List members of a broadcast list |
| Get messages from a broadcast list |
| Send a message to a broadcast list |
Polls (Surveys) | |
| List polls by constraint (created/invited/archived) |
| Get full poll details with questions |
| Create a new poll (as draft) |
| Edit an existing poll |
| Delete a poll |
| Publish a draft poll |
| Archive or unarchive a poll |
| Invite users or channels to a poll |
| List users who answered a poll |
| Create a question in a poll |
| Edit a question |
| Delete a question |
| Create an answer option |
| List answers with vote counts |
| Submit votes for a question |
| Export poll results as CSV |
| Start/stop watching a poll |
| List users invited to a poll |
| List poll invites with pagination |
| Edit an answer option |
| Delete an answer option |
Realtime | |
| Connect to Socket.io for live events |
| Disconnect from realtime |
| Send "typing..." indicator |
Building
npm run build # compile with esbuild → dist/index.js
npm run typecheck # TypeScript type check only
npm run clean # remove dist/License
MIT
Available Tools
104 toolsaccept_channel_inviteB
Accepts a pending channel invitation.
Inputs: invite_id (required).
add_broadcast_membersB
Adds members to a broadcast list.
Inputs: list_id (required), member_ids (required).
add_channel_moderatorA
Grants moderator status to a user in a channel.
Inputs: user_id (required), channel_id (required).
archive_conversationD
Archives a conversation.
Inputs: conversation_id (required).
archive_pollA
Archives or unarchives a poll.
Inputs: archive (required), poll_id (required).
change_passwordA
Changes the account password.
Inputs: new_password (required), old_password (required).
change_statusB
Changes the status message of the authenticated user.
Inputs: status (required).
copy_fileB
Copies a file to a folder in a channel or conversation.
Inputs: type (required), file_id (required), type_id (required), folder_id (required).
create_broadcastA
Creates a new broadcast list with the given name and members.
Inputs: name (required), member_ids (required).
create_channelC
Creates a new channel in a company.
Inputs: company_id (required), channel_name (required), type, visible, +6 more.
create_conversationB
Creates a new encrypted conversation with one or more users.
Inputs: member_ids (required), unique_identifier (required).
create_eventB
Creates a new calendar event. Type can be "personal", "channel", or "company".
Inputs: end (required), name (required), type (required), start (required), +10 more.
create_folderB
Creates a new folder in a storage area.
Inputs: name (required), type (required), type_id (required), parent_id (required).
create_pollA
Creates a new poll (initially as draft). Add questions/answers, then publish.
Inputs: name (required), end_time (required), company_id (required), start_time (required), +2 more.
create_poll_answerB
Creates an answer option for a question.
Inputs: type (required), company_id (required), question_id (required), position, +2 more.
create_poll_questionB
Creates a question within a poll.
Inputs: name (required), type (required), poll_id (required), company_id (required), +2 more.
create_realtime_connectionA
Creates a Socket.io connection to receive real-time events (new messages, typing indicators). Returns connection ID.
Inputs: debug.
deactivate_deviceB
Deactivates/removes an active device from the account.
Inputs: device_id (required).
decline_channel_inviteA
Declines a pending channel invitation.
Inputs: invite_id (required).
delete_broadcastB
Deletes a broadcast list.
Inputs: list_id (required).
delete_channelB
Deletes a channel permanently.
Inputs: channel_id (required).
delete_eventsB
Deletes one or more calendar events.
Inputs: event_ids (required).
delete_filesA
Deletes one or more files by their IDs.
Inputs: file_ids (required).
delete_folderA
Deletes a folder and all its contents.
Inputs: folder_id (required).
delete_messageA
Deletes a message by its ID.
Inputs: message_id (required).
delete_notificationB
Deletes a specific notification.
Inputs: notification_id (required).
delete_pollC
Deletes a poll.
Inputs: poll_id (required).
delete_poll_answerA
Deletes an answer option from a question.
Inputs: answer_id (required), company_id (required).
delete_poll_questionB
Deletes a question from a poll.
Inputs: company_id (required), question_id (required).
disable_channel_notificationsA
Disables push notifications for a channel.
Inputs: channel_id (required), duration.
disconnect_realtimeA
Disconnects a real-time connection.
Inputs: connection_id (required).
download_fileB
Downloads a file and returns it as base64.
Inputs: file_id (required), e2e_iv, encrypted.
edit_channelC
Edits an existing channel.
Inputs: channel_id (required), company_id (required), visible, password, +6 more.
edit_eventC
Edits an existing calendar event.
Inputs: end (required), name (required), type (required), start (required), +11 more.
edit_pollB
Edits an existing poll.
Inputs: name (required), poll_id (required), end_time (required), company_id (required), +3 more.
edit_poll_answerC
Edits an existing answer option.
Inputs: type (required), answer_id (required), company_id (required), position, +2 more.
edit_poll_questionC
Edits an existing question.
Inputs: name (required), company_id (required), question_id (required), position, +1 more.
enable_channel_notificationsB
Enables push notifications for a channel.
Inputs: channel_id (required).
export_pollA
Exports poll results as CSV data.
Inputs: poll_id (required).
flag_messageB
Flags a message for easy finding later.
Inputs: message_id (required).
get_account_settingsA
Returns account settings for the authenticated user.
Inputs: no named parameters.
get_all_company_membersA
Gets all members of a company (no pagination, may be slow for large companies).
Inputs: company_id (required).
get_broadcast_contentB
Gets messages from a broadcast list.
Inputs: list_id (required), limit, offset.
get_channel_infoC
Returns detailed info about a specific channel.
Inputs: channel_id (required), without_members.
get_channel_membersB
Returns the member list of a channel.
Inputs: channel_id (required), limit, offset.
get_companyA
Returns details for a specific company.
Inputs: company_id (required).
get_conversationB
Returns details about a specific conversation.
Inputs: conversation_id (required).
get_event_detailsB
Gets detailed information about a specific calendar event.
Inputs: event_id (required).
get_file_infoC
Returns metadata for a specific file.
Inputs: file_id (required).
get_flagged_messagesA
Returns flagged messages in a channel or conversation.
Inputs: type (required), type_id (required), limit, offset.
get_meA
Returns profile information for the currently authenticated user.
Inputs: no named parameters.
get_messagesC
Fetches messages from a Stashcat channel or conversation.
Inputs: id (required), chat_type (required), limit, offset.
get_notification_countB
Returns the number of unread notifications.
Inputs: no named parameters.
get_notificationsB
Returns recent notifications for the authenticated user.
Inputs: limit, offset.
get_poll_detailsB
Gets full details of a poll including questions.
Inputs: poll_id (required), company_id (required).
get_storage_quotaA
Returns used and total storage quota for a storage area.
Inputs: type (required), type_id (required).
get_userA
Returns profile information for a specific user by their ID.
Inputs: user_id (required).
invite_to_eventA
Invite users to a calendar event.
Inputs: event_id (required), user_ids (required).
invite_to_pollC
Invites users or channels to participate in a poll.
Inputs: poll_id (required), invite_to (required), company_id (required), invite_ids (required).
invite_users_to_channelB
Invites users to join a channel.
Inputs: user_ids (required), channel_id (required), text.
join_channelB
Joins a channel (optionally with a password).
Inputs: channel_id (required), password.
like_messageC
Likes a message.
Inputs: message_id (required).
list_active_devicesA
Lists all active devices for the authenticated user.
Inputs: no named parameters.
list_available_calendarsA
Lists available calendars including CalDAV sync URLs.
Inputs: no named parameters.
list_broadcast_membersB
Lists members of a broadcast list.
Inputs: list_id (required).
list_broadcastsA
Lists all broadcast lists the user has access to.
Inputs: no named parameters.
list_channelsA
Lists all channels the authenticated user is subscribed to in a company.
Inputs: company_id (required).
list_channels_having_eventsA
Lists channels that have calendar events in a company.
Inputs: company_id (required).
list_companiesA
Lists all companies the authenticated user is a member of.
Inputs: no named parameters.
list_company_membersC
Lists all members of a company.
Inputs: company_id (required), limit, offset, search.
list_conversationsB
Lists all conversations (direct messages and group chats) of the authenticated user.
Inputs: limit, offset, include_archived.
list_eventsA
Lists calendar events within a time range. Times are Unix timestamps (seconds).
Inputs: end (required), start (required).
list_filesB
Lists files and subfolders in a Stashcat storage area (channel, conversation, or personal files).
Inputs: type (required), limit, offset, search, +3 more.
list_groupsA
Lists all groups in a company.
Inputs: company_id (required).
list_likesA
Returns a list of users who liked a message.
Inputs: message_id (required).
list_managed_usersB
Lists managed users in a company (for admins).
Inputs: company_id (required), limit, offset, search, +1 more.
list_poll_answersA
Lists all answer options for a question, including vote counts.
Inputs: question_id (required).
list_poll_invited_usersB
Lists users who have been invited to a poll.
Inputs: poll_id (required).
list_poll_invitesC
Lists invites for a poll with pagination.
Inputs: poll_id (required), type, limit, offset.
list_poll_participantsA
Lists users who have participated in (answered) a poll.
Inputs: poll_id (required).
list_pollsA
Lists polls/surveys for the current user. Constraint filters: "createdByAndNotArchived", "invited", "archived".
Inputs: constraint (required), company_id.
mark_as_readA
Marks messages in a channel or conversation as read up to the given message ID.
Inputs: id (required), chat_type (required), message_id (required).
move_fileA
Moves a file to a different folder.
Inputs: file_id (required), parent_id (required).
publish_pollA
Publishes a draft poll, making it active and visible to invitees.
Inputs: poll_id (required).
quit_channelB
Leaves a channel.
Inputs: channel_id (required).
remove_broadcast_membersA
Removes members from a broadcast list.
Inputs: list_id (required), member_ids (required).
remove_channel_moderatorB
Revokes moderator status from a user in a channel.
Inputs: user_id (required), channel_id (required).
remove_user_from_channelB
Removes a user from a channel.
Inputs: user_id (required), channel_id (required).
rename_broadcastA
Renames a broadcast list.
Inputs: name (required), list_id (required).
rename_fileC
Renames a file.
Inputs: file_id (required), new_name (required).
reset_profile_imageA
Resets the profile image to default.
Inputs: no named parameters.
respond_to_eventA
Respond to a calendar event invitation (accept, decline, or reset to open).
Inputs: status (required), user_id (required), event_id (required).
search_channelsA
Searches for visible (joinable) channels in a company by name.
Inputs: company_id (required), limit, offset, search.
send_broadcast_messageB
Sends a message to all members of a broadcast list.
Inputs: text (required), list_id (required).
send_messageB
Sends a text message to a Stashcat channel or conversation.
Inputs: text (required), target_id (required), target_type (required), reply_to_id.
send_typing_indicatorB
Sends a "typing" indicator to a channel or conversation.
Inputs: chat_id (required), chat_type (required), connection_id (required).
set_channel_favoriteB
Marks or unmarks a channel as favorite.
Inputs: favorite (required), channel_id (required).
set_conversation_favoriteB
Marks or unmarks a conversation as favorite.
Inputs: favorite (required), conversation_id (required).
store_profile_imageB
Uploads a new profile image as base64.
Inputs: image_base64 (required).
unflag_messageB
Removes the flag from a message.
Inputs: message_id (required).
unlike_messageB
Removes a like from a message.
Inputs: message_id (required).
upload_fileB
Uploads a file to a channel, conversation, or personal files.
Inputs: type (required), file_path (required), type_id, filename, +1 more.
vote_pollB
Submits the user's vote (selected answers) for a question.
Inputs: answer_ids (required), question_id (required).
watch_pollB
Start or stop watching a poll for changes.
Inputs: watch (required), poll_id (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 104 tools
Several tools have nearly identical purposes: get_all_company_members and list_company_members are effectively duplicates, and list_poll_invited_users vs list_poll_invites overlap heavily. With 104 tools across 10 domains, an agent will frequently struggle to select the right one, especially for poll and member-management operations.
The set overwhelmingly follows a consistent snake_case verb_noun pattern (create_channel, delete_message, list_polls, upload_file). Minor deviations like mark_as_read, invite_users_to_channel, and remove_user_from_channel break the pattern slightly but remain readable and predictable.
104 tools is far too many for an agent to efficiently navigate, even given the broad scope of a full collaboration platform API. The poll subdomain alone contributes 21 tools, and the file/message domains could be consolidated without losing capability.
The surface provides strong lifecycle coverage for channels, files, events, broadcasts, and polls, including niche operations like voting, export, and realtime connections. Notable gaps include no message editing, no single-message fetch by ID, and no conversation member management, but agents can work around most of these.
Related MCP Connectors
MCP server for Sendbird — chat users, channels, members, and messages from your AI client.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server for AI dialogue using various LLM models via AceDataCloud
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA full-featured MCP server providing seamless access to CustomGPT.ai APIs, enabling agent and conversation management through MCP-compatible clients.5MIT
- AlicenseAqualityBmaintenanceMCP Server for the Mattermost API, enabling Claude and other MCP clients to interact with Mattermost workspaces.13105 npm6MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for the Steuerboard API, enabling interaction with Steuerboard services through natural language.37 npm1-
- FlicenseNot gradedqualityDmaintenanceMCP server for Rocket.Chat, enabling AI agents to interact with Rocket.Chat workspaces via tools like listing users, sending messages, and managing channels.2-