
Zulip Chat
β 18from akougkas
An MCP server for integrating with the Zulip team chat platform.
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>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/denyin the session topic
Two-Tier Tool Architecture
v0.6.0 introduced a deliberate split: 20 core tools by default, 56 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 56? 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-toolsOr via environment variable:
ZULIPCHAT_EXTENDED_TOOLS=1 uvx zulipchat-mcp --zulip-config-file ~/.zuliprcExtended mode adds: toggle_reaction, cross_post_message, advanced_search, construct_narrow, get_scheduled_messages, manage_scheduled_message, 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.
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-botThe 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 ~/.zuliprcRun checks:
uv run pytest -q # full test suite, 60% coverage gate
uv run ruff check . # Linting
uv run mypy src # Type checkingFor packaging, dependency, FastMCP, or startup changes, run the release smoke:
uv build
scripts/pre_release_smoke.sh --version X.Y.Z --allow-dirtySee 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
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 -->
uvx zulipchat-mcp --zulip-config-file ~/.zuliprcQuick Start
uvx zulipchat-mcp --zulip-config-file ~/.zuliprcThat'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-setupInstallation
Full per-client setup guide: docs/integrations/README.md
Claude Code
claude mcp add zulipchat -- uvx zulipchat-mcp --zulip-config-file ~/.zuliprcWith dual identity (you + a bot):
claude mcp add zulipchat -- uvx zulipchat-mcp \
--zulip-config-file ~/.zuliprc \
--zulip-bot-config-file ~/.zuliprc-botOptional Claude hook bridge for lifecycle and approval routing:
uvx zulipchat-mcp-hook \
--zulip-config-file ~/.zuliprc \
--zulip-bot-config-file ~/.zuliprc-botOptional 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-botGemini 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 56 tools instead of the 20-tool core set |
--unsafe | Enable administrative tools (use with caution) |
--debug | Enable debug logging |
More clients
Dedicated setup pages:
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.
Licensed under MITβ you can use, modify, and redistribute it under that license's terms.
License
MIT β See LICENSE