Slack ↔ WxO MCP Gateway
MCP gateway that lifts watsonx Orchestrate Slack limitations — every-message wake-up, multi-channel→multi-agent routing, clean in-thread replies, and a streamable-http toolkit for WxO + Cursor / VS Code / Bob / Antigravity — without replacing your agents.
README
Slack ↔ WxO MCP Gateway
Author: Markus van Kempen
Email: mvankempen@ca.ibm.com · markus.van.kempen@gmail.com
Web: https://markusvankempen.github.io/ · GitHub
npm: @markusvankempen/slack-wxo-mcp-gateway · MCP: io.github.markusvankempen/slack-wxo-mcp-gateway
This GitHub repo is documentation + registry metadata. It does not include the runnable application source.
Install / run via npm:npx -y @markusvankempen/slack-wxo-mcp-gateway· Site: https://markusvankempen.github.io/
Pitch: MCP gateway that lifts watsonx Orchestrate Slack limitations — every-message wake-up, multi-channel→multi-agent routing, clean in-thread replies, and a streamable-http toolkit for WxO + Cursor / VS Code / Bob / Antigravity — without replacing your agents.
tags: wxo-limitations · byo-slack · every-message · multi-channel · multi-agent · thread-followups · gateway-thread · no-done-noise · mcp-toolkit · streamable-http · poller · code-engine · ngrok · agentic-ai
One config site: map many Slack channels → many WxO agents.
Poller (and optional Slack Events) wake agents.
Same host exposes an MCP toolkit (/mcp) for WxO / Cursor / other clients.
Deep dive: Why this MCP — lifting WxO limits
Architecture at a glance
flowchart LR
subgraph Slack
C1["#support"]
C2["#orders"]
C3["#ops"]
end
subgraph Gateway["Slack ↔ WxO MCP Gateway"]
Bind["config.yaml bindings"]
Poll["Poller / Events"]
MCP["/mcp streamable-http"]
UI["Admin UI /"]
end
subgraph WxO["watsonx Orchestrate"]
A1["Agent A"]
A2["Agent B"]
A3["Agent C"]
end
subgraph Clients["MCP clients"]
IDE["Cursor / VS Code / Bob / …"]
TK["WxO toolkits"]
end
C1 & C2 & C3 --> Poll
Poll --> Bind
Bind --> A1 & A2 & A3
A1 & A2 & A3 -.->|gateway_thread reply| Poll
IDE & TK --> MCP
UI --> Bind
Why this approach (WxO limits → lift)
| WxO / Slack limit | Tag | Gateway lift |
|---|---|---|
byo_slack ≈ @mention / DM only |
every-message |
Poller / Events wake agents on every human message |
| Hard to run many channels → many agents | multi-channel multi-agent |
One bindings table + admin UI |
| Thread follow-ups easy to drop | thread-followups |
Reads thread replies + context |
Noisy finals (done, etc.) in Slack |
gateway-thread no-done-noise |
Gateway posts answers; filters noise |
| Agents need remote tools with real DNS | mcp-toolkit streamable-http |
Hosted /mcp for Orchestrate toolkits |
| Ops stuck cloning pollers | ops-self-serve |
MCP tools + diagnostics + logs |
| Slack ops only inside Slack/WxO UI | ide-parity |
Same tools in Cursor, VS Code, Bob, Antigravity, Claude |
WxO stays the brain (LLMs, skills, flows). This gateway is the Slack + routing + MCP edge.
Bring-your-own agent frameworks: docs/frameworks/ (LangGraph, LlamaIndex, OpenAI Agents).
npm / MCP identity
| npm | @markusvankempen/slack-wxo-mcp-gateway |
| MCP name | io.github.markusvankempen/slack-wxo-mcp-gateway |
| Topics | mcp · mcp-server · slack · watsonx · watsonx-orchestrate · ibm · wxo · byo-slack · multi-channel · code-engine · streamable-http · cursor · agentic-ai |
Full keyword list lives in package.json for npm discoverability.
Publish & run modes (A–D)
One package / one image — pick a mode (see docs/PUBLISH-MODES.md):
flowchart TB
PKG["npm @markusvankempen/slack-wxo-mcp-gateway<br/>+ optional container image"]
PKG --> A["A Local HTTP<br/>:3100 UI + /mcp + poller"]
PKG --> B["B Podman / Docker<br/>:8080"]
PKG --> C["C Code Engine<br/>HTTPS always-on"]
PKG --> D["D IDE stdio<br/>Cursor / VS Code / Bob"]
A --> N["ngrok demo tunnel"]
A & B & C --> R["Remote /mcp clients"]
D --> L["Local MCP session"]
| Mode | Command | Use |
|---|---|---|
| A Local HTTP | ./scripts/run.sh --mode http |
UI + /mcp + poller on laptop |
| B Podman/Docker | ./scripts/run.sh --mode podman |
Same app in a container |
| C Code Engine | ./scripts/run.sh --mode ce |
Always-on HTTPS |
| D IDE MCP | ./scripts/run.sh --mode ide |
Cursor / VS Code stdio snippets (+ --exec) |
| Ngrok demo | ./scripts/run.sh --mode ngrok |
A + tunnel + WxO toolkit |
./scripts/run.sh --mode ide # print Cursor + VS Code mcp.json
./scripts/run.sh --mode http # local host :3100
./scripts/run.sh --mode podman # container :8080
./scripts/run.sh --mode ce # IBM Code Engine
Deep guides: docs/local-ngrok/ · docs/code-engine/ · docs/ide/
Index: docs/README.md · Setup: SETUP.md
Copy-paste IDE JSON: examples/mcp/
Agent frameworks (LangGraph · LlamaIndex · OpenAI Agents)
Connect frameworks to this MCP — do not embed them in the gateway.
| Guide | Focus |
|---|---|
docs/frameworks/ |
Index + checklist |
docs/frameworks/langgraph.md |
LangGraph / LangChain |
docs/frameworks/llamaindex.md |
LlamaIndex |
docs/frameworks/openai-agents.md |
OpenAI Agents SDK |
Install (npm / npx) — not from this repo
# Hosted HTTP + admin UI (default)
npx -y @markusvankempen/slack-wxo-mcp-gateway
# IDE / stdio MCP
npx -y @markusvankempen/slack-wxo-mcp-gateway --stdio
Requires Node 18+ and Python 3.10+. Env template: .env.example. Guides: local-ngrok · code-engine.
Mental model
Multi-channel routing:
flowchart LR
S1["#support"] --> G["Gateway bindings"]
S2["#orders"] --> G
S3["#ops"] --> G
G --> WA["WxO agent A"]
G --> WB["WxO agent B"]
G --> WC["WxO agent C"]
Message path (reply_mode: gateway_thread):
sequenceDiagram
participant U as Slack user
participant Ch as Channel / thread
participant GW as Gateway poller
participant Wx as WxO Runs API
participant Bot as Slack bot reply
U->>Ch: Human message
GW->>Ch: Read new messages / replies
GW->>Wx: Start bound agent run
Wx-->>GW: Agent answer text
GW->>Bot: chat.postMessage in thread
Bot-->>Ch: Clean reply (no done noise)
Same host also serves MCP at /mcp and the admin UI at /.
Config (config.yaml)
| Field | Meaning |
|---|---|
slack_channel_id |
e.g. C0BHWEZ7NLC |
wxo.agent_id |
Target Orchestrate agent |
mode |
poll | events | both |
reply_mode |
gateway_thread = gateway posts Slack thread after Runs API; agent_tools = only start agent |
poll_sec / lookback_sec |
Poller timing |
Secrets: use ${ENV_VAR} (loaded from .env).
Endpoints
| Path | Role |
|---|---|
/ |
Admin UI |
/mcp |
MCP streamable HTTP |
/slack/events |
Slack Event Subscriptions |
/health |
Liveness |
/api/logs |
Log ring buffer |
/api/tools |
MCP tool catalog |
/api/diagnostics |
Slack + WxO checks |
/api/poll |
One poll cycle |
/api/config |
Masked JSON / raw YAML |
Admin dashboard auth
GATEWAY_ADMIN_USER=admin
GATEWAY_ADMIN_PASSWORD=choose-a-strong-password
Protects / and /api/*. Public: /health, /mcp, /slack/events.
IBM Code Engine
./deploy_code_engine.sh
./test_code_engine.sh
Register the toolkit:
orchestrate toolkits add -k mcp -n slack_wxo_gateway \
--url "https://YOUR-HOST/mcp" \
--transport streamable_http \
--tools "*"
MCP tools (14)
Config: list_bindings, upsert_binding
Slack: list_slack_channels, list_recent_messages, list_thread_replies, get_message_context, post_thread_reply, set_typing_indicator
WxO: list_wxo_agents, invoke_wxo_agent
Ops: poll_once, get_gateway_status, get_recent_logs, run_diagnostics_tool
Bot scopes: channels:read, groups:read, reactions:write (reinstall Slack app after adding).
Agents:
| Agent | Role |
|---|---|
agent.yaml → slack_gateway_test_agent |
Full-toolkit smoke |
agents/slack_gateway_ops_agent.yaml |
Day-2 ops / routing |
agents/slack_gateway_answer_agent.yaml |
Channel answers (gateway_thread) |
Setup (Slack + WxO): SETUP.md — also live in admin UI → Setup
Use cases + test plan: USE_CASES.md
Publish (npm / GitHub): PUBLISH.md
Reply modes
gateway_thread (default) — poller/Events → Runs API → gateway chat.postMessage in thread. Use the answer-only agent (no done).
agent_tools — gateway only starts the agent; agent uses its own Slack tools.
Cursor / VS Code / Bob / Antigravity / Claude
See docs/ide/ for each client. Quick remote bridge:
{
"mcpServers": {
"slack-wxo-gateway": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://YOUR-HOST/mcp"]
}
}
}
Package identity:
- npm:
@markusvankempen/slack-wxo-mcp-gateway - MCP:
io.github.markusvankempen/slack-wxo-mcp-gateway - Site: https://markusvankempen.github.io/
License
Apache-2.0 — © Markus van Kempen
https://markusvankempen.github.io/ · https://github.com/markusvankempen
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。