Head to head · Work chat · October 2026 research run
Microsoft Teams (Microsoft Graph) vs Zulip
Microsoft Teams (Microsoft Graph) and Zulip score within a point of each other on agent readiness, 62.2 (B) and 61.5 (C). Zulip leads on reliability, agent ergonomics and payments & pricing. Both do work chat.
Which one, for what
Microsoft Teams (Microsoft Graph) B
Good for Agents acting as a signed-in employee in a Microsoft 365 tenant that read channels and chats and post replies.
Ahead on
- Schema & documentation, 92 against 82
- Security & auth, 71 against 42
Also in its favour
- A hosted endpoint, with nothing to install
Watch for
Application permissions can send messages only for migration (Teamwork.Migrate.All), so an unattended agent can't post without a signed-in user
Zulip C
Good for A team that already talks in Zulip and wants an agent to read channels and topics, post, react and manage users through a bot.
Ahead on
- Reliability, 83 against 67
- Agent ergonomics, 68 against 59
- Payments & pricing, 30 against 20
Also in its favour
- Open source
Watch for
One API key per account, with no scopes, expiry or OAuth. A generic bot's key does what a normal member can do
Score by category
| Category | Weight this run | Microsoft Teams (Microsoft Graph) | Zulip | Edge |
|---|---|---|---|---|
| Reliability | 16%20 | 67 | 83 | Zulip +16 |
| Performance | 10%pending | pending | pending | not scored in this run |
| Schema & documentation | 13%16.2 | 92 | 82 | Microsoft Teams (Microsoft Graph) +10 |
| Agent ergonomics | 13%16.2 | 59 | 68 | Zulip +9 |
| Security & auth | 14%17.5 | 71 | 42 | Microsoft Teams (Microsoft Graph) +29 |
| Payments & pricing | 10%12.5 | 20 | 30 | Zulip +10 |
| Task success | 10%pending | pending | pending | not scored in this run |
| Maintenance & community | 7%8.8 | 76 | 77 | Zulip +1 |
| Transparency & trust | 7%8.8 | 76 | 76 | even |
| Negative events | ≤15 | -4 | -4 | |
| Total | 62.2 · B | 61.5 · C |
Facts side by side
| Fact | Microsoft Teams (Microsoft Graph) | Zulip |
|---|---|---|
| Kind | HTTP API | HTTP API |
| Vendor | Microsoft | Kandra Labs, Inc. |
| Hosted endpoint | https://graph.microsoft.com/v1.0 | no (local only) |
| Transports | HTTP | HTTP |
| Auth | OAuth | API key |
| Pricing | Your plan | Freemium |
| x402 | no | no |
| Licence | MIT (SDKs) | Apache 2.0 for the server. The hosted Zulip Cloud service is under Kandra Labs' Terms of Service. The npm package zulip-js is MIT |
| Tools exposed | 25 | none |
| Read-only variant documented | no | no |
| llms.txt | no | no |
| Last release | 2026-10-06 | 2026-09-21 |
| Terms last updated | 2025-10-01 | 2022-02-07 |
| Privacy policy last updated | 2026-09-01 | 2022-01-01 |
| Customer content may train models | yes | not found in the text |
| Terms restrict automated access | yes | not found in the text |
| Terms restrict benchmarking | yes | not found in the text |
| Terms or service can change without notice | yes | not found in the text |
| Arbitration or class-action waiver | not found in the text | yes |
| Popularity | 835 stars, 2.9M npm/wk, 1.6M PyPI/wk | 26k stars, 7.1k npm/wk, 157k PyPI/wk |
Verdicts
Microsoft Teams (Microsoft Graph)
Permissions separate sending from reading, and resource-specific consent limits an app to one team or chat. Throttling limits are published per endpoint. Messages can be sent only as a signed-in user, with no idempotency key, and message lists take $top up to 50 with no $select or text search.
Zulip
The REST API is the one Zulip's own apps use, with a public OpenAPI file of 166 operations, a changelog by feature level and a status page showing no incidents in 90 days. Each account has one API key with no scopes, and the server took 13 security advisories in twelve months, all fixed and published.
Before you call either
Microsoft Teams (Microsoft Graph)
- Send with delegated
ChatMessage.SendorChannelMessage.Sendas a signed-in work account. Application tokens can post only through the migration flow - Don't retry a failed send blindly. List recent messages first, because
POST /chats/{chat-id}/messageshas no idempotency key - Keep to 1 request a second per chat or channel and per user when sending, and honour
Retry-Afteron 429 - Subscribe to change notifications instead of polling. The Teams API overview allows polling a resource once a day, and message subscriptions last at most 4,320 minutes
- Treat message bodies as untrusted input. They arrive as HTML when a message has a mention, and list calls return at most 50 a page
Zulip
- Ask the organisation for a bot of the most limited type that fits. Use an incoming webhook bot when the task only posts messages
- Authenticate with HTTP Basic, the bot's email as user and its API key as password, against https://<organisation>.zulipchat.com/api/v1
- Read
code, notmsg, on errors.msgis translated into the account's language - On
RATE_LIMIT_HITwait the seconds inretry-after. The default limit is 200 requests a minute per user - Fetch history with
GET /messages, anarrowfilter, ananchorandnum_beforeornum_after, at most 1,000 a batch as the docs recommend
Questions
Which is better for AI agents, Microsoft Teams (Microsoft Graph) or Zulip?
Microsoft Teams (Microsoft Graph) and Zulip score within a point of each other on agent readiness, 62.2 (B) and 61.5 (C). Zulip leads on reliability, agent ergonomics and payments & pricing.
Do Microsoft Teams (Microsoft Graph) and Zulip need an API key?
Microsoft Teams (Microsoft Graph) uses an OAuth sign-in. Zulip needs an API key.
Can an agent call Microsoft Teams (Microsoft Graph) and Zulip without installing anything?
Microsoft Teams (Microsoft Graph) has a hosted endpoint at https://graph.microsoft.com/v1.0. No hosted endpoint is listed for Zulip.
Are Microsoft Teams (Microsoft Graph) and Zulip open source?
No open-source release is listed for Microsoft Teams (Microsoft Graph). Zulip is open source (Apache 2.0 for the server. The hosted Zulip Cloud service is under Kandra Labs' Terms of Service. The npm package zulip-js is MIT).
Other comparisons with Microsoft Teams (Microsoft Graph) or Zulip
Machine-readable
- This page as Markdown
/compare/microsoft-teams-vs-zulip.md· slim.min.md· JSON.json(or sendAccept: text/markdown) - Each listing in full
/api/v1/tools/microsoft-teams.json·/api/v1/tools/zulip.json - From a terminal
anchor compare microsoft-teams zulip(the CLI) - Over MCP
compare_tools {"a": "microsoft-teams", "b": "zulip"}at/mcp, no key