zulip (windborne/zulipmcp) is an MCP server listed on the M8ven Trust Index. It scores 56 out of 100, grade D. It declares 27 tools. No publisher has claimed this listing.
Run AI agents in Zulip as @mentionable bots — or wire into any MCP client.
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
windborne
Source: Glama
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
set_contextInitialize the session context for a conversation. Call this once at the start of a session to set where you're chatting.
replyReply in the current session context.
listenWait for new messages in the current conversation (blocking).
end_sessionEnd the current session gracefully. Writes a clean exit marker so the listener knows this was intentional.
list_streamsList all available Zulip streams/channels (public and private).
get_stream_topicsGet recent topics in a stream.
get_stream_membersGet the members of a stream/channel.
get_messagesGet messages from a stream/topic, or fetch context around a message ID.
get_message_by_idGet a specific message by its ID.
get_message_linkGet a permalink for a Zulip message.
verify_messageSecurely fetch a single message to verify its true sender and content.
send_messageSend a message to a specific stream and topic (fire-and-forget).
send_direct_messageSend a direct message (DM) to one or more users.
add_reactionAdd an emoji reaction to a message.
remove_reactionRemove an emoji reaction from a message.
edit_messageEdit a message the bot previously sent.
move_messagesMove message(s) to a different topic and/or stream.
resolve_topicRename a topic silently to mark it resolved or unresolved.
list_emojiSearch custom emoji available on this Zulip server.
typingSend a typing indicator in the current conversation. Call this before heavy tool work (code execution, searches, analysis) to let users know you're working. Do NOT call before reply() or listen() — only before stretches of work where you won't be posting for a while. Typing indicator auto-clears whe…
stop_typingStop the typing indicator in the current conversation. Call this when you've finished working but aren't about to send a message (e.g. before listen(), or if you decided not to reply after all). Note: sending a message (reply/send_message) implicitly clears typing on the client side, so you don't ne…
get_user_infoGet information about a Zulip user, including their full profile.
resolve_nameLook up a user's display name by substring before mentioning them.
get_subscribed_streamsGet streams the bot is subscribed to.
fetch_imageFetch an image from Zulip and save it to a temp file for viewing.
fetch_fileFetch any file from Zulip and save it locally.
upload_fileUpload a local file to Zulip and return markdown to embed it in messages.
ZULIPMCP_CACHE_DIROverride the disk cache directory (defaults to system temp dir).ZULIP_MAX_MESSAGE_LENGTHChar limit above which send tools return an error instead of letting Zulip silently truncate. Defaults to 10000 (Zulip's default); set for realms with a custom cap.ZULIP_RC_PATHAbsolute path to .zuliprc for direct MCP server use. Listener mode sets this for spawned sessions from --zuliprc; it does not read ambient ZULIP_RC_PATH as its own default.ZULIPMCP_LOG_DIROverride the log directory (defaults to /tmp/zulipmcp_logs).SESSION_USER_EMAILEach session gets TRIGGER_MESSAGE_ID and set automatically so set_context() anchors to the @mention and hooks can identify the requester.TRIGGER_MESSAGE_IDEach session gets and SESSION_USER_EMAIL set automatically so set_context() anchors to the @mention and hooks can identify the requester.WORKSPACE_PATHSESSION_STREAMSESSION_TOPIC Topic for auto-init. Requires .SESSION_TOPICTopic for auto-init. Requires SESSION_STREAM.Tool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
27/27 tools missing one or more hints — set_context (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); reply (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); listen (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +24 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Destructive tools are labelled
1 tool perform destructive updates without destructiveHint — listen deletes at line 563 (_interrupt_path.unlink(missing_ok=True))
Add destructiveHint:true to any tool whose handler calls .delete(), .upsert(), .update(), unlink, rm, DELETE, DROP, REPLACE INTO, or any operation that overwrites existing data.
Tool inputs are validated
24/27 tool handlers declare input schemas (89%)
Declare an inputSchema with zod/joi/yup on every tool definition.
Tool handlers catch errors
Only 8/27 tool handlers wrap calls in try/catch (30%)
Wrap each tool handler body in try/catch and return a structured error response.
Tests exist
No test files found
Add tests that exercise each declared tool.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/windborne/zulipmcp)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check