Skip to main content
Glama

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 build

Configuration

Copy .env.example to .env and fill in your credentials:

cp .env.example .env
STASHCAT_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.json

The 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

get_me

Profile of the authenticated user

get_user

Profile of a specific user

list_companies

Companies the user belongs to

get_company

Details of a company

list_company_members

Members of a company

get_all_company_members

Get all members (no pagination)

list_managed_users

List managed users (for admins)

list_groups

List company groups

list_channels

Subscribed channels of a company

search_channels

Search visible/joinable channels

get_channel_info

Detailed info about a channel

get_channel_members

Members of a channel

join_channel

Join a channel

quit_channel

Leave a channel

create_channel

Create a new channel

edit_channel

Edit channel settings

delete_channel

Delete a channel permanently

invite_users_to_channel

Invite users to a channel

accept_channel_invite

Accept a channel invitation

decline_channel_invite

Decline a channel invitation

remove_user_from_channel

Remove a user from a channel

add_channel_moderator

Grant moderator status

remove_channel_moderator

Revoke moderator status

set_channel_favorite

Mark/unmark channel as favorite

enable_channel_notifications

Enable push notifications

disable_channel_notifications

Disable push notifications

list_conversations

All direct messages and group chats

get_conversation

Details of a conversation

create_conversation

Create a new encrypted conversation

archive_conversation

Archive a conversation

set_conversation_favorite

Mark/unmark conversation as favorite

get_messages

Fetch messages from a channel or conversation

send_message

Send a text message

delete_message

Delete a message

mark_as_read

Mark messages as read

like_message

Like a message

get_flagged_messages

Get flagged messages

unlike_message

Remove like from a message

list_likes

List users who liked a message

flag_message

Flag a message

unflag_message

Unflag a message

list_files

List files and folders

get_file_info

Metadata for a file

get_storage_quota

Storage quota info

rename_file

Rename a file

delete_files

Delete one or more files

upload_file

Upload a file to a channel/conversation/personal

download_file

Download a file as base64

move_file

Move a file to another folder

copy_file

Copy a file to another location

create_folder

Create a new folder

delete_folder

Delete a folder

get_notifications

Recent notifications

get_notification_count

Number of unread notifications

get_account_settings

Account settings

list_active_devices

Active devices

change_status

Change status message

change_password

Change account password

deactivate_device

Deactivate an active device

store_profile_image

Upload profile image (base64)

reset_profile_image

Reset profile image to default

delete_notification

Delete a specific notification

list_events

List calendar events in a time range

get_event_details

Details for a specific event

create_event

Create a new calendar event

edit_event

Edit an existing event

delete_events

Delete calendar events

respond_to_event

Accept/decline event invitation

invite_to_event

Invite users to an event

list_available_calendars

CalDAV sync URLs

list_channels_having_events

Channels with events

list_broadcasts

List all broadcast lists

create_broadcast

Create a new broadcast list

delete_broadcast

Delete a broadcast list

rename_broadcast

Rename a broadcast list

add_broadcast_members

Add members to a broadcast list

remove_broadcast_members

Remove members from a broadcast list

list_broadcast_members

List members of a broadcast list

get_broadcast_content

Get messages from a broadcast list

send_broadcast_message

Send a message to a broadcast list

Polls (Surveys)

list_polls

List polls by constraint (created/invited/archived)

get_poll_details

Get full poll details with questions

create_poll

Create a new poll (as draft)

edit_poll

Edit an existing poll

delete_poll

Delete a poll

publish_poll

Publish a draft poll

archive_poll

Archive or unarchive a poll

invite_to_poll

Invite users or channels to a poll

list_poll_participants

List users who answered a poll

create_poll_question

Create a question in a poll

edit_poll_question

Edit a question

delete_poll_question

Delete a question

create_poll_answer

Create an answer option

list_poll_answers

List answers with vote counts

vote_poll

Submit votes for a question

export_poll

Export poll results as CSV

watch_poll

Start/stop watching a poll

list_poll_invited_users

List users invited to a poll

list_poll_invites

List poll invites with pagination

edit_poll_answer

Edit an answer option

delete_poll_answer

Delete an answer option

Realtime

create_realtime_connection

Connect to Socket.io for live events

disconnect_realtime

Disconnect from realtime

send_typing_indicator

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 tools
accept_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

    C2.9/5.0

    Scored across 104 tools

    Disambiguation2/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    Related MCP Servers