-
Notifications
You must be signed in to change notification settings - Fork 774
doc(zulip-mpc): add zulip-mcp team setup instructions #15616
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
92192d8
fa8a5e9
3a14e07
b3cc5ab
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,241 @@ | ||||||||||||||
| # Zulip MCP setup (macOS + Docker Desktop) | ||||||||||||||
|
|
||||||||||||||
| A Zulip MCP server for Claude Code that runs in a companion Docker container, so | ||||||||||||||
| your API key stays isolated — it lives only in the container's process env and | ||||||||||||||
| your macOS Keychain, never in Claude's conversation context or reachable by | ||||||||||||||
| Claude's own tools (when Claude runs in a different container). | ||||||||||||||
|
|
||||||||||||||
| **Know the limits.** The companion container is an isolation boundary against | ||||||||||||||
| Claude-in-a-container, **not an encryption vault**. Anyone with Docker access | ||||||||||||||
| on your Mac can trivially extract the key, e.g.: | ||||||||||||||
|
|
||||||||||||||
| ```bash | ||||||||||||||
| docker compose exec zulip-mcp env | grep ZULIP_API_KEY | ||||||||||||||
| ``` | ||||||||||||||
|
|
||||||||||||||
| That includes you, anything else you run on your host, and Claude Code if you | ||||||||||||||
| run it natively on macOS with `docker` on `PATH`. Use a dedicated bot key | ||||||||||||||
| (see Prerequisites) so rotation is cheap, and see [Security notes](#security-notes) | ||||||||||||||
| for the full threat model. | ||||||||||||||
|
|
||||||||||||||
| ## Prerequisites | ||||||||||||||
|
|
||||||||||||||
| - macOS with **Docker Desktop** installed and running | ||||||||||||||
| - **Claude Code** CLI installed (`claude --version`) | ||||||||||||||
| - A **Zulip API key**. Prefer a **dedicated bot's** key over your personal one — | ||||||||||||||
| it bounds blast radius and is easy to rotate. | ||||||||||||||
| - Bot key: Zulip → avatar → Personal settings → **Bots** → Add a new bot | ||||||||||||||
| (Generic type), then copy its API key. Subscribe the bot to only the streams | ||||||||||||||
| you want Claude to read. | ||||||||||||||
| - Personal key: Zulip → avatar → Personal settings → | ||||||||||||||
| Account & privacy → "Manage your API key". | ||||||||||||||
|
|
||||||||||||||
| ## One-time setup | ||||||||||||||
|
|
||||||||||||||
| ### 1. Clone the repo | ||||||||||||||
|
|
||||||||||||||
| ```bash | ||||||||||||||
| git clone https://github.com/VanBarbascu/zulip-mcp.git | ||||||||||||||
| cd zulip-mcp | ||||||||||||||
| ``` | ||||||||||||||
|
|
||||||||||||||
| ### 2. Store your API key in the macOS Keychain | ||||||||||||||
|
|
||||||||||||||
| ```bash | ||||||||||||||
| security add-generic-password -s zulip-mcp -a you@nearone.org -w | ||||||||||||||
|
||||||||||||||
| security add-generic-password -s zulip-mcp -a you@nearone.org -w | |
| security add-generic-password -U -s zulip-mcp -a you@nearone.org -w |
Copilot
AI
Apr 22, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The Keychain entry is created with an account (-a you@nearone.org) but retrieved without -a. If a user has multiple zulip-mcp entries under different accounts, find-generic-password -s zulip-mcp may return the wrong one. Please include the same -a ... (or otherwise disambiguate) on the read path.
| ZULIP_API_KEY="$(security find-generic-password -s zulip-mcp -w)" \ | |
| set -a | |
| source ./.env | |
| set +a | |
| ZULIP_API_KEY="$(security find-generic-password -s zulip-mcp -a "$ZULIP_EMAIL" -w)" \ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The intro claims the API key “lives only in the container's process env and your macOS Keychain”. With the provided
start.sh, the key is also present (at least briefly) in the environment of the host-sidedocker compose upprocess that reads it, so it’s not strictly limited to container env + Keychain. Please reword the sentence (or call out the brief host-process exposure) so the threat model remains accurate.