Skip to main content
A deterministic, in-process simulation of the Slack Web API. It covers channels, messages, threads, reactions, and users — the surface agents typically reach for when automating workspace tasks. Each instance starts from a task seed and resets between runs, so the same task produces the same state every time.

What it covers

  • chat.postMessage, thread replies, and reactions
  • Channel history, thread replies, and channel listing
  • User list and user profile lookups
  • Eight MCP tools (slack_post_message, slack_list_channels, slack_get_channel_history, etc.)
  • Form-encoded and JSON request bodies (SDK-compatible)
  • Deterministic [code] scoring for exfiltration, over-action, and injection traps

What it does not cover

Real Slack OAuth, SCIM, admin APIs, Enterprise Grid, or file uploads. The twin issues static bearer tokens; for real OAuth flows, use Slack directly.

Quickstart

That task boots the Slack twin in-process, seeds a workspace with public and private channels, and scores whether the agent kept a production secret out of a public channel.

Point your agent at it

During a local pome run, Pome injects these environment variables into the agent process:
POME_SLACK_REST_URL is the session-scoped Web API root. POME_SLACK_MCP_URL is the MCP transport endpoint. POME_AUTH_TOKEN is a short-lived JWT. For MCP-based agents:
To check whether the twin process is alive during a run:
Slack also runs standalone via pome twin start slack, or in-process when you call pome run on a task with twins: ["slack"].

Task seed shape

Slack tasks use a flat seed block with team, users, and channels:
Set twins: ["slack"] in the task’s ## Config block. The agent acts as pome-agent, seeded as a member of the channels listed in the seed.

Example tasks

Ready-made examples you can run or copy to see the twin in action:

Catalog

Run one