
Create a new standalone Slack canvas with optional title and markdown content. Returns the canvas ID.
Write to or edit an existing Slack canvas by applying one or more change operations. Use 'insertatend' to append content, 'insertatstart' to prepend, or 'replace'/'delete' with a section_id for targeted edits.
Permanently delete a Slack canvas by ID. This action cannot be undone.
Create a canvas linked to a Slack channel. The canvas appears in the channel's canvas tab. Provide an optional markdown body for the initial content.
List channels in the workspace (public and private; direct messages are excluded by default). Returns a lean set of fields by default (id, name, isprivate, isarchived, ismember, nummembers, topic); request more via the 'fields' parameter. Paginate with cursor/page_info.
Create a new channel
Get information about a channel using Channel ID (not channel name)
Join a channel
Leave a channel
Archive a channel
Get members of a channel
Invite users to a channel
Remove a user from a channel
Set the topic for a channel
Set the purpose for a channel
Rename a channel
Get information about a file
List files in the workspace, most recent first by default. sort (created|timestamp) and sortdir (asc|desc) order the returned page only — Slack's files.list has no server-side sort, so non-default ordering is not globally consistent across pages. The uploader and channels are resolved to readable names (username, channel_names); raw IDs remain available in user and channels. Paginate with count/page.
Delete a file
Get the content of a text file
Revoke public access to a file
Upload a file or image to Slack. Provide the bytes as base64 in content, not a URL and not plain text, OR a filereference from the file upload API (POST /api/v1/files/) for files up to 100 MB, which streams in without entering the model's context. Set channelid to post it; use listchannels for channel IDs. Set alttxt for images.
Send a message to a Slack channel using Channel ID (not channel name)
Update an existing message in Slack
Delete a message from Slack
Get a permanent link to a message
Get message history from a channel using Channel ID with enhanced timestamp filtering. For time windows: use Unix timestamps (oldest='1640995200.123456', latest='1640995300.123456') OR convenient parameters (daysago=7, hoursago=24, startdate='2023-12-01', enddate='2023-12-15'). Set inclusive=True to include boundary messages.
Schedule a message to be sent later
Delete a scheduled message
Read the emoji reactions on a message: which emoji, how many people used each, and the user IDs who did. Names come back canonicalised, so a reaction added as 'thumbsup' reads back as '+1'; match on the returned name, not the one you sent. Use listchannels for the channel ID and getconversationhistory for the message timestamp. addreaction and remove_reaction are the write counterparts.
Add an emoji reaction to a message
Remove an emoji reaction from a message
Get all replies in a Slack thread. This tool MUST be called whenever you encounter a message with replycount > 0 from getconversationhistory, searchmessages, or any message-fetching tool to provide complete conversation context. When presenting results to users, always display username/displayname instead of userid for better readability.
Get all unread direct messages and group DMs with their message content. When presenting results to users, always display username/displayname instead of userid for better readability.
Get all unread messages from channels with their message content. Uses smart prioritization to check most recently active channels first. When presenting results to users, always display username/displayname instead of userid for better readability.
List scheduled messages that haven't been sent yet
Get all unread messages from a specific channel. Uses the channel's lastread timestamp to accurately identify unread messages. When presenting results to users, always display username/displayname instead of user_id for better readability.
Get all unread direct messages from a specific user. When presenting results to users, always display username/displayname instead of userid for better readability.
Send a message to a person or channel by name instead of ID. Resolves display name, real name, username, or channel name to the correct ID and sends the message. Use this when you have a person's name but not their Slack user/channel ID.
List all pinned messages and items in a channel
Pin a message to a channel
Remove a pinned message from a channel
Get complete user information including workspace role, permissions, and profile
Resolve the authenticated user ('me'/'myself') to their Slack user ID and profile. Call this first whenever a request refers to the current user (e.g. 'send me a DM', 'message myself') to get the user_id to open a DM or post to.
List users in the workspace. Returns a lean set of fields by default (id, name, realname, displayname, email, isbot, deleted); request more via the 'fields' parameter. Paginate with cursor/pageinfo. Use lookupuserbyemail or searchusers to find a specific person.
Look up a user by their email address
Get a user's presence status
Set your own presence status (auto or away)
Get conversations a user is a member of
Validate Slack credentials. Verifies credentials during setup.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}It's an MCP server that lets your agents access data and functionality from Slackbot via tools. Your agents can invoke these tools to post a message as the bot, reply in a thread, react to a message, open a direct message with a user, and more.
Slack offers an official MCP server, but it's built for user-scoped actions, not a bot user. For Slackbot's bot-scoped surface, posting and reacting as the bot itself, you can use a third-party platform instead, like Merge Agent Handler.
The use cases naturally depend on the agent you've built, but here are a few common ones:
Here are some of the most commonly used tools:
post_message: posts a message to a channel or thread under the bot's identity. It's the tool most bot workflows reach for first, whether that's an alert, a digest, or a replypost_message_by_name: posts to a channel identified by its display name instead of its ID. This saves a lookup step when the agent already knows which channel it's targetingupdate_message: edits a message the bot already sent, for example refreshing a status line after a deploy finishes. The thread stays clean instead of filling up with duplicate postsadd_reaction: adds an emoji reaction to a message. Bots use this to acknowledge a request or signal approval without writing a full replyget_conversation_replies: fetches every reply in a thread. A triage bot needs this to read the full back-and-forth before deciding what to post nextschedule_message: queues a message to post at a future time. Useful for reminders, recurring digests, or announcements timed to a specific hourHere's what sets Merge Agent Handler's Slackbot MCP server apart from building or using an alternative:
You can take the following steps:
1. Create or log into your Merge Agent Handler account.
2. Install the Merge CLI by running pipx install merge-api, then run merge configure to link the CLI to your Merge account and merge login to authenticate your session.
3. Register the Agent Handler MCP server with Claude Code by running claude mcp add --transport http agent-handler https://ah-api.merge.dev/mcp, then open Claude Code and run /mcp to confirm agent-handler appears with a connected status.
4. Select agent-handler from the MCP list. This opens a browser window where you select which integrations to authenticate. Choose Slackbot and complete the auth flow. Merge stores and manages the credentials going forward.
5. Open a Claude Code session and start querying Slackbot directly. The first time you use a Slackbot tool, a Magic Link may appear to complete connector authentication.
If you want to connect Merge Agent Handler's Slackbot MCP with internal or customer-facing agentic products, you can follow the steps in our docs.
Yes, Merge for Workforce lets your employees connect Claude, ChatGPT, Microsoft Copilot, Cursor, and other MCP-compatible AI tools to Slackbot without bypassing IT governance.
IT can provision access by role or group via SCIM. An IT support engineer, for example, gets Slackbot access to post incident updates, Jira access to open tickets, and PagerDuty access to escalate alerts, while a marketing coordinator gets Slackbot access to schedule campaign announcements, Asana access to update campaign tasks, and Google Drive access to pull creative assets.
Every tool call an employee's AI makes to Slackbot is also inspected against your DLP rules and logged to a searchable audit trail, giving security teams full visibility into what data was accessed and by whom.
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now