Simulators
Slack simulator
slack-twin runs a stateful Slack Web API on your machine. Create channels, read threads and post replies against a seeded workspace. Test traffic stays local; no real Slack workspace or token is needed.
| Your setup | Start here |
|---|---|
| An agent using Slack MCP in Harbor | Slack MCP in Harbor — image access, task files, connection, grading and reset |
| A bot or application using the Slack Web API | HTTP quickstart below |
The HTTP API and MCP tool subset have different coverage. Read the supported MCP tools before choosing a task.
HTTP quickstart
Use the license file Rystic supplied with slack-twin access. Installation covers activation and troubleshooting.
curl -fsSL https://www.rystic.ai/install.sh | sh
rystic login ./rystic-license.json
rystic run slack-twin -d --name slack --port 8080 --scenario refund_desk
curl -fsS http://localhost:8080/_rystic/version
Expect product to be slack-twin and version to be 0.0.6. The refund_desk world includes a bot, people, channel memberships and existing threads.
Read a channel using a synthetic bot token:
curl -fsS 'http://localhost:8080/api/conversations.history?channel=CRYSOPS0001&limit=10' \
-H 'Authorization: Bearer xoxb-local'
Expect ok: true and a messages array. Slack API errors usually have HTTP status 200 and ok: false; inspect the body as well as the HTTP status.
Point an existing SDK at the local API prefix:
from slack_sdk import WebClient
client = WebClient(token="xoxb-local", base_url="http://localhost:8080/api/")
result = client.conversations_history(channel="CRYSOPS0001", limit=10)
const { WebClient } = require("@slack/web-api");
const client = new WebClient("xoxb-local", {
slackApiUrl: "http://localhost:8080/api/",
});
Stop this instance with rystic stop slack.
MCP support
The Harbor integration runs the unmodified korotovsky Slack MCP server 1.3.0 against the twin. Bootstrap supplies its synthetic bot credential and local routing.
| Tool | Supported use |
|---|---|
channels_list | Find public channels |
conversations_history | Read channel history |
conversations_replies | Read a thread |
conversations_add_message | Post a reply and read it back |
Use numeric limits for history and replies. The native server evaluates relative time strings against its own wall clock, so they are outside the static-world contract.
The measured platform is Linux amd64. The upstream server uses stdio; a local Streamable HTTP gateway lets a client inside the sandbox connect to it. Hosted Slack MCP, OAuth, search, uploads, reactions, browser credentials and MCP resources are outside this tool contract.
Follow the Harbor guide for the image and lifecycle. Starting the HTTP binary alone does not configure this MCP connection. The website’s /mcp endpoint searches Rystic documentation; the sandbox’s /mcp endpoint serves Slack tools.
Seeded workspaces
| Scenario | Workspace contents |
|---|---|
refund_desk | Refund requests, status questions and a pinned handbook in CRYSOPS0001 |
ops_channel | Operations chatter and status questions in CRYSOPS0002 |
refund_desk_xl | A larger refund desk in CRYSOPS0003, used by the Harbor held-out task |
Each world includes the memberships needed to read its channels. The bot is UBOTOPS0001. The Harbor sample also boots Stripe’s busy_account world, so its license must cover both products.
For a standalone HTTP instance, reset to a named scenario:
curl -fsS -X POST http://localhost:8080/_rystic/scenario \
-H 'Content-Type: application/json' -d '{"name":"refund_desk"}'
Expect HTTP 204. For MCP episodes, use Harbor’s full reset so process state, caches and sessions are replaced too.
HTTP coverage and limits
The HTTP surface covers conversations, messages, users, reactions, pins, bookmarks, external file-upload records, views, authentication and team metadata. The four MCP tools above expose a smaller part of that surface. API availability is not a claim that every Slack behavior has been measured; see how fidelity is measured.
- Use bot-shaped
xoxb-credentials. User-token behavior and browser sessions are outside the supported dialect. - Events API, Socket Mode and interactive callbacks are not delivered. Scheduled-message records do not cause messages to appear later by themselves.
- Run one isolated workspace per episode. Concurrent episodes need separate containers and mutable state.
Release notes
v0.0.6 — 2026-09-21
This release includes the packaged native MCP server, gateway, selected-tool profile and workflow checker. Its protected control plane lets a trusted Harbor runner own setup, grading and reset while the agent uses the public API and MCP tools. Thread writes maintain parent metadata, cursor reads preserve repeated parents, and the pinned caller’s Markdown fallback follows the measured workflow.
The Harbor support contract pins the complete measured combination separately from the latest standalone simulator version.
v0.0.3 — 2026-09-19
Adds refund_desk_xl, a larger seeded workspace with seventeen open requests, existing replies and payment references into Stripe’s busy_account world. The two earlier scenarios keep their existing messages and IDs.
v0.0.2 — 2026-09-18
Adds the built-in refund_desk and ops_channel worlds, with the bot already a member of their channels. Channel history returns top-level messages; thread replies are read through conversations.replies.
v0.0.1 — 2026-09-17
Initial Slack Web API simulator with bot authentication, stateful API methods, seeding and deterministic controls.