Skip to main content

Model Context Protocol (MCP) server that connects AI assistants to Zulip Chat with a 20-tool core mode and 56-tool extended mode

Project description

ZulipChat MCP Server

Model Context Protocol server for Zulip Chat. Connect Claude Code, Gemini CLI, Codex, Cursor, Windsurf, VS Code Copilot, and other MCP clients to Zulip.

PyPI CI Publish Coverage Gate Downloads GitHub stars Python License MCP

Quick Start · Setup Wizard · Integrations · Two-Tier Tools · Contributing


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 / deny in 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-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, 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 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:

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


Built for the Zulip community

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zulipchat_mcp-0.7.1.tar.gz (370.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zulipchat_mcp-0.7.1-py3-none-any.whl (149.2 kB view details)

Uploaded Python 3

File details

Details for the file zulipchat_mcp-0.7.1.tar.gz.

File metadata

  • Download URL: zulipchat_mcp-0.7.1.tar.gz
  • Upload date:
  • Size: 370.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for zulipchat_mcp-0.7.1.tar.gz
Algorithm Hash digest
SHA256 1fe0791dfd2302bf07a4f556ef14a05a235fee4cd88d6aaa2a8f990f1e26748b
MD5 224be6cdf017e8ea23a48c0115c9c8b6
BLAKE2b-256 5b5b541ba89e6824386eff3c3c81c3ef7cd48d460ba52a54b99a5706d0da24b8

See more details on using hashes here.

Provenance

The following attestation bundles were made for zulipchat_mcp-0.7.1.tar.gz:

Publisher: publish.yml on akougkas/zulipchat-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file zulipchat_mcp-0.7.1-py3-none-any.whl.

File metadata

  • Download URL: zulipchat_mcp-0.7.1-py3-none-any.whl
  • Upload date:
  • Size: 149.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for zulipchat_mcp-0.7.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d782c78d55cbad4c090e112eb3c22065f1da604e33a4fabc7a41911693608973
MD5 0a14347548de6916582facd11649eea1
BLAKE2b-256 b90cb3f045a155afb9c4333de9390aca40df610cc9606a5aca55850b4b08737a

See more details on using hashes here.

Provenance

The following attestation bundles were made for zulipchat_mcp-0.7.1-py3-none-any.whl:

Publisher: publish.yml on akougkas/zulipchat-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page