mcpField
S
Slack ↔ WxO MCP Gateway

Slack ↔ WxO MCP Gateway

Local
markusvankempen.github.ioCommunication0Updated 15w ago

About 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

  1. 01Wake agents on every human message
  2. 02Route multiple channels to agents
  3. 03Read thread replies and context
  4. 04Post threaded answers and filter noise
  5. 05Admin UI, diagnostics, and logs

Use cases

  1. 01Trigger WxO agents from channel messages
  2. 02Route support and operations channels to different agents
  3. 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.

mcp.json · Universal config
{
"mcpServers": {
"markusvankempen-slack-wxo-mcp-gateway": {
"command": "npx",
"args": [
"-y",
"@markusvankempen/slack-wxo-mcp-gateway"
],
"env": {
"SLACK_BOT_TOKEN": "<SLACK_BOT_TOKEN>",
"WXO_INSTANCE_URL": "<WXO_INSTANCE_URL>",
"WXO_API_KEY": "<WXO_API_KEY>",
"WXO_AGENT_ID": "<WXO_AGENT_ID>",
"GATEWAY_TRANSPORT": "<GATEWAY_TRANSPORT>",
"SLACK_SIGNING_SECRET": "<SLACK_SIGNING_SECRET>"
}
}
}
}
Run commandnpx -y @markusvankempen/slack-wxo-mcp-gateway
Environment variables to set
SLACK_BOT_TOKENSecretSlack Bot User OAuth Token (xoxb-…)
WXO_INSTANCE_URLwatsonx Orchestrate instance base URL
WXO_API_KEYSecretwatsonx Orchestrate / MCSP API key
WXO_AGENT_IDDefault WxO agent id for bindings
GATEWAY_TRANSPORTstdio (IDE) or streamable-http (hosted). Default for npx IDE use: stdio
SLACK_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.

Packages
npm@markusvankempen/slack-wxo-mcp-gateway1.0.3

Tools

No tool list yet

Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.

Details

From the project README

Slack ↔ 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 limitTagGateway lift
byo_slack ≈ @mention / DM onlyevery-messagePoller / Events wake agents on every human message
Hard to run many channels → many agentsmulti-channel multi-agentOne bindings table + admin UI
Thread follow-ups easy to dropthread-followupsReads thread replies + context
Noisy finals (done, etc.) in Slackgateway-thread no-done-noiseGateway posts answers; filters noise
Agents need remote tools with real DNSmcp-toolkit streamable-httpHosted /mcp for Orchestrate toolkits
Ops stuck cloning pollersops-self-serveMCP tools + diagnostics + logs
Slack ops only inside Slack/WxO UIide-paritySame 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 nameio.github.markusvankempen/slack-wxo-mcp-gateway
Topicsmcp · 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"]
ModeCommandUse
A Local HTTP./scripts/run.sh --mode httpUI + /mcp + poller on laptop
B Podman/Docker./scripts/run.sh --mode podmanSame app in a container
C Code Engine./scripts/run.sh --mode ceAlways-on HTTPS
D IDE MCP./scripts/run.sh --mode ideCursor / VS Code stdio snippets (+ --exec)
Ngrok demo./scripts/run.sh --mode ngrokA + 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.

GuideFocus
docs/frameworks/Index + checklist
docs/frameworks/langgraph.mdLangGraph / LangChain
docs/frameworks/llamaindex.mdLlamaIndex
docs/frameworks/openai-agents.mdOpenAI 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)

FieldMeaning
slack_channel_ide.g. C0BHWEZ7NLC
wxo.agent_idTarget Orchestrate agent
modepoll | events | both
reply_modegateway_thread = gateway posts Slack thread after Runs API; agent_tools = only start agent
poll_sec / lookback_secPoller timing

Secrets: use ${ENV_VAR} (loaded from .env).


Endpoints

PathRole
/Admin UI
/mcpMCP streamable HTTP
/slack/eventsSlack Event Subscriptions
/healthLiveness
/api/logsLog ring buffer
/api/toolsMCP tool catalog
/api/diagnosticsSlack + WxO checks
/api/pollOne poll cycle
/api/configMasked 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:

AgentRole
agent.yaml → slack_gateway_test_agentFull-toolkit smoke
agents/slack_gateway_ops_agent.yamlDay-2 ops / routing
agents/slack_gateway_answer_agent.yamlChannel 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:


License

Apache-2.0 — © Markus van Kempen
https://markusvankempen.github.io/ · https://github.com/markusvankempen

Comments

Markdown supported

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.