zulip-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZULIP_SITE | Yes | Base URL of your Zulip instance | |
| ZULIP_EMAIL | Yes | Your Zulip login email or bot email | |
| ZULIP_API_KEY | Yes | API key from Zulip settings |
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": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_streamsA | List all visible Zulip streams (channels). Use this to discover what streams/channels exist in the organization. Returns stream names, IDs, descriptions, and subscriber counts. Args: include_public: Include public streams. Defaults to True. include_subscribed: Include streams you're subscribed to. Defaults to True. exclude_archived: Exclude archived streams. Defaults to True. Returns: JSON list of streams with their metadata. |
| list_subscriptionsA | List streams (channels) you are subscribed to. Use this to see which streams the authenticated user can access. More focused than list_streams — only shows your subscriptions. Returns: JSON list of subscribed streams with names and IDs. |
| get_stream_idA | Look up a stream's numeric ID by its name. Use this when you know a stream's name but need its ID for other API calls (e.g., list_topics requires a stream_id). Args: stream_name: Exact name of the stream (case-sensitive). Returns: JSON object with the stream_id. |
| list_topicsA | List topics (threads) in a stream, most recent first. Use this to discover what conversations exist in a stream before fetching messages. Each topic is like a thread/subject line. Args: stream_id: The numeric ID of the stream. Use get_stream_id to look this up. Returns: JSON list of topics with names and last message IDs. |
| get_messagesA | Fetch messages from Zulip with flexible filtering. This is the primary tool for reading chat history. Combine filters to narrow down results — e.g., stream + topic to get a specific conversation, or sender + search to find specific messages from a person. Pagination: Results are anchored at a point and fetch messages before/after it. To paginate through history:
Args: stream: Filter by stream/channel name (e.g., "eng-resharding"). topic: Filter by topic/thread name within a stream. sender: Filter by sender email (e.g., "shreyan@nearone.org"). search: Full-text search query across message content. anchor: Reference point — a message ID (as string) or "newest", "oldest", "first_unread". Defaults to "newest". num_before: Number of messages before the anchor. Max 5000. Defaults to 100. num_after: Number of messages after the anchor. Max 5000. Defaults to 0. include_html: If True, return HTML-rendered content. If False (default), return raw Markdown source — better for analysis. Returns: JSON object with keys: - messages: list of message objects (id, sender, content, timestamp, etc.) - found_newest: whether there are no newer messages matching the filter - found_oldest: whether there are no older messages matching the filter - anchor: the anchor message ID used |
| get_messageA | Fetch a single message by its ID. Use this when you have a specific message ID and want its full content, or when following up on a message reference from another tool's output. Args: message_id: The numeric message ID. include_html: If True, return HTML. If False (default), raw Markdown. Returns: JSON object with the full message details. |
| get_own_profileA | Get the authenticated user's own profile. Use this to verify the connection is working and to see who is authenticated. This is the first tool to call when setting up. Returns: JSON object with user profile: user_id, email, full_name, etc. |
| get_userA | Get a user's profile by their numeric ID or email address. Args: identifier: Either a numeric user ID (e.g., "12345") or an email address (e.g., "alice@example.com"). Returns: JSON object with user profile details. |
| list_usersA | List all users in the Zulip organization. Returns all active and deactivated users. Use this to find user IDs or email addresses for filtering messages. Returns: JSON list of user objects with basic profile info. |
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 9 tools
Each tool has a clearly distinct purpose: get_message vs get_messages differ in cardinality, get_user vs get_own_profile differ in target, list_streams vs list_subscriptions differ in scope. No overlap or ambiguity.
All tool names follow a consistent verb_noun pattern using snake_case (e.g., get_message, list_streams). There are no deviations or mixed conventions.
9 tools is a reasonable number for a Zulip MCP server focused on reading data. Each tool serves a distinct function without being excessive or insufficient for the apparent scope.
The server is read-only, missing core write operations such as sending messages, creating streams, or subscribing. This is a significant gap for a chat platform, limiting agent capability.