# Why this MCP gateway — lifting WxO Slack limitations **Author:** Markus van Kempen **Email:** [mvankempen@ca.ibm.com](mailto:mvankempen@ca.ibm.com) · [markus.van.kempen@gmail.com](mailto:markus.van.kempen@gmail.com) **Web:** [https://markusvankempen.github.io/](https://markusvankempen.github.io/) · [GitHub](https://github.com/markusvankempen) `tags:` `wxo-limitations` · `byo-slack` · `every-message` · `multi-channel` · `multi-agent` · `thread-followups` · `mcp-toolkit` · `streamable-http` · `gateway-thread` · `no-done-noise` · `poller` · `slack-events` · `code-engine` · `ngrok` · `cursor` · `vscode` · `ibm-bob` · `antigravity` · `agentic-ai` watsonx Orchestrate is excellent at **agents + tools**. Out of the box Slack (`byo_slack`) is intentionally narrow. This gateway is the **custom integration layer** that keeps WxO as the brain while removing several Slack / routing / tooling ceilings. ```mermaid flowchart TB subgraph Before["Without gateway"] B1["byo_slack ≈ @mention / DM only"] B2["Hard multi-channel → multi-agent"] B3["Toolkit needs stable public /mcp"] end subgraph After["With Slack ↔ WxO MCP Gateway"] A1["every-message wake-up via poller / Events"] A2["bindings: channel → agent"] A3["hosted streamable-http /mcp + admin UI"] end Before -->|lift| After After --> Brain["WxO remains the brain
LLMs · skills · flows"] ``` --- ## The limitation → lift map | Tag | WxO / Slack limitation (today) | What this MCP gateway does | |-----|--------------------------------|----------------------------| | `byo-slack` · `every-message` | `byo_slack` wakes agents mainly on **@mention / DM**, not every channel message | **Poller** (and optional **Events**) wakes the bound agent on each human message | | `multi-channel` · `multi-agent` | One Slack integration ≠ easy “channel A → agent A, channel B → agent B” ops model | **Bindings** in one `config.yaml` / admin UI — many channels → many agents | | `thread-followups` | In-thread follow-ups are easy to miss if you only watch top-level messages | Poller uses **thread replies** + context so “what is 2+2?” in a thread still works | | `gateway-thread` · `no-done-noise` | Agent finals / byo_slack can post noise (`done`, typing fluff) into Slack | `reply_mode: gateway_thread` + answer-only agent — **gateway posts** the answer; filters noise finals | | `mcp-toolkit` · `streamable-http` | WxO agents need a **remote MCP** URL they can trust (real DNS, stable transport) | Hosted `/mcp` with **streamable HTTP** + `stateless_http` (avoids sticky-session “Session terminated”) | | `ops-self-serve` | Changing routing often means cloning pollers or hand-editing many places | **Admin UI** + MCP tools (`list_bindings`, `upsert_binding`, diagnostics, logs) | | `ide-parity` | Slack ops stuck in Slack or WxO UI only | Same toolkit in **Cursor / VS Code / Bob / Antigravity / Claude** (stdio or remote `/mcp`) | | `hosting` · `code-engine` · `ngrok` | Localhost is invisible to WxO SSRF / Slack Events | **ngrok** for demos; **Code Engine** for always-on stable URLs | --- ## Why MCP (not only a private poller)? `tags:` `mcp` · `tool-calling` · `wxo-toolkit` · `reuse` 1. **WxO agents call the same tools** you use in the admin UI — list channels, post threads, poll once, diagnose. 2. **IDEs share the toolkit** — ops agents and developers use one contract. 3. **Remote toolkit registration** is the WxO-native way to extend agents without baking Slack SDKs into every skill. 4. **Streamable HTTP** matches how Orchestrate imports remote MCP toolkits today. ```mermaid flowchart LR subgraph Edge["Gateway"] Poll["Poller wakes agents"] Tools["MCP tools
bindings · Slack · WxO · ops"] end Poll --> WxO["WxO agents"] Tools --> WxO Tools --> IDE["Cursor / VS Code / Bob / Claude"] Tools --> UI["Admin UI"] ``` A bare channel poller can wake agents; an **MCP gateway** also makes Slack + routing **tools** for agents and IDEs. --- ## What we deliberately do *not* replace | Keep in WxO | Still use this gateway for | |-------------|----------------------------| | Agent LLMs, RAG, skills, flows | Channel wake-up without @mention | | `byo_slack` for @mention bots you already like | Multi-channel routing table | | Orchestrate auth / environments | Hosted `/mcp` toolkit + admin ops | Coexistence: @mention → `byo_slack`; every-message channels → gateway bindings. Loop guards skip bots / already-answered top-level threads. --- ## One-line pitch (for GitHub / npm) > **MCP gateway that lifts WxO Slack limits:** every-message wake-up, multi-channel→multi-agent routing, clean in-thread replies, and a streamable-http toolkit for Orchestrate + Cursor/VS Code/Bob/Antigravity — without replacing your agents. --- ## Related docs | Doc | Focus | |-----|--------| | [../SETUP.md](../SETUP.md) | Slack scopes, env, agents | | [local-ngrok/](local-ngrok/) · [code-engine/](code-engine/) | Deploy paths | | [ide/](ide/) | IDE MCP configs | | [frameworks/](frameworks/) | LangGraph, LlamaIndex, OpenAI Agents | | [../USE_CASES.md](../USE_CASES.md) | Real-world scenarios |