Overview
Platform-specific adapters for Slack, Teams, Google Chat, Discord, Telegram, GitHub, and Linear.
Adapters handle webhook verification, message parsing, and API calls for each platform. Install only the adapters you need.
Feature matrix
Messaging
| Feature | Slack | Teams | Google Chat | Discord | Telegram | GitHub | Linear |
|---|---|---|---|---|---|---|---|
| Post message | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Edit message | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Delete message | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| File uploads | ✅ | ✅ | ❌ | ✅ | ⚠️ Single file | ❌ | ❌ |
| Streaming | ✅ Native | ⚠️ Post+Edit | ⚠️ Post+Edit | ⚠️ Post+Edit | ⚠️ Post+Edit | ❌ | ❌ |
Rich content
| Feature | Slack | Teams | Google Chat | Discord | Telegram | GitHub | Linear |
|---|---|---|---|---|---|---|---|
| Card format | Block Kit | Adaptive Cards | Google Chat Cards | Embeds | Markdown + inline keyboard buttons | GFM Markdown | Markdown |
| Buttons | ✅ | ✅ | ✅ | ✅ | ⚠️ Inline keyboard callbacks | ❌ | ❌ |
| Link buttons | ✅ | ✅ | ✅ | ✅ | ⚠️ Inline keyboard URLs | ❌ | ❌ |
| Select menus | ✅ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Fields | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Images in cards | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| Modals | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
Conversations
| Feature | Slack | Teams | Google Chat | Discord | Telegram | GitHub | Linear |
|---|---|---|---|---|---|---|---|
| Mentions | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Add reactions | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Remove reactions | ✅ | ❌ | ✅ | ✅ | ✅ | ⚠️ | ⚠️ |
| Typing indicator | ❌ | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ |
| DMs | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Ephemeral messages | ✅ Native | ❌ | ✅ Native | ❌ | ❌ | ❌ | ❌ |
Message history
| Feature | Slack | Teams | Google Chat | Discord | Telegram | GitHub | Linear |
|---|---|---|---|---|---|---|---|
| Fetch messages | ✅ | ✅ | ✅ | ✅ | ⚠️ Cached | ✅ | ✅ |
| Fetch single message | ✅ | ❌ | ❌ | ❌ | ⚠️ Cached | ❌ | ❌ |
| Fetch thread info | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Fetch channel messages | ✅ | ✅ | ✅ | ✅ | ⚠️ Cached | ✅ | ❌ |
| List threads | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| Fetch channel info | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| Post channel message | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
⚠️ indicates partial support — the feature works with limitations. See individual adapter pages for details.
Packages
| Platform | Package |
|---|---|
| Slack | @chat-adapter/slack |
| Microsoft Teams | @chat-adapter/teams |
| Google Chat | @chat-adapter/gchat |
| Discord | @chat-adapter/discord |
| Telegram | @chat-adapter/telegram |
| GitHub | @chat-adapter/github |
| Linear | @chat-adapter/linear |
Community adapters
Beyond the Vercel-maintained adapters listed above, you can build adapters for any messaging platform. Community adapters use the same Adapter interface and get full access to Chat SDK features like cards, actions, streaming, and state management.
| Tier | Description |
|---|---|
| Vercel-maintained | Published under @chat-adapter/* by Vercel |
| Community official | Built and maintained by the platform company itself (e.g., Resend building a Resend adapter) |
| Community | Built by third-party developers |
Community adapters are expected to meet the same testing bar as first-party adapters — unit tests for all public methods, integration tests for end-to-end message flows.
Ready to build one? Follow the building guide.
How adapters work
Each adapter implements a standard interface that the Chat class uses to route events and send messages. When a webhook arrives:
- The adapter verifies the request signature
- Parses the platform-specific payload into a normalized
Message - Routes to your handlers via the
Chatclass - Converts outgoing messages from markdown/AST/cards to the platform's native format
Using multiple adapters
Register multiple adapters and your event handlers work across all of them:
import { Chat } from "chat";
import { createSlackAdapter } from "@chat-adapter/slack";
import { createTeamsAdapter } from "@chat-adapter/teams";
import { createGoogleChatAdapter } from "@chat-adapter/gchat";
import { createRedisState } from "@chat-adapter/state-redis";
const bot = new Chat({
userName: "mybot",
adapters: {
slack: createSlackAdapter(),
teams: createTeamsAdapter(),
gchat: createGoogleChatAdapter(),
},
state: createRedisState(),
});
// This handler fires for mentions on any platform
bot.onNewMention(async (thread) => {
await thread.subscribe();
await thread.post("Hello!");
});Each adapter auto-detects credentials from environment variables, so you only need to pass config when overriding defaults.
Each adapter creates a webhook handler accessible via bot.webhooks.slack, bot.webhooks.teams, etc.