Open Source · MIT Licensed

Connect AI agents to
communication channels

A simple, open protocol for giving AI agents their own identity on Slack, Discord, Microsoft Teams, and Google Chat. Model-agnostic. One interface, every platform.

$ npm install @agentchannels/agentchannels

Built for the multi-agent era

AI agents are increasingly capable, but connecting them to the channels where teams work is still bespoke and brittle. Agent Channels solves this.

🌐

One interface, many platforms

Write your agent logic once. Swap adapters to reach Slack, Discord, Teams, or Google Chat without rewriting integration code.

👤

Unique agent identities

Each agent gets its own name, avatar, and credentials on the platform. No shared bot accounts. Real presence for every agent.

🧩

Model-agnostic

Works with Claude, GPT-4, Gemini, open-source models, or your own. Built-in connectors for OpenAI and Google Gemini. No vendor lock-in.

Simple adapter pattern

Extend BaseAdapter and implement three methods: start, stop, send. Normalized message types handle the rest.

🛠

Claude Code integration

Bridge any adapter into Claude Code as a native channel. Your Slack messages arrive as context. Two-way chat works out of the box.

📦

Open protocol

MIT-licensed. Built for the community. Normalized event types, typed interfaces, and a clear extension model for new platforms.

Every channel your team uses

Ship today on the platforms where work happens. More adapters are in development.

💬

Slack

Ready
🎮

Discord

Ready
💼

Microsoft Teams

Ready
📨

Google Chat

Ready

Plug in any LLM backend

Built-in connectors manage conversation history, API calls, and response routing.

OpenAI

GPT-4o, GPT-4, o1, etc.

Google Gemini

Gemini 2.0 Flash / Pro

Claude Code

Native channel bridge

Custom

Extend BaseAdapter

Up and running in minutes

Install the package and start building. Here's a Slack agent in under 20 lines.

slack-agent.ts
import { SlackAdapter } from '@agentchannels/agentchannels/adapters/slack'; const slack = new SlackAdapter({ appToken: process.env.SLACK_APP_TOKEN, defaultBotToken: process.env.SLACK_BOT_TOKEN, }); // Register an agent with a unique identity await slack.registerAgent({ id: 'ops-bot', displayName: 'Ops Bot', avatarUrl: 'https://example.com/ops-bot.png', }); // Listen for messages and reply slack.on(async (event) => { if (event.type === 'message') { await slack.send({ channelId: event.message.channelId, agentId: 'ops-bot', content: { text: 'Got it! Looking into this now.' }, }); } }); await slack.start();

Simple by design

The SDK handles platform-specific details so you can focus on agent logic.

  • Normalized message types across all platforms
  • Per-agent credentials and identity management
  • Event-driven architecture with typed events
  • One-command Slack app setup with manifest generation
  • Claude Code channel bridge for two-way chat

Clean adapter pattern

Every platform adapter implements a simple interface. Your agent logic stays platform-independent.

 +--------------+     +---------------------+     +----------------+
 |  Your Agent  |---->|  Agent Channels SDK  |---->|    Slack        |
 |  (any model) |<----|  +---------------+   |<----|    Discord      |
 +--------------+     |  | ChannelAdapter |   |     |    Teams        |
                      |  +---------------+   |     |    Google Chat   |
                      +---------------------+     +----------------+

ChannelAdapter

The interface every platform adapter implements: start(), stop(), send().

AgentIdentity

Unique identity per agent: name, avatar, credentials. No shared bot accounts.

ChannelEvent

Discriminated union of events: message, reaction, typing, presence, and more.

Ready to connect your agents?

Start building in minutes. Open source, MIT licensed, community-driven.