rc-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| RC_URL | Yes | Server base URL, e.g. https://chat.example.com. http(s) only; trailing / is removed. | |
| RC_USER_ID | Yes | Your user id. It is shown with the token when you create a PAT. | |
| RC_AUTH_TOKEN | Yes | Personal access token, created with "Ignore Two Factor Authentication". | |
| RC_MCP_CONFIG | No | Path to the config file. The default path is used only if the file exists; a path set here must exist. Default: $XDG_CONFIG_HOME/rc-mcp/config.json, else ~/.config/rc-mcp/config.json | |
| RC_MCP_DATA_DIR | No | Where the index and saved files live. Must be an absolute path; a leading ~ is expanded. A relative path is a configuration error. Default: $XDG_DATA_HOME/rc-mcp, else ~/.local/share/rc-mcp | |
| RC_E2EE_PASSWORD | No | E2EE password or passphrase. Without it, encrypted rooms are listed but not decrypted. | |
| RC_MCP_EPHEMERAL | No | 1, true, yes or on: keep the index in memory only, and have get_file return files inline instead of saving them. | false |
| RC_MCP_LOG_LEVEL | No | debug, info, warn, error or silent. Logs are JSON lines on stderr. | info |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Read-only access to a Rocket.Chat workspace, including end-to-end encrypted rooms (decrypted locally). Typical flow: list_rooms -> search (full-text over the local index, with room/user/date filters) -> get_message / get_thread / get_messages to read context -> get_file for attachments. Team documentation, decisions and how-tos often live in threads: when a hit has reply_count or thread_id, read the whole thread with get_thread. Messages that cannot be decrypted are returned with an undecryptable.reason and hint instead of text; never guess their content. Nothing here can send, edit or react to messages.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_roomsA | List the rooms (channels, private groups, direct messages) this account belongs to, with type, whether the room is end-to-end encrypted, the E2EE key status (ok | suggested | missing | undecryptable | not-encrypted | e2ee-unavailable), last activity and how much of it is indexed locally. Use it to find room ids/names for the other tools. |
| get_messagesA | Read messages of one room, decrypted, oldest-first within the returned page (newest page by default). Each message has id, ts, author, text, thread_id/reply_count, attachments and a permalink. Page backwards with |
| get_threadA | Read a whole thread: the root message and all replies in chronological order, decrypted. Accepts the root message id, any reply id, or a pasted Rocket.Chat thread/message URL. Threads are where most how-tos and decisions are discussed. |
| get_messageA | Fetch a single message by id or by a pasted Rocket.Chat permalink (…?msg=), decrypted. Messages that quote other messages list them in |
| searchA | Full-text search over the locally indexed, decrypted messages of all rooms (including end-to-end encrypted ones). All words must match; accents are ignored; append * for prefix search (deploy*). Filter by rooms, authors (usernames), date range or thread. Results include a «highlighted» snippet, thread info and permalink. When specific unencrypted rooms are given, the Rocket.Chat server search is also queried and merged ( |
| syncA | Fetch new, edited and deleted messages into the local index of decrypted messages, for one room or for all rooms. Older history is backfilled in chunks of up to max_messages (default 2000) per room per call: if |
| get_fileA | Download an attachment and decrypt it locally if it was uploaded to an encrypted room (integrity checked against the uploader's SHA-256). Text-like files (markdown, code, json, csv, txt…) up to max_inline_bytes are returned as text; images up to 4 MiB as images; other files are saved to the private data directory and the path is returned (in ephemeral mode they are returned inline as a binary resource instead, never written to disk). Identify the file by file_id (from a message's attachments) or by message_id. |
| get_userA | Look up a Rocket.Chat user by username or id: display name, status, status text, bio, roles and timezone offset when visible to this account. |
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 8 tools
Each tool targets a distinct resource or action: user lookup, single-message fetch, room timeline, thread, global search, room listing, attachment download, and index sync. The singular/plural pair get_message/get_messages is clearly differentiated by descriptions, and no tools appear to do the same thing.
Six tools follow a clear verb_noun pattern (get_user, get_message, get_file, get_messages, get_thread, list_rooms), while search and sync use bare verbs without nouns. This is a minor deviation from an otherwise predictable convention.
Eight tools is well-scoped for a read-focused Rocket.Chat client. Each tool earns its place by covering a distinct retrieval granularity (user, room, message, thread, search, file) plus index synchronization.
The read surface is comprehensive: users, rooms, messages, threads, full-text search, attachments, and index sync are all covered. The main gap is the absence of any write/send operations, and there is no tool for room member lists or bulk user listing, but core read workflows have no dead ends.