
A bot layer that turns Slack into the control plane for agents—routing intent, calling tools, and returning structured results in-channel.
Teams already work in Slack. Channel context, notifications, and low adoption friction beat forcing operators into another dashboard.
Node.js with LangChain for orchestration, Slack Bolt for events, and tool adapters over internal APIs—keeping Slack I/O out of the LLM.
When I joined the Arcade AI project, the team already had powerful agent capabilities — but they lived behind internal dashboards. Operators still copied prompts into separate tools and pasted results back into Slack. That friction killed velocity.
This post is my original write-up of how we turned Slack into the primary command surface for AI workflows: what we built, why we made specific tradeoffs, and what I learned shipping it toward production.
Arcade AI needed a way for engineers and ops to:
Slack wasn't an afterthought — it became the control plane.
Our stack split into three layers:
// Simplified intent routing pattern we used
async function handleSlackMessage(event: SlackEvent) {
const intent = await classifyIntent(event.text);
const agent = selectAgent(intent); // e.g. "research", "ops", "summarize"
const result = await agent.invoke({ input: event.text, userId: event.user });
return formatSlackBlocks(result);
}
The critical design choice: never let the LLM call Slack APIs directly. We kept Slack I/O in Bolt handlers and passed only sanitized text into LangChain. That boundary made debugging ten times easier.
We scoped conversation memory by channelId + threadTs, not globally per user. In incident channels, that meant the agent retained context for the active thread without bleeding secrets from DMs.
Free-text replies were hard to scan. We standardized on Slack Block Kit for:
When a tool timed out, we returned a visible error block instead of letting the model improvise. Users trusted the bot more once failures were honest.
The Arcade AI ecosystem publishes SDK and integration guides. This post focuses on our implementation choices on the Arcade project — Slack as command center, LangChain routing patterns, and production lessons — not a reproduction of upstream docs.
If you're building something similar, start with one slash command, one agent, and one tool. Expand only after latency and error budgets are measured.
Written by Mikey Sharma as part of hands-on work on the Arcade AI platform. For questions, reach out via mikeysharma.com/contact.