Slack ↔ WxO MCP Gateway

io.github.markusvankempenPublished by GitHub account markusvankempenv1.0.3Updated Oct 24, 2026

Lifts WxO Slack limits: every-message wake-up, multi-channel MCP. https://markusvankempen.github.io/

Overview

AI-generated overview

A local gateway that connects Slack channels to watsonx Orchestrate agents and exposes Slack, WxO and ops tools to MCP clients.

What you can do
Manage channel-to-agent bindings and view the current configuration table (list_bindings, upsert_binding). Read Slack channels, recent messages, thread replies and message context, and post thread replies or typing indicators. List watsonx Orchestrate agents and invoke a bound agent run. Run a poll cycle, check gateway status, read recent logs and run Slack/WxO diagnostics.
When to use it
Use it when you want Slack messages in several channels routed to different watsonx Orchestrate agents, with replies posted back in-thread, or when an IDE or agent toolkit needs MCP access to Slack and WxO operations from one host.
Requirements
Runs locally via npx (Node 18+ and Python 3.10+ per the README). Needs SLACK_BOT_TOKEN, WXO_API_KEY and WXO_INSTANCE_URL, optionally SLACK_SIGNING_SECRET for Events mode and WXO_AGENT_ID as a default agent. Slack bot scopes channels:read, groups:read and reactions:write are required. GATEWAY_TRANSPORT selects stdio or streamable-http.
Before you install
Requires Slack bot and signing secrets plus a watsonx Orchestrate API key; keep them in environment variables or a .env file. It reads Slack messages and posts replies, and can start WxO agent runs, so it writes to Slack and consumes WxO usage. The admin UI and API are protected only when GATEWAY_ADMIN_USER and GATEWAY_ADMIN_PASSWORD are set; /mcp and /slack/events stay public.

Installation

In SourceWeft

  1. Open Slack ↔ WxO MCP Gateway in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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

mermaid
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):

mermaid
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
bash
./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

bash
# Hosted HTTP + admin UI (default)npx -y @markusvankempen/slack-wxo-mcp-gateway
# IDE / stdio MCPnpx -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:

mermaid
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):

mermaid
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

bash
GATEWAY_ADMIN_USER=adminGATEWAY_ADMIN_PASSWORD=choose-a-strong-password

Protects / and /api/*. Public: /health, /mcp, /slack/events.

IBM Code Engine

bash
./deploy_code_engine.sh./test_code_engine.sh

Register the toolkit:

bash
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:

json
{  "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

Source: README.md at commit a6ed8ab

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v1.0.3LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts