ZulipChat MCP Server MCP Server
io.github.akougkas/zulipchat
Connect Claude, Cursor, and other AI assistants to Zulip with 60+ messaging, search, and analytics tools.
What is the ZulipChat MCP Server MCP server?
The ZulipChat MCP Server bridges MCP-compatible AI assistants to Zulip, enabling them to send and read messages, search conversation history, manage reactions, and bind agent sessions to topics. It offers a 20-tool core mode for everyday tasks and an extended 60-tool mode for scheduled messages, file uploads, analytics, and advanced search.
ZulipChat MCP lets AI assistants like Claude and Cursor interact with your Zulip workspace. You can ask your assistant to read messages, search conversations, send announcements, react to posts, resolve people by name, and even bind long-running agent sessions to Zulip topics for approval workflows. It supports dual identity (user + bot), works over stdio or HTTP, and requires only your Zulip API credentials.
How to install ZulipChat MCP Server
Copy-paste configuration for popular MCP clients.
ZULIP_EMAILYour Zulip account email address
ZULIP_API_KEYsecretYour Zulip API key
ZULIP_SITEYour Zulip server URL (e.g., https://yourorg.zulipchat.com)
Tools & capabilities
Tools this server exposes to the agent.
send_message— Send a message to a stream, topic, or direct messageedit_message— Edit an existing messageget_message— Retrieve a specific message by IDadd_reaction— Add an emoji reaction to a messagesearch_messages— Full-text search messages with filters for sender, stream, and time rangeget_streams— List all streams in the workspaceget_stream_info— Get detailed information about a specific streamget_stream_topics— List topics in a streamresolve_user— Resolve a user by name (fuzzy matching)get_users— List all users in the workspaceget_own_user— Get information about the authenticated userteleport_chat— Send a direct message with fuzzy name resolutionregister_agent— Register an agent sessionensure_agent_session— Ensure an agent session existsagent_message— Send a message within an agent sessionrequest_user_input— Request approval or input from a user in-topicwait_for_response— Wait for a user response to a requestswitch_identity— Switch between user and bot identityserver_info— Get Zulip server informationmanage_message_flags— Manage message flags (read, starred, etc.)
Use cases
- Ask your assistant to summarize what happened in a Zulip stream today or over a time range
- Send announcements or notifications to teams via Zulip without leaving your AI chat
- Search conversation history to find who said what and when, with full-text filtering
- React to messages and manage approvals by having your assistant post in a Zulip topic and wait for owner responses
- Bind long-running agent sessions to Zulip topics for persistent, auditable task tracking and human oversight
ZulipChat MCP Server MCP server FAQ
It's an MCP server that connects AI assistants (Claude, Cursor, Gemini CLI, etc.) to Zulip, letting them read/write messages, search conversations, manage reactions, and run approval workflows in your Zulip workspace.
Yes. ZulipChat MCP is open-source (MIT license) and free to use. You only need a Zulip account and API credentials.
Install via PyPI (`pip install zulipchat-mcp`) or use `uvx zulipchat-mcp --zulip-config-file ~/.zuliprc`. Then add it to your MCP config with the command and path to your zuliprc file. See docs/integrations/ for client-specific steps.
You need a Zulip API key. Get it from Zulip Settings > Personal > Account & privacy > API key, save it as ~/.zuliprc, and pass that path to the server.
Core mode (default) provides 20 essential tools for messaging, search, and reactions. Extended mode adds 40+ tools for scheduled messages, file uploads, event listeners, analytics, and advanced search. Enable it with `--extended-tools`.
Yes. Provide both `--zulip-config-file` (your account) and `--zulip-bot-config-file` (bot account) to enable dual identity. Your assistant can switch between them with `switch_identity`.
README (reference)
Source of truth, from the repository.
ZulipChat MCP Server
<div align="center"> <h3>Model Context Protocol server for Zulip Chat. Connect Claude Code, Gemini CLI, Codex, Cursor, Windsurf, VS Code Copilot, and other MCP clients to Zulip.</h3>Quick Start · Setup Wizard · Integrations · Two-Tier Tools · Contributing
</div>Quick Start
uvx zulipchat-mcp --zulip-config-file ~/.zuliprc
That's it. Your AI assistant can now read and write Zulip messages.
Need a zuliprc? Zulip Settings > Personal > Account & privacy > API key — download the file, save it as ~/.zuliprc.
Interactive onboarding:
uvx --from zulipchat-mcp zulipchat-mcp-setup
What This Does
ZulipChat MCP bridges any MCP-compatible AI assistant (Claude Code, Gemini CLI, Cursor, Windsurf, etc.) to your Zulip workspace. The assistant can:
- Send and read messages — stream messages, DMs, replies, reactions
- Search conversation history — full-text search with filters for sender, stream, time range
- Resolve people by name — "message Jaime" just works, no hunting for formal emails
- Switch identities — post as yourself or as a bot, in the same session
- Monitor activity — search recent messages, get stream info, check who's online
- Bind sessions to Zulip topics — give long-running agent sessions a stable control topic
- Request approvals in-topic — owner replies with
/approve REQUEST_IDor/deny REQUEST_IDin the session topic; each decision names the request it answers
Two-Tier Tool Architecture
v0.6.0 introduced a deliberate split: 20 core tools by default, 60 tools when you need more.
Core Mode (default)
The 20 tools that cover most daily use:
| Category | Tools |
|---|---|
| Messaging | send_message, edit_message, get_message, add_reaction |
| Search | search_messages, get_streams, get_stream_info, get_stream_topics |
| Users | resolve_user, get_users, get_own_user |
| Agent Comms | teleport_chat, register_agent, ensure_agent_session, agent_message, request_user_input, wait_for_response |
| System | switch_identity, server_info, manage_message_flags |
Why 20 instead of 60? Fewer tools means faster tool selection, lower token overhead, and less confusion for the AI. Most tasks — sending messages, searching, reacting, and binding an agent session to Zulip — only need the core set.
Extended Mode
Need scheduled messages, event queues, file uploads, analytics, or advanced search?
uvx zulipchat-mcp --zulip-config-file ~/.zuliprc --extended-tools
Or via environment variable:
ZULIPCHAT_EXTENDED_TOOLS=1 uvx zulipchat-mcp --zulip-config-file ~/.zuliprc
Extended mode adds: toggle_reaction, cross_post_message, advanced_search, construct_narrow, get_scheduled_messages, manage_scheduled_message, get_drafts, create_draft, edit_draft, delete_draft, register_events, get_events, listen_events, upload_file, manage_files, get_daily_summary, manage_user_mute, get_user, get_presence, get_user_groups, and more.
Installation
Full per-client setup guide: docs/integrations/README.md
Claude Code
claude mcp add zulipchat -- uvx zulipchat-mcp --zulip-config-file ~/.zuliprc
With dual identity (you + a bot):
claude mcp add zulipchat -- uvx zulipchat-mcp \
--zulip-config-file ~/.zuliprc \
--zulip-bot-config-file ~/.zuliprc-bot
Optional Claude hook bridge for lifecycle and approval routing:
uvx zulipchat-mcp-hook \
--zulip-config-file ~/.zuliprc \
--zulip-bot-config-file ~/.zuliprc-bot
Optional Claude package export for project-local hooks, skills, and subagents:
uvx zulipchat-mcp-integrate export \
--client claude-code \
--mode standalone \
--output-dir . \
--zulip-config-file ~/.zuliprc \
--zulip-bot-config-file ~/.zuliprc-bot
Gemini CLI
Add to ~/.gemini/settings.json under mcpServers:
{
"zulipchat": {
"command": "uvx",
"args": ["zulipchat-mcp", "--zulip-config-file", "/path/to/.zuliprc"]
}
}
Claude Desktop / Cursor / Any MCP Client
Add to your MCP configuration:
{
"mcpServers": {
"zulipchat": {
"command": "uvx",
"args": ["zulipchat-mcp", "--zulip-config-file", "/path/to/.zuliprc"]
}
}
}
Configuration Options
| Option | Description |
|---|---|
--zulip-config-file PATH | Path to your zuliprc file |
--zulip-bot-config-file PATH | Bot zuliprc for dual identity |
--extended-tools | Register all 60 tools instead of the 20-tool core set |
--transport {stdio,http} | Transport to serve on (default: stdio) |
--host HOST | Bind host for HTTP transport (default: 127.0.0.1) |
--port PORT | Bind port for HTTP transport (default: 8000) |
--auth-token TOKEN | Bearer auth token for HTTP transport (or ZULIPCHAT_HTTP_AUTH_TOKEN) |
--allowed-host HOST | Additional trusted HTTP hostname; repeat for multiple names |
--allowed-origin URL | Additional trusted browser origin; repeat for multiple origins |
--unsafe | Enable administrative tools (use with caution) |
--debug | Enable debug logging |
Remote HTTP Transport
ZulipChat MCP supports stateless HTTP deployments under the MCP 2026-07-28 protocol:
# Run server over HTTP with bearer authentication
ZULIPCHAT_HTTP_AUTH_TOKEN=your-secret-token \
uvx zulipchat-mcp --zulip-config-file ~/.zuliprc --transport http --host 0.0.0.0 --port 8000 --allowed-host mcp.internal
Generate client integration snippets for remote HTTP connections:
uvx zulipchat-mcp-integrate print --client claude-code --remote-url http://mcp.internal:8000/mcp --remote-token your-secret-token
HTTP startup requires a bearer token for non-loopback binds and validates Host and Origin headers. Configure --allowed-host for the hostname used by clients or a reverse proxy; terminate TLS at the proxy for remote connections. A token grants access to the configured Zulip account: deploy a separate instance per trusted account, rather than sharing it across unrelated users.
HTTP tools reject server-local file paths, outbound event callbacks, and switch_identity. Upload with file_content; download without download_path to obtain a URL. Use stdio for local file operations and runtime identity switching. Attachment deletion requires --unsafe.
Agent sessions, approvals, listener cursors, and default background-task storage remain local state. Use a single instance for these workflows. Separate DuckDB paths avoid writer conflicts but do not share session data; ordinary round-robin routing across such replicas is not supported. Legacy HTTP clients may also retain transport sessions.
AI Analytics & LLM Provider
AI-powered analytics tools (analyze_stream_with_llm, analyze_team_activity_with_llm, intelligent_report_generator) execute using a server-side Anthropic LLM provider:
- Set
ANTHROPIC_API_KEYon the server process for LLM generation. - Optionally set
ANTHROPIC_MODELto override the default model (claude-opus-5). - Without an API key, analytics tools return structured data summaries with
llm_unavailable: trueso your client assistant can analyze the data directly.
More clients
Dedicated setup pages:
Dual Identity
Configure both a user and a bot zuliprc to let your assistant switch between identities mid-session:
uvx zulipchat-mcp \
--zulip-config-file ~/.zuliprc \
--zulip-bot-config-file ~/.zuliprc-bot
The assistant posts as you by default. Call switch_identity to post as the bot — useful for automated notifications, agent-to-agent communication, or keeping human vs. bot messages distinct.
Real-World Examples
"Catch me up on what happened in #engineering today"
→ Assistant calls search_messages with stream + time filter, summarizes the thread.
"Tell the team we're deploying at 3pm"
→ Assistant calls send_message to #engineering with the announcement.
"Who sent that message about the API migration?"
→ Assistant calls search_messages with keywords, returns sender and context.
"React with :thumbs_up: to Sarah's last message"
→ Assistant calls resolve_user ("Sarah"), search_messages (sender), then add_reaction.
"DM Jaime that the PR is ready"
→ Assistant calls teleport_chat with fuzzy name resolution — no email needed.
Development
git clone https://github.com/akougkas/zulipchat-mcp.git
cd zulipchat-mcp
uv sync
uv run zulipchat-mcp --zulip-config-file ~/.zuliprc
Run checks:
uv run pytest -q # full test suite, 60% coverage gate
uv run ruff check . # Linting
uv run mypy src # Type checking
For packaging, dependency, FastMCP, or startup changes, run the release smoke:
uv build
scripts/pre_release_smoke.sh --version X.Y.Z --allow-dirty
See CONTRIBUTING.md for the full guide, and CLAUDE.md / AGENTS.md for AI agent instructions.
Architecture
src/zulipchat_mcp/
├── core/ # Client wrapper, identity, caching, security
├── tools/ # MCP tool implementations (two-tier registration)
├── services/ # Background listener and session event routing
├── utils/ # Logging, DuckDB persistence, metrics
└── config.py # config loading (zuliprc + environment fallback)
Built on FastMCP with async-first design, DuckDB for agent state persistence, and smart user/stream caching for fast fuzzy resolution.
Privacy
- No data collection — nothing leaves your machine except Zulip API calls
- No telemetry — zero analytics, tracking, or usage reporting
- Local execution — all processing happens on your hardware
- Credentials stay local — API keys are never logged or transmitted beyond your Zulip server
Full policy: PRIVACY.md
License
MIT — See LICENSE
Links
- Documentation Index
- Support
- Security Policy
- Zulip API Documentation
- Model Context Protocol
- Report Issues
- Discussions
<div align="center"> <sub>Built for the Zulip community</sub> </div> <!-- mcp-name: io.github.akougkas/zulipchat -->
Related MCP servers

CiteNexus
Search scholarly sources, verify references, and export citations with traceable evidence.
Open-source security layer for AI agents accessing clinical data: PHI redaction, audit trails, step-up auth, and tenant isolation.

Arduino MCP Server
Arduino MCP server for CLI setup, board detection, compile/upload, serial monitoring, and pin refs.

Depot (depot.dev)
Read-only MCP server for Depot (depot.dev): CI failure diagnosis, build forensics, and usage.

Kylas CRM
MCP server for Kylas CRM: create, search, and manage leads. Requires KYLAS_API_KEY.

TypesenseKit
95 typed Typesense operations for AI agents through an MCP server that is read-only by default.
