Run AI agents as @mentionable bots in Zulip or integrate with any MCP client for real-time session and file handling.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
One-click editor setup isnβt available for this listing yet β we donβt have a confirmed install command, and weβd rather show nothing than point your editor at the wrong package or host. Follow the projectβs own setup instructions, linked above.
Inspect callable tools, capabilities, and parameters exposed to AI agents by Zulipmcp.
Run AI agents in Zulip as @mentionable bots β or wire into any MCP client. Also works as a Python library.
Install the package:
Add a .zuliprc file to your project root with your Zulip bot credentials. See Add a bot or integration for instructions on making a bot. The bot type must be "generic."
Add the MCP server to your .mcp.json:
Restart your MCP client. The Zulip tools should now be available.
.zuliprc file for Zulip API auth (see Quickstart)claude by default, codex with --backend codex, or opencode with --backend opencode)| Entry Point | Description |
|---|---|
uv run python -m zulipmcp.mcp | MCP server for Claude Code, Codex, and other MCP clients |
uv run python -m zulipmcp.mcp --transport sse | MCP server over SSE (for remote/web clients) |
uv run python -m zulipmcp.launch_agent | Launch one MCP-backed coding session without a listener |
uv run python -m zulipmcp.listener | Listener: watches for @mentions, spawns agent sessions |
zulipmcp can also be imported directly as a Python library:
Hermes uses the native hermes_plugin/zulip gateway
adapter instead of the subprocess listener. Each stream/topic maps to its own
persistent Hermes session, while zulipmcp remains available as the explicit
Zulip API tool layer.
:stop_sign: interruption are handled by the adapter.See the plugin README for installation, configuration, access controls, and verification.
An existing coordinator can start one Claude Code or Codex session directly.
The coding agent uses its configured zulip MCP server to initialize the
target topic, reply there, and wait for follow-ups:
The launcher does not watch Zulip or spawn on mentions. It starts exactly one
foreground coding-agent process and reuses the bundled session instructions.
Run it as a background process when the coordinator should continue working.
By default the agent listens in renewable two-hour intervals and does not exit
merely because an interval timed out.
Use --trigger-message-id and --session-user-email when that metadata is
available. Pass --zuliprc or --mcp-config only when the agent should not use
its existing global MCP configuration. An explicit Claude MCP config is loaded
strictly so a project-local server with the same name cannot shadow it.
The optional zulipmcp.listener module watches Zulip for @mentions and spawns one headless agent session per (stream, topic). It supports Claude Code by default, Codex with --backend codex, and OpenCode with --backend opencode. It's the glue between Zulip events and the agent backend -- the MCP server handles all the Zulip tools, the listener just handles lifecycle.
Flags:
| Flag | Default | Description |
|---|---|---|
--zuliprc | ./.zuliprc | Path to .zuliprc (resolved relative to current working directory) |
--backend | claude | Agent backend to launch: claude, codex, or opencode |
--agent-command | backend name | Backend CLI binary name or path |
--mcp-config | ./.mcp.json | Path to .mcp.json for agent sessions (used only if the file exists). Codex translates supported command and url servers into one-run -c mcp_servers... overrides. OpenCode embeds the translated config in OPENCODE_CONFIG_CONTENT. |
--system-prompt | zulipmcp/default_system_prompt.md | System prompt file. Claude receives it as an appended system prompt; Codex receives it as developer instructions; OpenCode receives it via the instructions config field. |
--working-dir | . | Working directory for spawned sessions |
--log-dir | ./logs | Directory for session log files |
--codex-permission-mode | parity | Codex-only permission preset. parity uses --yolo for full bypass like the Claude default and assumes external sandboxing; workspace-write and read-only use noninteractive sandboxed modes; none adds no permission flags. |
--opencode-model | (none) | OpenCode model in provider/model format (e.g. anthropic/claude-sonnet-4-5, ollama/qwen3:235b). When omitted, OpenCode uses its own default. |
--opencode-agent | (none) | OpenCode agent name (passed as --agent). When omitted, OpenCode uses its default agent. |
-- ... | (none) | Everything after -- is forwarded to the selected backend as-is. For Codex, known top-level-only flags are placed before exec automatically. |
Each session gets TRIGGER_MESSAGE_ID and SESSION_USER_EMAIL set automatically so set_context() anchors to the @mention and hooks can identify the requester.
The listener intentionally does not set model or reasoning defaults. Backend CLIs and model aliases move over time, so use the backend's user config or pass flags after --. For reproducible production behavior, pin exact backend model IDs in your deployment config instead of relying on aliases.
Custom --system-prompt files are backend instructions, not the initial task. The listener still sends a short per-session bootstrap prompt with the target stream/topic and the Zulip lifecycle contract: initialize context, send visible text through reply(), then call listen() when yielding for follow-ups.
Codex sessions launch with web search enabled to match Claude Code's default web-fetch capability. For Codex, the .mcp.json adapter whitelists inherited environment variable names for translated stdio MCP servers, mirroring Claude-style subprocess inheritance without putting env values in argv. It also forwards Zulip's direct auto-init SESSION_STREAM/SESSION_TOPIC pair when present and sets tool_timeout_sec to at least 3 hours so the long-running listen() tool can wait for follow-ups. The adapter is intentionally conservative: Claude SSE config is rejected, only command and streamable HTTP url servers are translated, and environment placeholders are supported only in env/header values that can stay out of process argv.
OpenCode sessions receive the full config via OPENCODE_CONFIG_CONTENT (inline JSON). The .mcp.json adapter translates command-based servers to OpenCode's local type (merging command+args into a single array) and url-based servers to remote type, renaming env to environment. Each translated server gets a 3-hour MCP timeout so listen() can block for follow-ups; listen() sends MCP progress notifications during its long-poll loop, which OpenCode uses to reset its per-call timeout. The system prompt file path is passed via the instructions config field.
Factual signals from GitHub, npm, and our automated checks β not a rating.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/windborne-zulipmcp)<a href="https://allmcps.com/mcp/windborne-zulipmcp"><img src="https://allmcps.com/api/badge/windborne-zulipmcp?style=directory" alt="Zulipmcp on AllMCPs" /></a>