Slack ↔ WxO MCP Gateway
LocalAbout Slack ↔ WxO MCP Gateway
Slack ↔ WxO MCP Gateway routes Slack messages to Watson Orchestrate agents and provides an MCP toolkit for operations and other clients. It supports message-triggered wake-ups, channel-to-agent bindings, and threaded replies.
Key features
- 01Wake agents on every human message
- 02Route multiple channels to agents
- 03Read thread replies and context
- 04Post threaded answers and filter noise
- 05Admin UI, diagnostics, and logs
Use cases
- 01Trigger WxO agents from channel messages
- 02Route support and operations channels to different agents
- 03Inspect gateway health and routing configuration
MCP support
Exposes a Streamable HTTP MCP toolkit at `/mcp` with Slack, WxO, routing, polling, status, logs, and diagnostics tools. MCP clients including WxO and IDE clients can connect to it.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @markusvankempen/slack-wxo-mcp-gatewaySLACK_BOT_TOKENSecretSlack Bot User OAuth Token (xoxb-…)WXO_INSTANCE_URLwatsonx Orchestrate instance base URLWXO_API_KEYSecretwatsonx Orchestrate / MCSP API keyWXO_AGENT_IDDefault WxO agent id for bindingsGATEWAY_TRANSPORTstdio (IDE) or streamable-http (hosted). Default for npx IDE use: stdioSLACK_SIGNING_SECRETSecretSlack signing secret (Events mode)Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMESlack ↔ WxO MCP Gateway
Author: Markus van Kempen
Email: [email protected] · [email protected]
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
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.