@mcp-s/connectors 0.0.20261022190708 → 0.0.20261024071613
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/public/connectors/asana.json +1 -1
- package/dist/public/connectors/azure-devops.json +1 -1
- package/dist/public/connectors/bitbucket-datacenter.json +1 -1
- package/dist/public/connectors/bitbucket.json +1 -1
- package/dist/public/connectors/github.json +1 -1
- package/dist/public/connectors/gmail.json +1 -1
- package/dist/public/connectors/google-calendar.json +1 -1
- package/dist/public/connectors/google-workspace-admin.json +1 -1
- package/dist/public/connectors/google-workspace.json +1 -1
- package/dist/public/connectors/jira-server.json +1 -1
- package/dist/public/connectors/jira.json +1 -1
- package/dist/public/connectors/linear.json +1 -1
- package/dist/public/connectors/linkedin.json +1 -1
- package/dist/public/connectors/monday.json +1 -1
- package/dist/public/connectors/okta.json +1 -1
- package/dist/public/connectors/onedrive.json +1 -1
- package/dist/public/connectors/outlook-calendar.json +1 -1
- package/dist/public/connectors/outlook-mail.json +1 -1
- package/dist/public/connectors/salesforce.json +1 -1
- package/dist/public/connectors/sharepoint.json +1 -1
- package/dist/public/connectors/slack.json +1 -1
- package/dist/public/connectors/zendesk.json +1 -1
- package/dist/public/connectors/zoom.json +1 -1
- package/dist/public/index.json +24 -24
- package/dist/schema/auth.d.ts +27 -0
- package/dist/schema/auth.js +15 -0
- package/dist/schema/catalog.d.ts +12 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"slack","status":"active","internal_status":"tool-works","applications":["slack"],"definition":{"display":{"name":"Slack","description":"Slack is a team communication tool that allows you to chat, share files, and collaborate with your team.","icon":"slack.svg","website":"https://slack.com","category":"communication-messaging","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/slack"},"api":{"base_url":"https://slack.com/api"},"auth":{"methods":{"apiKey":{"authorizationMapping":"\"Bearer \"&token"},"oauth":{"authUrl":"https://slack.com/oauth/v2/authorize","tokenUrl":"https://slack.com/api/oauth.v2.access","scopes":["identify","bot","commands","chat:write","chat:write.customize","chat:write.public","chat:write:user","chat:write:bot","app_mentions:read","client","connections:write","channels:read","channels:write","channels:history","channels:manage","groups:read","groups:write","im:read","im:write","mpim:read","mpim:write","conversations.connect:read","conversations.connect:manage","files:read","files:write","remote_files:read","remote_files:write","remote_files:share","reactions:read","reactions:write","pins:read","pins:write","bookmarks:read","bookmarks:write","reminders:read","reminders:write","canvases:read","canvases:write","lists:read","lists:write","search:read","search:read.public","search:read.private","search:read.im","search:read.mpim","search:read.files","search:read.users","users:read","users:read.email","users.profile:read","users.profile:write","usergroups:read","usergroups:write","admin.analytics:read","admin.apps:read","admin.apps:write","admin.conversations:read","admin.conversations:write","admin.users:read","admin.users:write","admin.roles:read","admin.roles:write","admin.teams:read","admin.teams:write","admin.usergroups:read","admin.usergroups:write","admin.workflows:read","admin.workflows:write","auditlogs:read","app_configurations:read","app_configurations:write","authorizations:read","groups:history","im:history","incoming-webhook","mpim:history"],"defaultScopes":["channels:history","channels:read","channels:write","groups:history","groups:read","groups:write","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","chat:write","reactions:write","pins:read","pins:write","bookmarks:read","bookmarks:write","reminders:read","reminders:write","canvases:read","canvases:write","lists:read","lists:write","files:read","files:write","team:read","usergroups:read","usergroups:write","users:read","users:read.email","users.profile:read","users.profile:write","search:read","search:read.public","search:read.private","search:read.im","search:read.mpim","search:read.files","search:read.users"],"codeExchangeConfig":{"modelCredentialsMapping":"{\"access_token\": authed_user.access_token, \"scope\": authed_user.scope}","externalIdMapping":"exchangeCodeData.authed_user.id","isForm":true}}}},"conditions":[{"id":"block-channels","name":"Block specific channels","description":"Block reading messages from a configurable list of Slack channel ids. Useful for keeping sensitive or private channels out of reach of the model.","mapping":"arguments.channel_id in variables.blockedChannelIds","message":"Access to this Slack channel is restricted by an organization condition.","variables":[{"key":"blockedChannelIds","label":"Blocked channels","description":"This tool won't be able to read messages from the channels you select.","type":"string[]","required":true,"placeholder":"C0123456789, C0987654321","options":{"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"response.channels.{ \"value\": id, \"label\": \"#\" & name }","searchable":true}}],"appliesTo":["get_channel_history","get_thread_replies"]},{"id":"block-channels-by-name","name":"Block channels by name","description":"Block reading messages from channels whose name matches a pattern. Patterns support the `*` wildcard, so `*sensitive*` blocks any channel containing the word \"sensitive\" and `*public*` blocks any channel containing \"public\". Matching is case-insensitive.","action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"$matchesAnyGlob(response.channels[id = $$.arguments.channel_id].name, variables.blockedNamePatterns)","message":"Access to this Slack channel is restricted by an organization condition.","variables":[{"key":"blockedNamePatterns","label":"Blocked channel name patterns","description":"Channels whose name matches any of these patterns won't be readable. Use `*` as a wildcard, e.g. `*sensitive*`, `exec-*`, `*-private`.","type":"string[]","required":true,"placeholder":"*sensitive*, *public*, exec-*"}],"appliesTo":["get_channel_history","get_thread_replies"]},{"id":"only-channels-by-name","name":"Only allow channels by name","description":"Only allow reading messages from channels whose name matches a pattern; every other channel is blocked. Patterns support the `*` wildcard (e.g. `team-*`, `*public*`). Matching is case-insensitive.","action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"$not($matchesAnyGlob(response.channels[id = $$.arguments.channel_id].name, variables.allowedNamePatterns))","message":"This Slack channel is not in the list of channels allowed by an organization condition.","variables":[{"key":"allowedNamePatterns","label":"Allowed channel name patterns","description":"Only channels whose name matches one of these patterns will be readable. Use `*` as a wildcard, e.g. `team-*`, `*public*`.","type":"string[]","required":true,"placeholder":"team-*, *public*"}],"appliesTo":["get_channel_history","get_thread_replies"]},{"id":"webhook-only-channels","name":"Only for specific channels","description":"Run this workflow only for events in the Slack channels you select.","surface":"webhook","mapping":"body.event.channel in variables.channelIds","variables":[{"key":"channelIds","label":"Channels","description":"Only events from the channels you select will trigger this workflow.","type":"string[]","required":true,"placeholder":"C0123456789, C0987654321","options":{"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"response.channels.{ \"value\": id, \"label\": \"#\" & name }","searchable":true}}]},{"id":"webhook-ignore-channels","name":"Ignore specific channels","description":"Skip this workflow for events in the Slack channels you select.","surface":"webhook","mapping":"$not(body.event.channel in variables.channelIds)","variables":[{"key":"channelIds","label":"Ignored channels","description":"Events from the channels you select will not trigger this workflow.","type":"string[]","required":true,"placeholder":"C0123456789, C0987654321","options":{"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"response.channels.{ \"value\": id, \"label\": \"#\" & name }","searchable":true}}]},{"id":"webhook-only-users","name":"Only for specific users","description":"Run this workflow only for events triggered by the Slack users you select.","surface":"webhook","mapping":"body.event.user in variables.userIds","variables":[{"key":"userIds","label":"Users","description":"Only events triggered by the users you select will run this workflow.","type":"string[]","required":true,"placeholder":"U0123456789, U0987654321","options":{"action":{"path":"/users.list","method":"GET","mapping":{"query":"{ \"limit\": \"1000\" }"}},"mapping":"response.members[deleted = false and is_bot = false].{ \"value\": id, \"label\": (profile.real_name ? profile.real_name : name) & \" (@\" & name & \")\" }","searchable":true}}]},{"id":"webhook-ignore-users","name":"Ignore specific users","description":"Skip this workflow for events triggered by the Slack users you select — useful for ignoring bots.","surface":"webhook","mapping":"$not(body.event.user in variables.userIds)","variables":[{"key":"userIds","label":"Ignored users","description":"Events triggered by the users you select will not run this workflow.","type":"string[]","required":true,"placeholder":"U0123456789, U0987654321","options":{"action":{"path":"/users.list","method":"GET","mapping":{"query":"{ \"limit\": \"1000\" }"}},"mapping":"response.members[deleted = false and is_bot = false].{ \"value\": id, \"label\": (profile.real_name ? profile.real_name : name) & \" (@\" & name & \")\" }","searchable":true}}]}],"tools":[{"name":"List Channels","description":"List public channels in the workspace with pagination","slug":"list_channels","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists public channels in the workspace and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Maximum number of channels to return (default 100, max 200)","default":100},"cursor":{"type":"string","description":"Pagination cursor for next page of results"}}},"enabled":true,"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{\n \"exclude_archived\": \"true\", \n \"limit\": $number(arguments.limit) ? $string($min(arguments.limit, 200)) : \"100\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }"}}},{"name":"Post Message","description":"Post a new message to a Slack channel","slug":"post_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool posts a new message to a channel, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to post to"},"text":{"type":"string","description":"The message text to post"},"blocks":{"type":"array","description":"Array of Block Kit blocks for rich formatting (tables, buttons, etc.)","items":{"type":"object"}},"unfurl_links":{"type":"boolean","description":"Whether to unfurl links in the message (default true)"},"unfurl_media":{"type":"boolean","description":"Whether to unfurl media in the message (default true)"}},"required":["channel_id","text"]},"enabled":true,"action":{"path":"/chat.postMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"text\": arguments.text,\n \"blocks\": arguments.blocks ? arguments.blocks : undefined,\n \"unfurl_links\": $exists(arguments.unfurl_links) ? arguments.unfurl_links : undefined,\n \"unfurl_media\": $exists(arguments.unfurl_media) ? arguments.unfurl_media : undefined\n }"}}},{"name":"Get Channel History","description":"Get recent messages from a channel","slug":"get_channel_history","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves recent messages from a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"limit":{"type":"number","description":"Number of messages to retrieve (default 10, max 999)","default":10},"cursor":{"type":"string","description":"Pagination cursor for next page of results"},"oldest":{"type":"string","description":"Only messages after this Unix timestamp will be included in results"},"latest":{"type":"string","description":"Only messages before this Unix timestamp will be included in results"},"inclusive":{"type":"boolean","description":"Include messages with oldest or latest timestamps in results (ignored unless oldest or latest is specified)"}},"required":["channel_id"]},"enabled":true,"action":{"path":"/conversations.history","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"limit\": $number(arguments.limit) ? $string(arguments.limit) : \"10\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined,\n \"oldest\": arguments.oldest ? arguments.oldest : undefined,\n \"latest\": arguments.latest ? arguments.latest : undefined,\n \"inclusive\": arguments.inclusive ? $string(arguments.inclusive) : undefined\n }"}}},{"name":"Get Users","description":"Get a list of all users in the workspace with their basic profile information","slug":"get_users","ai_risk":{"level":"low","score":1,"reasoning":"This tool fetches a list of users in the workspace and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor for next page of results"},"limit":{"type":"number","description":"Maximum number of users to return (default 100, max 200)","default":100}}},"enabled":true,"action":{"path":"/users.list","method":"GET","mapping":{"query":"{\n \"limit\": $number(arguments.limit) ? $string($min(arguments.limit, 200)) : \"100\",\n \"team_id\": teamId,\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }"}}},{"name":"Reply To Thread","description":"Reply to a specific message thread in Slack","slug":"reply_to_thread","ai_risk":{"level":"medium","score":5,"reasoning":"This tool allows replying to a message thread, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the thread"},"thread_ts":{"type":"string","description":"The timestamp of the parent message in the format '1234567890.123456'. Timestamps in the format without the period can be converted by adding the period such that 6 numbers come after it."},"text":{"type":"string","description":"The reply text"},"blocks":{"type":"array","description":"Array of Block Kit blocks for rich formatting (tables, buttons, etc.)","items":{"type":"object"}},"unfurl_links":{"type":"boolean","description":"Whether to unfurl links in the message (default true)"},"unfurl_media":{"type":"boolean","description":"Whether to unfurl media in the message (default true)"}},"required":["channel_id","thread_ts","text"]},"action":{"path":"/chat.postMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"thread_ts\": arguments.thread_ts,\n \"text\": arguments.text,\n \"blocks\": arguments.blocks ? arguments.blocks : undefined,\n \"unfurl_links\": $exists(arguments.unfurl_links) ? arguments.unfurl_links : undefined,\n \"unfurl_media\": $exists(arguments.unfurl_media) ? arguments.unfurl_media : undefined\n }"}}},{"name":"Add Reaction","description":"Add a reaction emoji to a message","slug":"add_reaction","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds an emoji reaction to a message, which modifies existing content but is not highly sensitive.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message to react to"},"reaction":{"type":"string","description":"The name of the emoji reaction (without ::)"}},"required":["channel_id","timestamp","reaction"]},"action":{"path":"/reactions.add","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp,\n \"name\": arguments.reaction\n }"}}},{"name":"Get Thread Replies","description":"Get all replies in a message thread","slug":"get_thread_replies","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves replies in a message thread and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the thread"},"thread_ts":{"type":"string","description":"The timestamp of the parent message in the format '1234567890.123456'. Timestamps in the format without the period can be converted by adding the period such that 6 numbers come after it."}},"required":["channel_id","thread_ts"]},"action":{"path":"/conversations.replies","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"ts\": arguments.thread_ts\n }"}}},{"name":"Get User Profile","description":"Get detailed profile information for a specific user","slug":"get_user_profile","ai_risk":{"level":"low","score":1,"reasoning":"This tool fetches detailed user profile information and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"user_id":{"type":"string","description":"The ID of the user"}},"required":["user_id"]},"action":{"path":"/users.profile.get","method":"GET","mapping":{"query":"{\n \"user\": arguments.user_id,\n \"include_labels\": \"true\"\n }"}}},{"name":"Join Public Channel","description":"Join a public channel","slug":"join_public_channel","ai_risk":{"level":"low","score":4,"reasoning":"This tool allows a user to join a public channel, which modifies the user's channel membership.","calculated_at":"2026-05-22T20:39:57.476Z"},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to join"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.join","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"Find Channel Id","description":"Find the channel id for a given channel name. If the channel is not found and next_cursor is returned, call again with the cursor to search the next batch.","inputSchema":{"type":"object","properties":{"channelName":{"type":"string","description":"Name of the channel (without #)"},"cursor":{"type":"string","description":"Pagination cursor for next batch of channels"}},"required":["channelName"]},"slug":"find-channel-id","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a channel ID based on the name and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"enabled":true,"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{\n \"limit\": \"1000\",\n \"exclude_archived\": \"true\",\n \"types\": \"public_channel,private_channel\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }","response":"{\n \"channelId\": $exists(response.channels[name = $$.arguments.channelName].id) ? response.channels[name = $$.arguments.channelName].id : ($exists(response.response_metadata.next_cursor) ? \"not found in this batch, call again with cursor\" : \"channel not found\"),\n \"next_cursor\": response.response_metadata.next_cursor\n }"}}},{"name":"Search Messages","slug":"search-messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool searches messages and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"action":{"path":"/search.messages","method":"GET","mapping":{"query":"{\n \"query\": $join([\n arguments.searchText,\n arguments.in ? \"in:\" & arguments.in : \"\",\n arguments.from ? \"from:\" & arguments.from : \"\",\n arguments.exactPhrase ? '\"' & arguments.exactPhrase & '\"' : \"\",\n arguments.after ? \"after:\" & arguments.after : \"\",\n arguments.before ? \"before:\" & arguments.before : \"\"\n ], \" \"),\n \"count\": $number(arguments.count) ? $string(arguments.count) : \"20\",\n \"page\": $number(arguments.page) ? $string(arguments.page) : \"1\"\n }"}},"enabled":true,"annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Keyword search across messages using powerful query operators such as channel, author, phrase, and date. Supports scoping queries like in:#channel, from:<@USER>, \"exact phrase\", after:YYYY-MM-DD, before:YYYY-MM-DD. This is exact keyword matching only — for natural-language / semantic questions use the \"semantic-search\" tool instead. Results are paginated (default 20 per page, max 100); the response's paging.pages gives the page count, so increment page to read further matches.","inputSchema":{"type":"object","required":[],"properties":{"in":{"type":"string","description":"Channel to search in, e.g., '#general'"},"from":{"type":"string","description":"User to search messages from, e.g., '<@USER>'"},"after":{"type":"string","format":"date","description":"Search for messages after this date, format YYYY-MM-DD"},"before":{"type":"string","format":"date","description":"Search for messages before this date, format YYYY-MM-DD"},"searchText":{"type":"string","description":"Text to search for in messages"},"exactPhrase":{"type":"string","description":"Exact phrase to search for"},"count":{"type":"number","description":"Number of matches to return per page (default 20, max 100)","default":20},"page":{"type":"number","description":"Page of results to return, starting at 1 (max 100)","default":1}}}},{"name":"Semantic Search","slug":"semantic-search","ai_risk":{"level":"low","score":1,"reasoning":"This tool performs a read-only semantic/keyword search across the workspace and returns matching messages, files and channels, posing minimal risk.","calculated_at":"2026-07-15T00:00:00.000Z"},"action":{"path":"/assistant.search.context","method":"POST","mapping":{"body":"{\n \"query\": arguments.query,\n \"action_token\": arguments.action_token ? arguments.action_token : undefined,\n \"channel_types\": arguments.channel_types ? arguments.channel_types : undefined,\n \"content_types\": arguments.content_types ? arguments.content_types : undefined,\n \"context_channel_id\": arguments.context_channel_id ? arguments.context_channel_id : undefined,\n \"before\": $exists(arguments.before) ? arguments.before : undefined,\n \"after\": $exists(arguments.after) ? arguments.after : undefined,\n \"include_context_messages\": $exists(arguments.include_context_messages) ? arguments.include_context_messages : undefined,\n \"include_bots\": $exists(arguments.include_bots) ? arguments.include_bots : undefined,\n \"include_archived_channels\": $exists(arguments.include_archived_channels) ? arguments.include_archived_channels : undefined,\n \"disable_semantic_search\": $exists(arguments.disable_semantic_search) ? arguments.disable_semantic_search : undefined,\n \"highlight\": $exists(arguments.highlight) ? arguments.highlight : undefined,\n \"sort\": arguments.sort ? arguments.sort : undefined,\n \"sort_dir\": arguments.sort_dir ? arguments.sort_dir : undefined,\n \"cursor\": arguments.cursor ? arguments.cursor : undefined,\n \"limit\": $exists(arguments.limit) ? (arguments.limit > 20 ? 20 : arguments.limit) : undefined\n }"}},"enabled":true,"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true},"description":"Semantic (AI/natural-language) search across the workspace via Slack's Real-time Search API (assistant.search.context). Accepts a question-shaped query and returns topically relevant messages, files and channels even without exact keyword matches. Use this for natural-language questions like 'What did we decide about the Q3 launch?'. For strict keyword/operator search (in:, from:, exact phrases, dates) use 'search-messages' instead. Note: with a bot token (xoxb-) an action_token from a Slack message event is required; user-token installs work without it.","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"The natural-language question or search prompt, e.g. 'What is the latest on project Gizmo?'. Slack search filters (in:#channel, from:<@USER>, before:YYYY-MM-DD, has:pin, etc.) can also be embedded in the query."},"channel_types":{"type":"array","items":{"type":"string","enum":["public_channel","private_channel","mpim","im"]},"description":"Channel types to search. Defaults to public_channel. Note: private_channel, im and mpim require the corresponding search:read.* user-token scopes."},"content_types":{"type":"array","items":{"type":"string","enum":["messages","files","channels","users"]},"description":"Content types to include in results. Defaults to messages."},"context_channel_id":{"type":"string","description":"Optional channel ID to scope the search to a specific channel."},"before":{"type":"integer","description":"Only return results before this UNIX timestamp (seconds)."},"after":{"type":"integer","description":"Only return results after this UNIX timestamp (seconds)."},"include_context_messages":{"type":"boolean","description":"Include messages surrounding each top result for extra context. Defaults to false."},"include_bots":{"type":"boolean","description":"Whether results should include bot messages."},"include_archived_channels":{"type":"boolean","description":"Whether to include archived channels in the results."},"disable_semantic_search":{"type":"boolean","description":"When true, only keyword-based search is used (no semantic retrieval). Defaults to false."},"highlight":{"type":"boolean","description":"Highlight the matched query terms in the results. Defaults to false."},"sort":{"type":"string","enum":["score","timestamp"],"description":"Field to sort results by. Defaults to score (relevance)."},"sort_dir":{"type":"string","enum":["asc","desc"],"description":"Sort direction. Defaults to desc."},"limit":{"type":"integer","description":"Number of results to return (max 20, default 20)."},"cursor":{"type":"string","description":"Pagination cursor from a previous response's response_metadata.next_cursor."},"action_token":{"type":"string","description":"Required only for bot-token (xoxb-) calls: the action_token received in a Slack message event. Not needed for user-token installs."}}}},{"name":"Find User ID by Email","slug":"find-user-id-by-email","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a user ID by email and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"action":{"path":"/users.lookupByEmail","method":"GET","mapping":{"query":"{ \"email\": arguments.email }"}},"enabled":true,"annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Retrieves the user ID associated with a given email address in the Slack workspace.","inputSchema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"The email address of the user whose ID you want to find."}}}},{"name":"Schedule Message.","slug":"slack_schedule_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool schedules a message to be posted later, which is a write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"action":{"path":"/chat.scheduleMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"post_at\": $number(arguments.post_at),\n \"text\": arguments.text\n}"}},"enabled":true,"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true},"description":"Schedules a message to be posted to a Slack channel at a specific time (Unix timestamp). Similar to posting a message, but delayed using chat.scheduleMessage.","inputSchema":{"type":"object","required":["channel_id","post_at","text"],"properties":{"text":{"type":"string","description":"The message text to send."},"post_at":{"type":"number","description":"Unix timestamp (in seconds) for when the message should be posted (must be in the future). Example: 1710000000"},"channel_id":{"type":"string","description":"ID of the channel, private channel, or DM to schedule the message for (e.g., C12345678)."}},"additionalProperties":false}},{"name":"Create Message Draft","slug":"create_message_draft","ai_risk":{"level":"medium","score":4,"reasoning":"This tool writes a compose draft in Slack. It does not send the message until a human posts it.","calculated_at":"2026-09-02T14:25:00.000Z"},"action":{"path":"/drafts.create","method":"POST","mapping":{"body":"(\n $linkRe := /<([^<>|]+)\\|([^>]+)>/;\n $firstMatch := function($s) {(\n $matches := $match($s, $linkRe);\n $exists($matches) ? ($type($matches) = \"array\" ? $matches[0] : $matches) : undefined\n )};\n $parseLinks := function($s) {(\n $m := $firstMatch($s);\n $exists($m) and $exists($m.match) ?\n (\n $before := $substring($s, 0, $m.index);\n $afterStart := $m.index + $length($m.match);\n $after := $substring($s, $afterStart, $length($s) - $afterStart);\n $append(\n $length($before) > 0 ? [{\"type\": \"text\", \"text\": $before}] : [],\n $append(\n [{\"type\": \"link\", \"url\": $m.groups[0], \"text\": $m.groups[1]}],\n $parseLinks($after)\n )\n )\n )\n : $length($s) > 0 ? [{\"type\": \"text\", \"text\": $s}] : []\n )};\n {\n \"client_msg_id\": arguments.client_msg_id,\n \"destinations\": [\n $sift({\n \"channel_id\": arguments.channel_id,\n \"thread_ts\": $exists(arguments.thread_ts) and arguments.thread_ts != \"\" ? arguments.thread_ts : undefined\n }, function($v) { $v != null })\n ],\n \"blocks\": [\n {\n \"type\": \"rich_text\",\n \"elements\": [\n {\n \"type\": \"rich_text_section\",\n \"elements\": $parseLinks(arguments.text)\n }\n ]\n }\n ],\n \"is_from_composer\": $exists(arguments.thread_ts) and arguments.thread_ts != \"\" ? false : true,\n \"file_ids\": []\n }\n)"}},"enabled":true,"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false},"description":"Creates a Slack compose draft in a channel or DM. The message stays in Drafts until a human sends it. Requires a user token (not a bot token). Use the DM channel ID (D…), or open a DM first. client_msg_id must be a fresh UUID on every call. Wrap links as Slack mrkdwn: <https://example.com|Take a look>.","inputSchema":{"type":"object","required":["channel_id","text","client_msg_id"],"properties":{"channel_id":{"type":"string","description":"Channel or DM ID to attach the draft to (e.g. D0123456789 or C0123456789)."},"text":{"type":"string","description":"Draft body. Newlines are kept. Use <https://example.com|label> for labeled links. The message is not sent."},"client_msg_id":{"type":"string","description":"Fresh UUID on every call. Slack rejects reuse."},"thread_ts":{"type":"string","description":"Optional parent message timestamp if this draft should be a thread reply. Omit if unused."}},"additionalProperties":false}},{"name":"Open DM","slug":"open_dm","ai_risk":{"level":"low","score":2,"reasoning":"This tool opens or returns an existing DM. It does not send a message.","calculated_at":"2026-09-02T14:25:00.000Z"},"action":{"path":"/conversations.open","method":"POST","mapping":{"body":"{\n \"users\": arguments.user_ids,\n \"return_im\": true\n}"}},"enabled":true,"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false},"description":"Opens a DM with one or more users and returns the DM channel ID. Use that ID as channel_id on create_message_draft. Does not send a message.","inputSchema":{"type":"object","required":["user_ids"],"properties":{"user_ids":{"type":"string","description":"Comma-separated Slack user IDs to open a DM with (e.g. U0123456789). One ID for a 1:1 DM."}},"additionalProperties":false}},{"name":"Add Reminder","description":"Creates a reminder. Supports one-time and recurring reminders with natural language time descriptions.","slug":"add_reminder","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a reminder, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The content of the reminder"},"time":{"type":"string","description":"When this reminder should happen: a Unix timestamp (up to five years from now), the number of seconds until the reminder (if within 24 hours), or a natural language description (e.g. \"in 15 minutes\", \"every Thursday\", \"tomorrow\", \"at 3:30pm\")"},"recurrence":{"type":"object","description":"Specify repeating behavior. Set \"frequency\" to daily, weekly, monthly, or yearly. If weekly, optionally include \"weekdays\" array (e.g. [\"monday\", \"wednesday\", \"friday\"])"}},"required":["text","time"]},"enabled":false,"action":{"path":"/reminders.add","method":"POST","mapping":{"body":"{\n \"text\": arguments.text,\n \"time\": arguments.time,\n \"recurrence\": arguments.recurrence ? arguments.recurrence : undefined\n }"}}},{"name":"Complete Reminder","description":"Marks a reminder as complete. Only non-recurring reminders can be completed.","slug":"complete_reminder","ai_risk":{"level":"low","score":4,"reasoning":"This tool marks a reminder as complete, modifying the state of a reminder.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"reminder":{"type":"string","description":"The ID of the reminder to mark as complete (e.g. Rm12345678)"}},"required":["reminder"]},"enabled":false,"action":{"path":"/reminders.complete","method":"POST","mapping":{"body":"{\n \"reminder\": arguments.reminder\n }"}}},{"name":"Delete Reminder","description":"Deletes a reminder.","slug":"delete_reminder","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a reminder, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"reminder":{"type":"string","description":"The ID of the reminder to delete (e.g. Rm12345678)"}},"required":["reminder"]},"enabled":false,"action":{"path":"/reminders.delete","method":"POST","mapping":{"body":"{\n \"reminder\": arguments.reminder\n }"}}},{"name":"Get Reminder Info","description":"Gets information about a specific reminder including its text, time, and completion status.","slug":"get_reminder_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves information about a reminder and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"reminder":{"type":"string","description":"The ID of the reminder (e.g. Rm12345678)"}},"required":["reminder"]},"enabled":false,"action":{"path":"/reminders.info","method":"GET","mapping":{"query":"{\n \"reminder\": arguments.reminder\n }"}}},{"name":"List Reminders","description":"Lists all reminders created by or for the authenticated user.","slug":"list_reminders","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all reminders and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{}},"enabled":false,"action":{"path":"/reminders.list","method":"GET","mapping":{"query":"{}"}}},{"name":"Create Canvas","description":"Create a new standalone canvas, optionally with a title, initial markdown content, and a channel to tab it in.","slug":"create_canvas","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new canvas, which is a write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the canvas"},"document_content":{"type":"object","description":"Initial content of the canvas. Example: {\"type\": \"markdown\", \"markdown\": \"# Hello\\nWorld\"}","properties":{"type":{"type":"string","description":"Content type, e.g. \"markdown\""},"markdown":{"type":"string","description":"Markdown content for the canvas"}}},"channel_id":{"type":"string","description":"Channel ID to automatically tab the canvas in"}}},"enabled":false,"action":{"path":"/canvases.create","method":"POST","mapping":{"body":"{\n \"title\": arguments.title ? arguments.title : undefined,\n \"document_content\": arguments.document_content ? arguments.document_content : undefined,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Update Canvas","description":"Update an existing canvas by applying a change operation (insert_at_start, insert_at_end, insert_before, insert_after, replace, delete, rename).","slug":"update_canvas","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates an existing canvas, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"changes":{"type":"array","description":"List of changes to apply. Each change requires an \"operation\" and a \"document_content\" (with \"type\" and \"markdown\"). Operations insert_before/insert_after/replace/delete also require a \"section_id\". Use \"rename\" with \"title_content\" to rename the canvas.","items":{"type":"object"}}},"required":["canvas_id","changes"]},"enabled":false,"action":{"path":"/canvases.edit","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"changes\": arguments.changes\n }"}}},{"name":"Read Canvas","description":"Look up sections within a canvas by section type (h1, h2, h3, any_header) and/or contained text. Returns section IDs that can be used to target edits.","slug":"read_canvas","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves sections from a canvas and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"criteria":{"type":"object","description":"Filtering criteria. Example: {\"section_types\": [\"any_header\"], \"contains_text\": \"Project Status\"}","properties":{"section_types":{"type":"array","description":"Section types to filter on: \"h1\", \"h2\", \"h3\", \"any_header\"","items":{"type":"string"}},"contains_text":{"type":"string","description":"Filter sections that contain this text"}}}},"required":["canvas_id","criteria"]},"enabled":false,"action":{"path":"/canvases.sections.lookup","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"criteria\": arguments.criteria\n }"}}},{"name":"Create Channel Canvas","description":"Create the native canvas tab directly on a channel.","slug":"create_channel_canvas","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a canvas tab in a channel, which is a write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to create the canvas in"},"document_content":{"type":"object","description":"Initial content of the canvas. Example: {\"type\": \"markdown\", \"markdown\": \"# Hello\\nWorld\"}","properties":{"type":{"type":"string","description":"Content type, e.g. \"markdown\""},"markdown":{"type":"string","description":"Markdown content for the canvas"}}}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.canvases.create","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"document_content\": arguments.document_content ? arguments.document_content : undefined\n }"}}},{"name":"Delete Canvas","description":"Delete a canvas by ID.","slug":"delete_canvas","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a canvas, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas to delete (e.g. F1234ABCD)"}},"required":["canvas_id"]},"enabled":false,"action":{"path":"/canvases.delete","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id\n }"}}},{"name":"Set Canvas Access","description":"Control who can view or edit a canvas. Provide either user_ids or channel_id.","slug":"set_canvas_access","ai_risk":{"level":"medium","score":6,"reasoning":"This tool controls access to a canvas, which can significantly affect who can view or edit it.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"access_level":{"type":"string","description":"Access level to grant: \"read\" or \"write\"","enum":["read","write"]},"user_ids":{"type":"array","description":"List of user IDs to grant access to","items":{"type":"string"}},"channel_id":{"type":"string","description":"Channel ID to grant access to"}},"required":["canvas_id","access_level"]},"enabled":false,"action":{"path":"/canvases.access.set","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"access_level\": arguments.access_level,\n \"user_ids\": arguments.user_ids ? arguments.user_ids : undefined,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Remove Canvas Access","description":"Revoke access to a canvas. Provide either user_ids or channel_id.","slug":"remove_canvas_access","ai_risk":{"level":"medium","score":6,"reasoning":"This tool revokes access to a canvas, which can significantly affect user permissions.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"user_ids":{"type":"array","description":"List of user IDs to revoke access from","items":{"type":"string"}},"channel_id":{"type":"string","description":"Channel ID to revoke access from"}},"required":["canvas_id"]},"enabled":false,"action":{"path":"/canvases.access.delete","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"user_ids\": arguments.user_ids ? arguments.user_ids : undefined,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Create Channel","description":"Create a public or private Slack channel.","slug":"create_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new Slack channel, which is a write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the channel (lowercase, no spaces)"},"is_private":{"type":"boolean","description":"Whether the channel should be private (default false)"}},"required":["name"]},"enabled":false,"action":{"path":"/conversations.create","method":"POST","mapping":{"body":"{\n \"name\": arguments.name,\n \"is_private\": $exists(arguments.is_private) ? arguments.is_private : undefined\n }"}}},{"name":"Archive Channel","description":"Archive a Slack channel.","slug":"archive_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool archives a channel, which modifies the state of the channel.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to archive"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.archive","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"Rename Channel","description":"Rename a Slack channel.","slug":"rename_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool renames a channel, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to rename"},"name":{"type":"string","description":"New name for the channel (lowercase, no spaces)"}},"required":["channel_id","name"]},"enabled":false,"action":{"path":"/conversations.rename","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"name\": arguments.name\n }"}}},{"name":"Invite To Channel","description":"Add one or more users to a Slack channel.","slug":"invite_to_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds users to a channel, modifying channel membership.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"user_ids":{"type":"array","description":"List of user IDs to invite","items":{"type":"string"}}},"required":["channel_id","user_ids"]},"enabled":false,"action":{"path":"/conversations.invite","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"users\": $join(arguments.user_ids, \",\")\n }"}}},{"name":"Kick From Channel","description":"Remove a user from a Slack channel.","slug":"kick_from_channel","ai_risk":{"level":"medium","score":6,"reasoning":"This tool removes a user from a channel, which can significantly affect user access.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"user_id":{"type":"string","description":"The ID of the user to remove"}},"required":["channel_id","user_id"]},"enabled":false,"action":{"path":"/conversations.kick","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"user\": arguments.user_id\n }"}}},{"name":"Set Channel Topic","description":"Set the topic for a Slack channel.","slug":"set_channel_topic","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sets the topic for a channel, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"topic":{"type":"string","description":"The new topic for the channel"}},"required":["channel_id","topic"]},"enabled":false,"action":{"path":"/conversations.setTopic","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"topic\": arguments.topic\n }"}}},{"name":"Set Channel Purpose","description":"Set the purpose for a Slack channel.","slug":"set_channel_purpose","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sets the purpose for a channel, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"purpose":{"type":"string","description":"The new purpose for the channel"}},"required":["channel_id","purpose"]},"enabled":false,"action":{"path":"/conversations.setPurpose","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"purpose\": arguments.purpose\n }"}}},{"name":"Get Channel Info","description":"Get full metadata for a Slack channel.","slug":"get_channel_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves metadata for a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.info","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"List Channel Members","description":"List all member IDs in a Slack channel.","slug":"list_channel_members","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all members in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"limit":{"type":"number","description":"Maximum number of members to return (default 100)","default":100},"cursor":{"type":"string","description":"Pagination cursor for next page of results"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.members","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"limit\": $number(arguments.limit) ? $string(arguments.limit) : \"100\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }"}}},{"name":"Add Bookmark","description":"Add a link to the channel bookmarks bar.","slug":"add_bookmark","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds a bookmark to a channel, which modifies channel content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"title":{"type":"string","description":"Display title for the bookmark"},"link":{"type":"string","description":"URL for the bookmark"},"emoji":{"type":"string","description":"Emoji icon for the bookmark (e.g. ':star:')"}},"required":["channel_id","title","link"]},"enabled":false,"action":{"path":"/bookmarks.add","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"title\": arguments.title,\n \"link\": arguments.link,\n \"type\": \"link\",\n \"emoji\": arguments.emoji ? arguments.emoji : undefined\n }"}}},{"name":"List Bookmarks","description":"List all bookmarks in a channel.","slug":"list_bookmarks","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all bookmarks in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/bookmarks.list","method":"GET","mapping":{"query":"{\n \"channel_id\": arguments.channel_id\n }"}}},{"name":"Edit Bookmark","description":"Update a bookmark's title or link.","slug":"edit_bookmark","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates a bookmark's title or link, which modifies existing content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"bookmark_id":{"type":"string","description":"The ID of the bookmark to edit"},"title":{"type":"string","description":"New title for the bookmark"},"link":{"type":"string","description":"New URL for the bookmark"}},"required":["channel_id","bookmark_id"]},"enabled":false,"action":{"path":"/bookmarks.edit","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"bookmark_id\": arguments.bookmark_id,\n \"title\": arguments.title ? arguments.title : undefined,\n \"link\": arguments.link ? arguments.link : undefined\n }"}}},{"name":"Remove Bookmark","description":"Remove a bookmark from a channel.","slug":"remove_bookmark","ai_risk":{"level":"medium","score":5,"reasoning":"This tool removes a bookmark from a channel, which modifies channel content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"bookmark_id":{"type":"string","description":"The ID of the bookmark to remove"}},"required":["channel_id","bookmark_id"]},"enabled":false,"action":{"path":"/bookmarks.remove","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"bookmark_id\": arguments.bookmark_id\n }"}}},{"name":"Pin Message","description":"Pin a message in a channel.","slug":"pin_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool pins a message in a channel, which modifies the state of the message.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message to pin"}},"required":["channel_id","timestamp"]},"enabled":false,"action":{"path":"/pins.add","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp\n }"}}},{"name":"Unpin Message","description":"Unpin a message in a channel.","slug":"unpin_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool unpins a message in a channel, which modifies the state of the message.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message to unpin"}},"required":["channel_id","timestamp"]},"enabled":false,"action":{"path":"/pins.remove","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp\n }"}}},{"name":"List Pins","description":"List all pinned items in a channel.","slug":"list_pins","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all pinned items in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/pins.list","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"Update Message","description":"Edit an existing Slack message.","slug":"update_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool edits an existing message, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"ts":{"type":"string","description":"The timestamp of the message to update"},"text":{"type":"string","description":"New text for the message"},"blocks":{"type":"array","description":"New Block Kit blocks for the message","items":{"type":"object"}}},"required":["channel_id","ts","text"]},"enabled":false,"action":{"path":"/chat.update","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"ts\": arguments.ts,\n \"text\": arguments.text,\n \"blocks\": arguments.blocks ? arguments.blocks : undefined\n }"}}},{"name":"Delete Message","description":"Delete a Slack message.","slug":"delete_message","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a message, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"ts":{"type":"string","description":"The timestamp of the message to delete"}},"required":["channel_id","ts"]},"enabled":false,"action":{"path":"/chat.delete","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"ts\": arguments.ts\n }"}}},{"name":"Get Permalink","description":"Get a permanent link to a Slack message.","slug":"get_permalink","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a permanent link to a message and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"message_ts":{"type":"string","description":"The timestamp of the message"}},"required":["channel_id","message_ts"]},"enabled":false,"action":{"path":"/chat.getPermalink","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"message_ts\": arguments.message_ts\n }"}}},{"name":"List Scheduled Messages","description":"List all pending scheduled messages.","slug":"list_scheduled_messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all pending scheduled messages and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"Filter by channel ID (optional)"}}},"enabled":false,"action":{"path":"/chat.scheduledMessages.list","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Delete Scheduled Message","description":"Cancel a scheduled message before it is sent.","slug":"delete_scheduled_message","ai_risk":{"level":"medium","score":6,"reasoning":"This tool cancels a scheduled message, which is a destructive operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel the message was scheduled for"},"scheduled_message_id":{"type":"string","description":"The ID of the scheduled message to cancel"}},"required":["channel_id","scheduled_message_id"]},"enabled":false,"action":{"path":"/chat.deleteScheduledMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"scheduled_message_id\": arguments.scheduled_message_id\n }"}}},{"name":"List Files","description":"List files in a channel.","slug":"list_files","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists files in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to list files from"},"limit":{"type":"number","description":"Maximum number of files to return (default 20)","default":20}},"required":["channel_id"]},"enabled":false,"action":{"path":"/files.list","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"count\": $number(arguments.limit) ? $string(arguments.limit) : \"20\"\n }"}}},{"name":"Delete File","description":"Delete a file.","slug":"delete_file","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a file, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"file_id":{"type":"string","description":"The ID of the file to delete"}},"required":["file_id"]},"enabled":false,"action":{"path":"/files.delete","method":"POST","mapping":{"body":"{\n \"file\": arguments.file_id\n }"}}},{"name":"Get File Info","description":"Get metadata for a Slack file by its ID, including its download URL (url_private_download), name, mimetype, and size. Use the returned URL with the Download File tool.","slug":"get_file_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves metadata about a single file and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"file_id":{"type":"string","description":"The ID of the file (e.g. F1234ABCD)"}},"required":["file_id"]},"enabled":false,"action":{"path":"/files.info","method":"GET","mapping":{"query":"{\n \"file\": arguments.file_id\n }"}}},{"name":"Download File","description":"Download the binary contents of a Slack file. Provide the file's private URL — the `url_private_download` (or `url_private`) field from a file object returned by List Files, Get File Info, or Get Channel History. Returns the file as a base64-encoded resource.","slug":"download_file","ai_risk":{"level":"low","score":1,"reasoning":"This tool downloads the contents of an existing file and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The private download URL of the file (the `url_private_download` or `url_private` field from a Slack file object)."}},"required":["url"]},"enabled":false,"action":{"path":"{url}","method":"GET","responseType":"arraybuffer","mapping":{"params":"{ \"url\": arguments.url }"}}},{"name":"Get Upload URL","description":"Step 1 of uploading a file to Slack. Reserves an upload URL and a file ID for a file of the given name and size. Then call Upload File Content with the returned `upload_url` to send the file bytes, and finally call Complete Upload with the file ID to finalize and share it.","slug":"get_upload_url","ai_risk":{"level":"low","score":2,"reasoning":"This tool reserves an upload destination but does not create or modify shared content on its own, posing low risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"idempotentHint":false},"inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"Name of the file being uploaded (including extension)"},"length":{"type":"number","description":"Size of the file in bytes"},"alt_text":{"type":"string","description":"Description of image for screen readers (optional)"},"snippet_type":{"type":"string","description":"Syntax type of the snippet being uploaded, e.g. 'text', 'python' (optional)"}},"required":["filename","length"]},"enabled":false,"action":{"path":"/files.getUploadURLExternal","method":"GET","mapping":{"query":"{\n \"filename\": arguments.filename,\n \"length\": $string(arguments.length),\n \"alt_text\": arguments.alt_text ? arguments.alt_text : undefined,\n \"snippet_type\": arguments.snippet_type ? arguments.snippet_type : undefined\n }"}}},{"name":"Upload File Content","description":"Step 2 of uploading a file to Slack. Sends the file bytes (as base64) to the `upload_url` returned by Get Upload URL. The file is not visible in Slack until Complete Upload finalizes it with the file ID from Get Upload URL. Pass the same `filename` you gave Get Upload URL, and make sure `length` there matched the decoded size in bytes.","slug":"upload_file_content","ai_risk":{"level":"low","score":3,"reasoning":"This tool sends bytes to a pre-signed Slack upload URL. The file stays private and unshared until Complete Upload is called.","calculated_at":"2026-10-18T00:00:00.000Z"},"annotations":{"idempotentHint":true},"inputSchema":{"type":"object","properties":{"upload_url":{"type":"string","description":"The `upload_url` returned by Get Upload URL"},"data":{"type":"string","description":"File content encoded as a base64 string. It is sent as multipart/form-data."},"filename":{"type":"string","description":"Name of the file (including extension), the same one passed to Get Upload URL"},"mime_type":{"type":"string","description":"MIME type of the file, e.g. 'image/png' (optional, defaults to application/octet-stream)"}},"required":["upload_url","data","filename"]},"enabled":false,"action":{"path":"{url}","method":"POST","responseType":"text","mapping":{"headers":"{ \"Content-Type\": \"multipart/form-data\" }","params":"{ \"url\": arguments.upload_url }","body":"{\n \"file\": {\n \"data\": arguments.data,\n \"filename\": arguments.filename,\n \"mimeType\": arguments.mime_type ? arguments.mime_type : \"application/octet-stream\"\n }\n }"}}},{"name":"Complete Upload","description":"Final step of uploading a file to Slack. Finalizes one or more files whose bytes were already POSTed to the `upload_url` from Get Upload URL, and optionally shares them to a channel or thread. Provide the file ID(s) returned by Get Upload URL.","slug":"complete_upload","ai_risk":{"level":"medium","score":5,"reasoning":"This tool finalizes and shares uploaded files, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"files":{"type":"array","description":"List of files to finalize. Each item requires the file `id` returned by Get Upload URL and may include an optional `title`.","items":{"type":"object","properties":{"id":{"type":"string","description":"The file ID returned by Get Upload URL"},"title":{"type":"string","description":"Optional display title for the file"}},"required":["id"]}},"channel_id":{"type":"string","description":"ID of the channel to share the file(s) in (optional). If omitted the file is created but not shared."},"initial_comment":{"type":"string","description":"Message text to post with the shared file (optional)"},"thread_ts":{"type":"string","description":"Timestamp of the parent message to share the file into a thread (optional)"}},"required":["files"]},"enabled":false,"action":{"path":"/files.completeUploadExternal","method":"POST","mapping":{"body":"{\n \"files\": arguments.files,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined,\n \"initial_comment\": arguments.initial_comment ? arguments.initial_comment : undefined,\n \"thread_ts\": arguments.thread_ts ? arguments.thread_ts : undefined\n }"}}},{"name":"Remove Reaction","description":"Remove an emoji reaction from a message.","slug":"remove_reaction","ai_risk":{"level":"medium","score":5,"reasoning":"This tool removes an emoji reaction from a message, which modifies existing content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message"},"name":{"type":"string","description":"The name of the emoji reaction to remove (without colons)"}},"required":["channel_id","timestamp","name"]},"enabled":false,"action":{"path":"/reactions.remove","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp,\n \"name\": arguments.name\n }"}}},{"name":"Create List","description":"Create a structured list (table) in a channel.","slug":"create_list","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a structured list in a channel, which is a write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to create the list in"},"name":{"type":"string","description":"Name of the list"},"columns":{"type":"array","description":"Column definitions. Each column needs \"name\" and \"type\" (e.g. \"text\", \"number\", \"date\", \"person\", \"checkbox\")","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"}}}}},"required":["channel_id","name","columns"]},"enabled":false,"action":{"path":"/lists.create","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"name\": arguments.name,\n \"columns\": arguments.columns\n }"}}},{"name":"Add List Item","description":"Add a row to a Slack list.","slug":"add_list_item","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds a row to a list, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"},"values":{"type":"object","description":"Key-value pairs for each column in the list row"}},"required":["list_id","values"]},"enabled":false,"action":{"path":"/slackLists.items.create","method":"POST","mapping":{"body":"{\n \"list_id\": arguments.list_id,\n \"values\": arguments.values\n }"}}},{"name":"Update List Item","description":"Update a row in a Slack list.","slug":"update_list_item","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates a row in a list, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"},"item_id":{"type":"string","description":"The ID of the row to update"},"values":{"type":"object","description":"Key-value pairs with updated column values"}},"required":["list_id","item_id","values"]},"enabled":false,"action":{"path":"/slackLists.items.update","method":"POST","mapping":{"body":"{\n \"list_id\": arguments.list_id,\n \"item_id\": arguments.item_id,\n \"values\": arguments.values\n }"}}},{"name":"Delete List Item","description":"Delete a row from a Slack list.","slug":"delete_list_item","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a row from a list, which is a destructive operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"},"item_id":{"type":"string","description":"The ID of the row to delete"}},"required":["list_id","item_id"]},"enabled":false,"action":{"path":"/slackLists.items.delete","method":"POST","mapping":{"body":"{\n \"list_id\": arguments.list_id,\n \"item_id\": arguments.item_id\n }"}}},{"name":"List List Items","description":"Retrieve all rows from a Slack list.","slug":"list_list_items","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves all rows from a list and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"}},"required":["list_id"]},"enabled":false,"action":{"path":"/slackLists.items.list","method":"GET","mapping":{"query":"{\n \"list_id\": arguments.list_id\n }"}}},{"name":"Create User Group","description":"Create a new user group (a @mention group).","slug":"create_user_group","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new user group, which is a write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name of the user group"},"handle":{"type":"string","description":"Handle used to @mention the group (without @)"},"description":{"type":"string","description":"Description of the user group"},"user_ids":{"type":"array","description":"Initial list of user IDs to add to the group","items":{"type":"string"}}},"required":["name","handle"]},"enabled":false,"action":{"path":"/usergroups.create","method":"POST","mapping":{"body":"{\n \"name\": arguments.name,\n \"handle\": arguments.handle,\n \"description\": arguments.description ? arguments.description : undefined,\n \"users\": arguments.user_ids ? $join(arguments.user_ids, \",\") : undefined\n }"}}},{"name":"Update User Group","description":"Update a user group's name or handle.","slug":"update_user_group","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates a user group's name or handle, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"usergroup_id":{"type":"string","description":"The ID of the user group"},"name":{"type":"string","description":"New display name for the user group"},"handle":{"type":"string","description":"New handle for the user group (without @)"}},"required":["usergroup_id"]},"enabled":false,"action":{"path":"/usergroups.update","method":"POST","mapping":{"body":"{\n \"usergroup\": arguments.usergroup_id,\n \"name\": arguments.name ? arguments.name : undefined,\n \"handle\": arguments.handle ? arguments.handle : undefined\n }"}}},{"name":"Update User Group Members","description":"Set the complete list of members for a user group.","slug":"update_user_group_members","ai_risk":{"level":"medium","score":6,"reasoning":"This tool sets the complete list of members for a user group, which can significantly affect group membership.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"usergroup_id":{"type":"string","description":"The ID of the user group"},"user_ids":{"type":"array","description":"Complete list of user IDs that should be in the group","items":{"type":"string"}}},"required":["usergroup_id","user_ids"]},"enabled":false,"action":{"path":"/usergroups.users.update","method":"POST","mapping":{"body":"{\n \"usergroup\": arguments.usergroup_id,\n \"users\": $join(arguments.user_ids, \",\")\n }"}}},{"name":"List User Groups","description":"List all user groups in the workspace.","slug":"list_user_groups","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all user groups and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{}},"enabled":false,"action":{"path":"/usergroups.list","method":"GET","mapping":{"query":"{}"}}},{"name":"Get Workspace Info","description":"Get workspace name, domain, and ID.","slug":"get_workspace_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves workspace information and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{}},"enabled":false,"action":{"path":"/team.info","method":"GET","mapping":{"query":"{}"}}},{"name":"Set User Status","description":"Set the authenticated user's Slack status.","slug":"set_user_status","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sets the user's Slack status, which modifies user profile information.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"status_text":{"type":"string","description":"Status message text (max 100 characters)"},"status_emoji":{"type":"string","description":"Emoji for the status (e.g. ':palm_tree:')"},"status_expiration":{"type":"number","description":"Unix timestamp when the status should clear (0 or omit for no expiration)"}},"required":["status_text","status_emoji"]},"enabled":false,"action":{"path":"/users.profile.set","method":"POST","mapping":{"body":"{\n \"profile\": {\n \"status_text\": arguments.status_text,\n \"status_emoji\": arguments.status_emoji,\n \"status_expiration\": $exists(arguments.status_expiration) ? arguments.status_expiration : 0\n }\n }"}}}]}}
|
|
1
|
+
{"id":"slack","status":"active","internal_status":"tool-works","applications":["slack"],"definition":{"display":{"name":"Slack","description":"Slack is a team communication tool that allows you to chat, share files, and collaborate with your team.","icon":"slack.svg","website":"https://slack.com","category":"communication-messaging","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/slack"},"api":{"base_url":"https://slack.com/api"},"auth":{"methods":{"apiKey":{"authorizationMapping":"\"Bearer \"&token"},"oauth":{"authUrl":"https://slack.com/oauth/v2/authorize","tokenUrl":"https://slack.com/api/oauth.v2.access","scopes":["identify","bot","commands","chat:write","chat:write.customize","chat:write.public","chat:write:user","chat:write:bot","app_mentions:read","client","connections:write","channels:read","channels:write","channels:history","channels:manage","groups:read","groups:write","im:read","im:write","mpim:read","mpim:write","conversations.connect:read","conversations.connect:manage","files:read","files:write","remote_files:read","remote_files:write","remote_files:share","reactions:read","reactions:write","pins:read","pins:write","bookmarks:read","bookmarks:write","reminders:read","reminders:write","canvases:read","canvases:write","lists:read","lists:write","search:read","search:read.public","search:read.private","search:read.im","search:read.mpim","search:read.files","search:read.users","users:read","users:read.email","users.profile:read","users.profile:write","usergroups:read","usergroups:write","admin.analytics:read","admin.apps:read","admin.apps:write","admin.conversations:read","admin.conversations:write","admin.users:read","admin.users:write","admin.roles:read","admin.roles:write","admin.teams:read","admin.teams:write","admin.usergroups:read","admin.usergroups:write","admin.workflows:read","admin.workflows:write","auditlogs:read","app_configurations:read","app_configurations:write","authorizations:read","groups:history","im:history","incoming-webhook","mpim:history"],"defaultScopes":["channels:history","channels:read","channels:write","groups:history","groups:read","groups:write","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","chat:write","reactions:write","pins:read","pins:write","bookmarks:read","bookmarks:write","reminders:read","reminders:write","canvases:read","canvases:write","lists:read","lists:write","files:read","files:write","team:read","usergroups:read","usergroups:write","users:read","users:read.email","users.profile:read","users.profile:write","search:read","search:read.public","search:read.private","search:read.im","search:read.mpim","search:read.files","search:read.users"],"scopeTemplates":[{"id":"read-only","name":"Read-only","description":"Read and search channels, DMs, files, canvases, lists and the user directory. Can't post, react or change anything.","scopes":["channels:history","channels:read","groups:history","groups:read","im:history","im:read","mpim:history","mpim:read","reactions:read","pins:read","bookmarks:read","reminders:read","canvases:read","lists:read","files:read","team:read","usergroups:read","users:read","users:read.email","users.profile:read","search:read","search:read.public","search:read.private","search:read.im","search:read.mpim","search:read.files","search:read.users"]},{"id":"messaging","name":"Messaging","description":"Read and search conversations and send messages and DMs as the user. No files, canvases, lists or profile changes.","scopes":["channels:history","channels:read","groups:history","groups:read","im:history","im:read","im:write","mpim:history","mpim:read","mpim:write","chat:write","users:read","users:read.email","search:read"]},{"id":"full-access","name":"Full access","description":"Read and write messages, channels, reactions, pins, bookmarks, reminders, canvases, lists, files, user groups and the user's profile.","scopes":["channels:history","channels:read","groups:history","groups:read","im:history","im:read","mpim:history","mpim:read","reactions:read","pins:read","bookmarks:read","reminders:read","canvases:read","lists:read","files:read","team:read","usergroups:read","users:read","users:read.email","users.profile:read","search:read","search:read.public","search:read.private","search:read.im","search:read.mpim","search:read.files","search:read.users","channels:write","groups:write","im:write","mpim:write","chat:write","reactions:write","pins:write","bookmarks:write","reminders:write","canvases:write","lists:write","files:write","usergroups:write","users.profile:write"]}],"codeExchangeConfig":{"modelCredentialsMapping":"{\"access_token\": authed_user.access_token, \"scope\": authed_user.scope}","externalIdMapping":"exchangeCodeData.authed_user.id","isForm":true}}}},"conditions":[{"id":"block-channels","name":"Block specific channels","description":"Block reading messages from a configurable list of Slack channel ids. Useful for keeping sensitive or private channels out of reach of the model.","mapping":"arguments.channel_id in variables.blockedChannelIds","message":"Access to this Slack channel is restricted by an organization condition.","variables":[{"key":"blockedChannelIds","label":"Blocked channels","description":"This tool won't be able to read messages from the channels you select.","type":"string[]","required":true,"placeholder":"C0123456789, C0987654321","options":{"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"response.channels.{ \"value\": id, \"label\": \"#\" & name }","searchable":true}}],"appliesTo":["get_channel_history","get_thread_replies"]},{"id":"block-channels-by-name","name":"Block channels by name","description":"Block reading messages from channels whose name matches a pattern. Patterns support the `*` wildcard, so `*sensitive*` blocks any channel containing the word \"sensitive\" and `*public*` blocks any channel containing \"public\". Matching is case-insensitive.","action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"$matchesAnyGlob(response.channels[id = $$.arguments.channel_id].name, variables.blockedNamePatterns)","message":"Access to this Slack channel is restricted by an organization condition.","variables":[{"key":"blockedNamePatterns","label":"Blocked channel name patterns","description":"Channels whose name matches any of these patterns won't be readable. Use `*` as a wildcard, e.g. `*sensitive*`, `exec-*`, `*-private`.","type":"string[]","required":true,"placeholder":"*sensitive*, *public*, exec-*"}],"appliesTo":["get_channel_history","get_thread_replies"]},{"id":"only-channels-by-name","name":"Only allow channels by name","description":"Only allow reading messages from channels whose name matches a pattern; every other channel is blocked. Patterns support the `*` wildcard (e.g. `team-*`, `*public*`). Matching is case-insensitive.","action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"$not($matchesAnyGlob(response.channels[id = $$.arguments.channel_id].name, variables.allowedNamePatterns))","message":"This Slack channel is not in the list of channels allowed by an organization condition.","variables":[{"key":"allowedNamePatterns","label":"Allowed channel name patterns","description":"Only channels whose name matches one of these patterns will be readable. Use `*` as a wildcard, e.g. `team-*`, `*public*`.","type":"string[]","required":true,"placeholder":"team-*, *public*"}],"appliesTo":["get_channel_history","get_thread_replies"]},{"id":"webhook-only-channels","name":"Only for specific channels","description":"Run this workflow only for events in the Slack channels you select.","surface":"webhook","mapping":"body.event.channel in variables.channelIds","variables":[{"key":"channelIds","label":"Channels","description":"Only events from the channels you select will trigger this workflow.","type":"string[]","required":true,"placeholder":"C0123456789, C0987654321","options":{"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"response.channels.{ \"value\": id, \"label\": \"#\" & name }","searchable":true}}]},{"id":"webhook-ignore-channels","name":"Ignore specific channels","description":"Skip this workflow for events in the Slack channels you select.","surface":"webhook","mapping":"$not(body.event.channel in variables.channelIds)","variables":[{"key":"channelIds","label":"Ignored channels","description":"Events from the channels you select will not trigger this workflow.","type":"string[]","required":true,"placeholder":"C0123456789, C0987654321","options":{"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{ \"types\": \"public_channel,private_channel\", \"limit\": \"1000\", \"exclude_archived\": \"true\" }"}},"mapping":"response.channels.{ \"value\": id, \"label\": \"#\" & name }","searchable":true}}]},{"id":"webhook-only-users","name":"Only for specific users","description":"Run this workflow only for events triggered by the Slack users you select.","surface":"webhook","mapping":"body.event.user in variables.userIds","variables":[{"key":"userIds","label":"Users","description":"Only events triggered by the users you select will run this workflow.","type":"string[]","required":true,"placeholder":"U0123456789, U0987654321","options":{"action":{"path":"/users.list","method":"GET","mapping":{"query":"{ \"limit\": \"1000\" }"}},"mapping":"response.members[deleted = false and is_bot = false].{ \"value\": id, \"label\": (profile.real_name ? profile.real_name : name) & \" (@\" & name & \")\" }","searchable":true}}]},{"id":"webhook-ignore-users","name":"Ignore specific users","description":"Skip this workflow for events triggered by the Slack users you select — useful for ignoring bots.","surface":"webhook","mapping":"$not(body.event.user in variables.userIds)","variables":[{"key":"userIds","label":"Ignored users","description":"Events triggered by the users you select will not run this workflow.","type":"string[]","required":true,"placeholder":"U0123456789, U0987654321","options":{"action":{"path":"/users.list","method":"GET","mapping":{"query":"{ \"limit\": \"1000\" }"}},"mapping":"response.members[deleted = false and is_bot = false].{ \"value\": id, \"label\": (profile.real_name ? profile.real_name : name) & \" (@\" & name & \")\" }","searchable":true}}]}],"tools":[{"name":"List Channels","description":"List public channels in the workspace with pagination","slug":"list_channels","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists public channels in the workspace and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Maximum number of channels to return (default 100, max 200)","default":100},"cursor":{"type":"string","description":"Pagination cursor for next page of results"}}},"enabled":true,"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{\n \"exclude_archived\": \"true\", \n \"limit\": $number(arguments.limit) ? $string($min(arguments.limit, 200)) : \"100\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }"}}},{"name":"Post Message","description":"Post a new message to a Slack channel","slug":"post_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool posts a new message to a channel, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to post to"},"text":{"type":"string","description":"The message text to post"},"blocks":{"type":"array","description":"Array of Block Kit blocks for rich formatting (tables, buttons, etc.)","items":{"type":"object"}},"unfurl_links":{"type":"boolean","description":"Whether to unfurl links in the message (default true)"},"unfurl_media":{"type":"boolean","description":"Whether to unfurl media in the message (default true)"}},"required":["channel_id","text"]},"enabled":true,"action":{"path":"/chat.postMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"text\": arguments.text,\n \"blocks\": arguments.blocks ? arguments.blocks : undefined,\n \"unfurl_links\": $exists(arguments.unfurl_links) ? arguments.unfurl_links : undefined,\n \"unfurl_media\": $exists(arguments.unfurl_media) ? arguments.unfurl_media : undefined\n }"}}},{"name":"Get Channel History","description":"Get recent messages from a channel","slug":"get_channel_history","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves recent messages from a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"limit":{"type":"number","description":"Number of messages to retrieve (default 10, max 999)","default":10},"cursor":{"type":"string","description":"Pagination cursor for next page of results"},"oldest":{"type":"string","description":"Only messages after this Unix timestamp will be included in results"},"latest":{"type":"string","description":"Only messages before this Unix timestamp will be included in results"},"inclusive":{"type":"boolean","description":"Include messages with oldest or latest timestamps in results (ignored unless oldest or latest is specified)"}},"required":["channel_id"]},"enabled":true,"action":{"path":"/conversations.history","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"limit\": $number(arguments.limit) ? $string(arguments.limit) : \"10\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined,\n \"oldest\": arguments.oldest ? arguments.oldest : undefined,\n \"latest\": arguments.latest ? arguments.latest : undefined,\n \"inclusive\": arguments.inclusive ? $string(arguments.inclusive) : undefined\n }"}}},{"name":"Get Users","description":"Get a list of all users in the workspace with their basic profile information","slug":"get_users","ai_risk":{"level":"low","score":1,"reasoning":"This tool fetches a list of users in the workspace and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor for next page of results"},"limit":{"type":"number","description":"Maximum number of users to return (default 100, max 200)","default":100}}},"enabled":true,"action":{"path":"/users.list","method":"GET","mapping":{"query":"{\n \"limit\": $number(arguments.limit) ? $string($min(arguments.limit, 200)) : \"100\",\n \"team_id\": teamId,\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }"}}},{"name":"Reply To Thread","description":"Reply to a specific message thread in Slack","slug":"reply_to_thread","ai_risk":{"level":"medium","score":5,"reasoning":"This tool allows replying to a message thread, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the thread"},"thread_ts":{"type":"string","description":"The timestamp of the parent message in the format '1234567890.123456'. Timestamps in the format without the period can be converted by adding the period such that 6 numbers come after it."},"text":{"type":"string","description":"The reply text"},"blocks":{"type":"array","description":"Array of Block Kit blocks for rich formatting (tables, buttons, etc.)","items":{"type":"object"}},"unfurl_links":{"type":"boolean","description":"Whether to unfurl links in the message (default true)"},"unfurl_media":{"type":"boolean","description":"Whether to unfurl media in the message (default true)"}},"required":["channel_id","thread_ts","text"]},"action":{"path":"/chat.postMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"thread_ts\": arguments.thread_ts,\n \"text\": arguments.text,\n \"blocks\": arguments.blocks ? arguments.blocks : undefined,\n \"unfurl_links\": $exists(arguments.unfurl_links) ? arguments.unfurl_links : undefined,\n \"unfurl_media\": $exists(arguments.unfurl_media) ? arguments.unfurl_media : undefined\n }"}}},{"name":"Add Reaction","description":"Add a reaction emoji to a message","slug":"add_reaction","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds an emoji reaction to a message, which modifies existing content but is not highly sensitive.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message to react to"},"reaction":{"type":"string","description":"The name of the emoji reaction (without ::)"}},"required":["channel_id","timestamp","reaction"]},"action":{"path":"/reactions.add","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp,\n \"name\": arguments.reaction\n }"}}},{"name":"Get Thread Replies","description":"Get all replies in a message thread","slug":"get_thread_replies","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves replies in a message thread and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the thread"},"thread_ts":{"type":"string","description":"The timestamp of the parent message in the format '1234567890.123456'. Timestamps in the format without the period can be converted by adding the period such that 6 numbers come after it."}},"required":["channel_id","thread_ts"]},"action":{"path":"/conversations.replies","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"ts\": arguments.thread_ts\n }"}}},{"name":"Get User Profile","description":"Get detailed profile information for a specific user","slug":"get_user_profile","ai_risk":{"level":"low","score":1,"reasoning":"This tool fetches detailed user profile information and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"enabled":false,"inputSchema":{"type":"object","properties":{"user_id":{"type":"string","description":"The ID of the user"}},"required":["user_id"]},"action":{"path":"/users.profile.get","method":"GET","mapping":{"query":"{\n \"user\": arguments.user_id,\n \"include_labels\": \"true\"\n }"}}},{"name":"Join Public Channel","description":"Join a public channel","slug":"join_public_channel","ai_risk":{"level":"low","score":4,"reasoning":"This tool allows a user to join a public channel, which modifies the user's channel membership.","calculated_at":"2026-05-22T20:39:57.476Z"},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to join"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.join","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"Find Channel Id","description":"Find the channel id for a given channel name. If the channel is not found and next_cursor is returned, call again with the cursor to search the next batch.","inputSchema":{"type":"object","properties":{"channelName":{"type":"string","description":"Name of the channel (without #)"},"cursor":{"type":"string","description":"Pagination cursor for next batch of channels"}},"required":["channelName"]},"slug":"find-channel-id","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a channel ID based on the name and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"enabled":true,"action":{"path":"/conversations.list","method":"GET","mapping":{"query":"{\n \"limit\": \"1000\",\n \"exclude_archived\": \"true\",\n \"types\": \"public_channel,private_channel\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }","response":"{\n \"channelId\": $exists(response.channels[name = $$.arguments.channelName].id) ? response.channels[name = $$.arguments.channelName].id : ($exists(response.response_metadata.next_cursor) ? \"not found in this batch, call again with cursor\" : \"channel not found\"),\n \"next_cursor\": response.response_metadata.next_cursor\n }"}}},{"name":"Search Messages","slug":"search-messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool searches messages and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"action":{"path":"/search.messages","method":"GET","mapping":{"query":"{\n \"query\": $join([\n arguments.searchText,\n arguments.in ? \"in:\" & arguments.in : \"\",\n arguments.from ? \"from:\" & arguments.from : \"\",\n arguments.exactPhrase ? '\"' & arguments.exactPhrase & '\"' : \"\",\n arguments.after ? \"after:\" & arguments.after : \"\",\n arguments.before ? \"before:\" & arguments.before : \"\"\n ], \" \"),\n \"count\": $number(arguments.count) ? $string(arguments.count) : \"20\",\n \"page\": $number(arguments.page) ? $string(arguments.page) : \"1\"\n }"}},"enabled":true,"annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Keyword search across messages using powerful query operators such as channel, author, phrase, and date. Supports scoping queries like in:#channel, from:<@USER>, \"exact phrase\", after:YYYY-MM-DD, before:YYYY-MM-DD. This is exact keyword matching only — for natural-language / semantic questions use the \"semantic-search\" tool instead. Results are paginated (default 20 per page, max 100); the response's paging.pages gives the page count, so increment page to read further matches.","inputSchema":{"type":"object","required":[],"properties":{"in":{"type":"string","description":"Channel to search in, e.g., '#general'"},"from":{"type":"string","description":"User to search messages from, e.g., '<@USER>'"},"after":{"type":"string","format":"date","description":"Search for messages after this date, format YYYY-MM-DD"},"before":{"type":"string","format":"date","description":"Search for messages before this date, format YYYY-MM-DD"},"searchText":{"type":"string","description":"Text to search for in messages"},"exactPhrase":{"type":"string","description":"Exact phrase to search for"},"count":{"type":"number","description":"Number of matches to return per page (default 20, max 100)","default":20},"page":{"type":"number","description":"Page of results to return, starting at 1 (max 100)","default":1}}}},{"name":"Semantic Search","slug":"semantic-search","ai_risk":{"level":"low","score":1,"reasoning":"This tool performs a read-only semantic/keyword search across the workspace and returns matching messages, files and channels, posing minimal risk.","calculated_at":"2026-07-15T00:00:00.000Z"},"action":{"path":"/assistant.search.context","method":"POST","mapping":{"body":"{\n \"query\": arguments.query,\n \"action_token\": arguments.action_token ? arguments.action_token : undefined,\n \"channel_types\": arguments.channel_types ? arguments.channel_types : undefined,\n \"content_types\": arguments.content_types ? arguments.content_types : undefined,\n \"context_channel_id\": arguments.context_channel_id ? arguments.context_channel_id : undefined,\n \"before\": $exists(arguments.before) ? arguments.before : undefined,\n \"after\": $exists(arguments.after) ? arguments.after : undefined,\n \"include_context_messages\": $exists(arguments.include_context_messages) ? arguments.include_context_messages : undefined,\n \"include_bots\": $exists(arguments.include_bots) ? arguments.include_bots : undefined,\n \"include_archived_channels\": $exists(arguments.include_archived_channels) ? arguments.include_archived_channels : undefined,\n \"disable_semantic_search\": $exists(arguments.disable_semantic_search) ? arguments.disable_semantic_search : undefined,\n \"highlight\": $exists(arguments.highlight) ? arguments.highlight : undefined,\n \"sort\": arguments.sort ? arguments.sort : undefined,\n \"sort_dir\": arguments.sort_dir ? arguments.sort_dir : undefined,\n \"cursor\": arguments.cursor ? arguments.cursor : undefined,\n \"limit\": $exists(arguments.limit) ? (arguments.limit > 20 ? 20 : arguments.limit) : undefined\n }"}},"enabled":true,"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true},"description":"Semantic (AI/natural-language) search across the workspace via Slack's Real-time Search API (assistant.search.context). Accepts a question-shaped query and returns topically relevant messages, files and channels even without exact keyword matches. Use this for natural-language questions like 'What did we decide about the Q3 launch?'. For strict keyword/operator search (in:, from:, exact phrases, dates) use 'search-messages' instead. Note: with a bot token (xoxb-) an action_token from a Slack message event is required; user-token installs work without it.","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"The natural-language question or search prompt, e.g. 'What is the latest on project Gizmo?'. Slack search filters (in:#channel, from:<@USER>, before:YYYY-MM-DD, has:pin, etc.) can also be embedded in the query."},"channel_types":{"type":"array","items":{"type":"string","enum":["public_channel","private_channel","mpim","im"]},"description":"Channel types to search. Defaults to public_channel. Note: private_channel, im and mpim require the corresponding search:read.* user-token scopes."},"content_types":{"type":"array","items":{"type":"string","enum":["messages","files","channels","users"]},"description":"Content types to include in results. Defaults to messages."},"context_channel_id":{"type":"string","description":"Optional channel ID to scope the search to a specific channel."},"before":{"type":"integer","description":"Only return results before this UNIX timestamp (seconds)."},"after":{"type":"integer","description":"Only return results after this UNIX timestamp (seconds)."},"include_context_messages":{"type":"boolean","description":"Include messages surrounding each top result for extra context. Defaults to false."},"include_bots":{"type":"boolean","description":"Whether results should include bot messages."},"include_archived_channels":{"type":"boolean","description":"Whether to include archived channels in the results."},"disable_semantic_search":{"type":"boolean","description":"When true, only keyword-based search is used (no semantic retrieval). Defaults to false."},"highlight":{"type":"boolean","description":"Highlight the matched query terms in the results. Defaults to false."},"sort":{"type":"string","enum":["score","timestamp"],"description":"Field to sort results by. Defaults to score (relevance)."},"sort_dir":{"type":"string","enum":["asc","desc"],"description":"Sort direction. Defaults to desc."},"limit":{"type":"integer","description":"Number of results to return (max 20, default 20)."},"cursor":{"type":"string","description":"Pagination cursor from a previous response's response_metadata.next_cursor."},"action_token":{"type":"string","description":"Required only for bot-token (xoxb-) calls: the action_token received in a Slack message event. Not needed for user-token installs."}}}},{"name":"Find User ID by Email","slug":"find-user-id-by-email","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a user ID by email and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"action":{"path":"/users.lookupByEmail","method":"GET","mapping":{"query":"{ \"email\": arguments.email }"}},"enabled":true,"annotations":{"readOnlyHint":true,"idempotentHint":true},"description":"Retrieves the user ID associated with a given email address in the Slack workspace.","inputSchema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","description":"The email address of the user whose ID you want to find."}}}},{"name":"Schedule Message.","slug":"slack_schedule_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool schedules a message to be posted later, which is a write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"action":{"path":"/chat.scheduleMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"post_at\": $number(arguments.post_at),\n \"text\": arguments.text\n}"}},"enabled":true,"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":true},"description":"Schedules a message to be posted to a Slack channel at a specific time (Unix timestamp). Similar to posting a message, but delayed using chat.scheduleMessage.","inputSchema":{"type":"object","required":["channel_id","post_at","text"],"properties":{"text":{"type":"string","description":"The message text to send."},"post_at":{"type":"number","description":"Unix timestamp (in seconds) for when the message should be posted (must be in the future). Example: 1710000000"},"channel_id":{"type":"string","description":"ID of the channel, private channel, or DM to schedule the message for (e.g., C12345678)."}},"additionalProperties":false}},{"name":"Create Message Draft","slug":"create_message_draft","ai_risk":{"level":"medium","score":4,"reasoning":"This tool writes a compose draft in Slack. It does not send the message until a human posts it.","calculated_at":"2026-09-02T14:25:00.000Z"},"action":{"path":"/drafts.create","method":"POST","mapping":{"body":"(\n $linkRe := /<([^<>|]+)\\|([^>]+)>/;\n $firstMatch := function($s) {(\n $matches := $match($s, $linkRe);\n $exists($matches) ? ($type($matches) = \"array\" ? $matches[0] : $matches) : undefined\n )};\n $parseLinks := function($s) {(\n $m := $firstMatch($s);\n $exists($m) and $exists($m.match) ?\n (\n $before := $substring($s, 0, $m.index);\n $afterStart := $m.index + $length($m.match);\n $after := $substring($s, $afterStart, $length($s) - $afterStart);\n $append(\n $length($before) > 0 ? [{\"type\": \"text\", \"text\": $before}] : [],\n $append(\n [{\"type\": \"link\", \"url\": $m.groups[0], \"text\": $m.groups[1]}],\n $parseLinks($after)\n )\n )\n )\n : $length($s) > 0 ? [{\"type\": \"text\", \"text\": $s}] : []\n )};\n {\n \"client_msg_id\": arguments.client_msg_id,\n \"destinations\": [\n $sift({\n \"channel_id\": arguments.channel_id,\n \"thread_ts\": $exists(arguments.thread_ts) and arguments.thread_ts != \"\" ? arguments.thread_ts : undefined\n }, function($v) { $v != null })\n ],\n \"blocks\": [\n {\n \"type\": \"rich_text\",\n \"elements\": [\n {\n \"type\": \"rich_text_section\",\n \"elements\": $parseLinks(arguments.text)\n }\n ]\n }\n ],\n \"is_from_composer\": $exists(arguments.thread_ts) and arguments.thread_ts != \"\" ? false : true,\n \"file_ids\": []\n }\n)"}},"enabled":true,"annotations":{"readOnlyHint":false,"idempotentHint":false,"destructiveHint":false},"description":"Creates a Slack compose draft in a channel or DM. The message stays in Drafts until a human sends it. Requires a user token (not a bot token). Use the DM channel ID (D…), or open a DM first. client_msg_id must be a fresh UUID on every call. Wrap links as Slack mrkdwn: <https://example.com|Take a look>.","inputSchema":{"type":"object","required":["channel_id","text","client_msg_id"],"properties":{"channel_id":{"type":"string","description":"Channel or DM ID to attach the draft to (e.g. D0123456789 or C0123456789)."},"text":{"type":"string","description":"Draft body. Newlines are kept. Use <https://example.com|label> for labeled links. The message is not sent."},"client_msg_id":{"type":"string","description":"Fresh UUID on every call. Slack rejects reuse."},"thread_ts":{"type":"string","description":"Optional parent message timestamp if this draft should be a thread reply. Omit if unused."}},"additionalProperties":false}},{"name":"Open DM","slug":"open_dm","ai_risk":{"level":"low","score":2,"reasoning":"This tool opens or returns an existing DM. It does not send a message.","calculated_at":"2026-09-02T14:25:00.000Z"},"action":{"path":"/conversations.open","method":"POST","mapping":{"body":"{\n \"users\": arguments.user_ids,\n \"return_im\": true\n}"}},"enabled":true,"annotations":{"readOnlyHint":false,"idempotentHint":true,"destructiveHint":false},"description":"Opens a DM with one or more users and returns the DM channel ID. Use that ID as channel_id on create_message_draft. Does not send a message.","inputSchema":{"type":"object","required":["user_ids"],"properties":{"user_ids":{"type":"string","description":"Comma-separated Slack user IDs to open a DM with (e.g. U0123456789). One ID for a 1:1 DM."}},"additionalProperties":false}},{"name":"Add Reminder","description":"Creates a reminder. Supports one-time and recurring reminders with natural language time descriptions.","slug":"add_reminder","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a reminder, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"text":{"type":"string","description":"The content of the reminder"},"time":{"type":"string","description":"When this reminder should happen: a Unix timestamp (up to five years from now), the number of seconds until the reminder (if within 24 hours), or a natural language description (e.g. \"in 15 minutes\", \"every Thursday\", \"tomorrow\", \"at 3:30pm\")"},"recurrence":{"type":"object","description":"Specify repeating behavior. Set \"frequency\" to daily, weekly, monthly, or yearly. If weekly, optionally include \"weekdays\" array (e.g. [\"monday\", \"wednesday\", \"friday\"])"}},"required":["text","time"]},"enabled":false,"action":{"path":"/reminders.add","method":"POST","mapping":{"body":"{\n \"text\": arguments.text,\n \"time\": arguments.time,\n \"recurrence\": arguments.recurrence ? arguments.recurrence : undefined\n }"}}},{"name":"Complete Reminder","description":"Marks a reminder as complete. Only non-recurring reminders can be completed.","slug":"complete_reminder","ai_risk":{"level":"low","score":4,"reasoning":"This tool marks a reminder as complete, modifying the state of a reminder.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"reminder":{"type":"string","description":"The ID of the reminder to mark as complete (e.g. Rm12345678)"}},"required":["reminder"]},"enabled":false,"action":{"path":"/reminders.complete","method":"POST","mapping":{"body":"{\n \"reminder\": arguments.reminder\n }"}}},{"name":"Delete Reminder","description":"Deletes a reminder.","slug":"delete_reminder","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a reminder, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"reminder":{"type":"string","description":"The ID of the reminder to delete (e.g. Rm12345678)"}},"required":["reminder"]},"enabled":false,"action":{"path":"/reminders.delete","method":"POST","mapping":{"body":"{\n \"reminder\": arguments.reminder\n }"}}},{"name":"Get Reminder Info","description":"Gets information about a specific reminder including its text, time, and completion status.","slug":"get_reminder_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves information about a reminder and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"reminder":{"type":"string","description":"The ID of the reminder (e.g. Rm12345678)"}},"required":["reminder"]},"enabled":false,"action":{"path":"/reminders.info","method":"GET","mapping":{"query":"{\n \"reminder\": arguments.reminder\n }"}}},{"name":"List Reminders","description":"Lists all reminders created by or for the authenticated user.","slug":"list_reminders","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all reminders and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{}},"enabled":false,"action":{"path":"/reminders.list","method":"GET","mapping":{"query":"{}"}}},{"name":"Create Canvas","description":"Create a new standalone canvas, optionally with a title, initial markdown content, and a channel to tab it in.","slug":"create_canvas","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new canvas, which is a write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the canvas"},"document_content":{"type":"object","description":"Initial content of the canvas. Example: {\"type\": \"markdown\", \"markdown\": \"# Hello\\nWorld\"}","properties":{"type":{"type":"string","description":"Content type, e.g. \"markdown\""},"markdown":{"type":"string","description":"Markdown content for the canvas"}}},"channel_id":{"type":"string","description":"Channel ID to automatically tab the canvas in"}}},"enabled":false,"action":{"path":"/canvases.create","method":"POST","mapping":{"body":"{\n \"title\": arguments.title ? arguments.title : undefined,\n \"document_content\": arguments.document_content ? arguments.document_content : undefined,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Update Canvas","description":"Update an existing canvas by applying a change operation (insert_at_start, insert_at_end, insert_before, insert_after, replace, delete, rename).","slug":"update_canvas","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates an existing canvas, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"changes":{"type":"array","description":"List of changes to apply. Each change requires an \"operation\" and a \"document_content\" (with \"type\" and \"markdown\"). Operations insert_before/insert_after/replace/delete also require a \"section_id\". Use \"rename\" with \"title_content\" to rename the canvas.","items":{"type":"object"}}},"required":["canvas_id","changes"]},"enabled":false,"action":{"path":"/canvases.edit","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"changes\": arguments.changes\n }"}}},{"name":"Read Canvas","description":"Look up sections within a canvas by section type (h1, h2, h3, any_header) and/or contained text. Returns section IDs that can be used to target edits.","slug":"read_canvas","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves sections from a canvas and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"criteria":{"type":"object","description":"Filtering criteria. Example: {\"section_types\": [\"any_header\"], \"contains_text\": \"Project Status\"}","properties":{"section_types":{"type":"array","description":"Section types to filter on: \"h1\", \"h2\", \"h3\", \"any_header\"","items":{"type":"string"}},"contains_text":{"type":"string","description":"Filter sections that contain this text"}}}},"required":["canvas_id","criteria"]},"enabled":false,"action":{"path":"/canvases.sections.lookup","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"criteria\": arguments.criteria\n }"}}},{"name":"Create Channel Canvas","description":"Create the native canvas tab directly on a channel.","slug":"create_channel_canvas","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a canvas tab in a channel, which is a write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to create the canvas in"},"document_content":{"type":"object","description":"Initial content of the canvas. Example: {\"type\": \"markdown\", \"markdown\": \"# Hello\\nWorld\"}","properties":{"type":{"type":"string","description":"Content type, e.g. \"markdown\""},"markdown":{"type":"string","description":"Markdown content for the canvas"}}}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.canvases.create","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"document_content\": arguments.document_content ? arguments.document_content : undefined\n }"}}},{"name":"Delete Canvas","description":"Delete a canvas by ID.","slug":"delete_canvas","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a canvas, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas to delete (e.g. F1234ABCD)"}},"required":["canvas_id"]},"enabled":false,"action":{"path":"/canvases.delete","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id\n }"}}},{"name":"Set Canvas Access","description":"Control who can view or edit a canvas. Provide either user_ids or channel_id.","slug":"set_canvas_access","ai_risk":{"level":"medium","score":6,"reasoning":"This tool controls access to a canvas, which can significantly affect who can view or edit it.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"access_level":{"type":"string","description":"Access level to grant: \"read\" or \"write\"","enum":["read","write"]},"user_ids":{"type":"array","description":"List of user IDs to grant access to","items":{"type":"string"}},"channel_id":{"type":"string","description":"Channel ID to grant access to"}},"required":["canvas_id","access_level"]},"enabled":false,"action":{"path":"/canvases.access.set","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"access_level\": arguments.access_level,\n \"user_ids\": arguments.user_ids ? arguments.user_ids : undefined,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Remove Canvas Access","description":"Revoke access to a canvas. Provide either user_ids or channel_id.","slug":"remove_canvas_access","ai_risk":{"level":"medium","score":6,"reasoning":"This tool revokes access to a canvas, which can significantly affect user permissions.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"canvas_id":{"type":"string","description":"Encoded ID of the canvas (e.g. F1234ABCD)"},"user_ids":{"type":"array","description":"List of user IDs to revoke access from","items":{"type":"string"}},"channel_id":{"type":"string","description":"Channel ID to revoke access from"}},"required":["canvas_id"]},"enabled":false,"action":{"path":"/canvases.access.delete","method":"POST","mapping":{"body":"{\n \"canvas_id\": arguments.canvas_id,\n \"user_ids\": arguments.user_ids ? arguments.user_ids : undefined,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Create Channel","description":"Create a public or private Slack channel.","slug":"create_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new Slack channel, which is a write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Name of the channel (lowercase, no spaces)"},"is_private":{"type":"boolean","description":"Whether the channel should be private (default false)"}},"required":["name"]},"enabled":false,"action":{"path":"/conversations.create","method":"POST","mapping":{"body":"{\n \"name\": arguments.name,\n \"is_private\": $exists(arguments.is_private) ? arguments.is_private : undefined\n }"}}},{"name":"Archive Channel","description":"Archive a Slack channel.","slug":"archive_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool archives a channel, which modifies the state of the channel.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to archive"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.archive","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"Rename Channel","description":"Rename a Slack channel.","slug":"rename_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool renames a channel, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to rename"},"name":{"type":"string","description":"New name for the channel (lowercase, no spaces)"}},"required":["channel_id","name"]},"enabled":false,"action":{"path":"/conversations.rename","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"name\": arguments.name\n }"}}},{"name":"Invite To Channel","description":"Add one or more users to a Slack channel.","slug":"invite_to_channel","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds users to a channel, modifying channel membership.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"user_ids":{"type":"array","description":"List of user IDs to invite","items":{"type":"string"}}},"required":["channel_id","user_ids"]},"enabled":false,"action":{"path":"/conversations.invite","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"users\": $join(arguments.user_ids, \",\")\n }"}}},{"name":"Kick From Channel","description":"Remove a user from a Slack channel.","slug":"kick_from_channel","ai_risk":{"level":"medium","score":6,"reasoning":"This tool removes a user from a channel, which can significantly affect user access.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"user_id":{"type":"string","description":"The ID of the user to remove"}},"required":["channel_id","user_id"]},"enabled":false,"action":{"path":"/conversations.kick","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"user\": arguments.user_id\n }"}}},{"name":"Set Channel Topic","description":"Set the topic for a Slack channel.","slug":"set_channel_topic","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sets the topic for a channel, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"topic":{"type":"string","description":"The new topic for the channel"}},"required":["channel_id","topic"]},"enabled":false,"action":{"path":"/conversations.setTopic","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"topic\": arguments.topic\n }"}}},{"name":"Set Channel Purpose","description":"Set the purpose for a Slack channel.","slug":"set_channel_purpose","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sets the purpose for a channel, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"purpose":{"type":"string","description":"The new purpose for the channel"}},"required":["channel_id","purpose"]},"enabled":false,"action":{"path":"/conversations.setPurpose","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"purpose\": arguments.purpose\n }"}}},{"name":"Get Channel Info","description":"Get full metadata for a Slack channel.","slug":"get_channel_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves metadata for a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.info","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"List Channel Members","description":"List all member IDs in a Slack channel.","slug":"list_channel_members","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all members in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"limit":{"type":"number","description":"Maximum number of members to return (default 100)","default":100},"cursor":{"type":"string","description":"Pagination cursor for next page of results"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/conversations.members","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"limit\": $number(arguments.limit) ? $string(arguments.limit) : \"100\",\n \"cursor\": arguments.cursor ? arguments.cursor : undefined\n }"}}},{"name":"Add Bookmark","description":"Add a link to the channel bookmarks bar.","slug":"add_bookmark","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds a bookmark to a channel, which modifies channel content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"title":{"type":"string","description":"Display title for the bookmark"},"link":{"type":"string","description":"URL for the bookmark"},"emoji":{"type":"string","description":"Emoji icon for the bookmark (e.g. ':star:')"}},"required":["channel_id","title","link"]},"enabled":false,"action":{"path":"/bookmarks.add","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"title\": arguments.title,\n \"link\": arguments.link,\n \"type\": \"link\",\n \"emoji\": arguments.emoji ? arguments.emoji : undefined\n }"}}},{"name":"List Bookmarks","description":"List all bookmarks in a channel.","slug":"list_bookmarks","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all bookmarks in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/bookmarks.list","method":"GET","mapping":{"query":"{\n \"channel_id\": arguments.channel_id\n }"}}},{"name":"Edit Bookmark","description":"Update a bookmark's title or link.","slug":"edit_bookmark","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates a bookmark's title or link, which modifies existing content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"bookmark_id":{"type":"string","description":"The ID of the bookmark to edit"},"title":{"type":"string","description":"New title for the bookmark"},"link":{"type":"string","description":"New URL for the bookmark"}},"required":["channel_id","bookmark_id"]},"enabled":false,"action":{"path":"/bookmarks.edit","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"bookmark_id\": arguments.bookmark_id,\n \"title\": arguments.title ? arguments.title : undefined,\n \"link\": arguments.link ? arguments.link : undefined\n }"}}},{"name":"Remove Bookmark","description":"Remove a bookmark from a channel.","slug":"remove_bookmark","ai_risk":{"level":"medium","score":5,"reasoning":"This tool removes a bookmark from a channel, which modifies channel content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"},"bookmark_id":{"type":"string","description":"The ID of the bookmark to remove"}},"required":["channel_id","bookmark_id"]},"enabled":false,"action":{"path":"/bookmarks.remove","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"bookmark_id\": arguments.bookmark_id\n }"}}},{"name":"Pin Message","description":"Pin a message in a channel.","slug":"pin_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool pins a message in a channel, which modifies the state of the message.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message to pin"}},"required":["channel_id","timestamp"]},"enabled":false,"action":{"path":"/pins.add","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp\n }"}}},{"name":"Unpin Message","description":"Unpin a message in a channel.","slug":"unpin_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool unpins a message in a channel, which modifies the state of the message.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message to unpin"}},"required":["channel_id","timestamp"]},"enabled":false,"action":{"path":"/pins.remove","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp\n }"}}},{"name":"List Pins","description":"List all pinned items in a channel.","slug":"list_pins","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all pinned items in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel"}},"required":["channel_id"]},"enabled":false,"action":{"path":"/pins.list","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id\n }"}}},{"name":"Update Message","description":"Edit an existing Slack message.","slug":"update_message","ai_risk":{"level":"medium","score":5,"reasoning":"This tool edits an existing message, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"ts":{"type":"string","description":"The timestamp of the message to update"},"text":{"type":"string","description":"New text for the message"},"blocks":{"type":"array","description":"New Block Kit blocks for the message","items":{"type":"object"}}},"required":["channel_id","ts","text"]},"enabled":false,"action":{"path":"/chat.update","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"ts\": arguments.ts,\n \"text\": arguments.text,\n \"blocks\": arguments.blocks ? arguments.blocks : undefined\n }"}}},{"name":"Delete Message","description":"Delete a Slack message.","slug":"delete_message","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a message, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"ts":{"type":"string","description":"The timestamp of the message to delete"}},"required":["channel_id","ts"]},"enabled":false,"action":{"path":"/chat.delete","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"ts\": arguments.ts\n }"}}},{"name":"Get Permalink","description":"Get a permanent link to a Slack message.","slug":"get_permalink","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves a permanent link to a message and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"message_ts":{"type":"string","description":"The timestamp of the message"}},"required":["channel_id","message_ts"]},"enabled":false,"action":{"path":"/chat.getPermalink","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"message_ts\": arguments.message_ts\n }"}}},{"name":"List Scheduled Messages","description":"List all pending scheduled messages.","slug":"list_scheduled_messages","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all pending scheduled messages and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"Filter by channel ID (optional)"}}},"enabled":false,"action":{"path":"/chat.scheduledMessages.list","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id ? arguments.channel_id : undefined\n }"}}},{"name":"Delete Scheduled Message","description":"Cancel a scheduled message before it is sent.","slug":"delete_scheduled_message","ai_risk":{"level":"medium","score":6,"reasoning":"This tool cancels a scheduled message, which is a destructive operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel the message was scheduled for"},"scheduled_message_id":{"type":"string","description":"The ID of the scheduled message to cancel"}},"required":["channel_id","scheduled_message_id"]},"enabled":false,"action":{"path":"/chat.deleteScheduledMessage","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"scheduled_message_id\": arguments.scheduled_message_id\n }"}}},{"name":"List Files","description":"List files in a channel.","slug":"list_files","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists files in a channel and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to list files from"},"limit":{"type":"number","description":"Maximum number of files to return (default 20)","default":20}},"required":["channel_id"]},"enabled":false,"action":{"path":"/files.list","method":"GET","mapping":{"query":"{\n \"channel\": arguments.channel_id,\n \"count\": $number(arguments.limit) ? $string(arguments.limit) : \"20\"\n }"}}},{"name":"Delete File","description":"Delete a file.","slug":"delete_file","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a file, which is a destructive operation that modifies existing data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"file_id":{"type":"string","description":"The ID of the file to delete"}},"required":["file_id"]},"enabled":false,"action":{"path":"/files.delete","method":"POST","mapping":{"body":"{\n \"file\": arguments.file_id\n }"}}},{"name":"Get File Info","description":"Get metadata for a Slack file by its ID, including its download URL (url_private_download), name, mimetype, and size. Use the returned URL with the Download File tool.","slug":"get_file_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves metadata about a single file and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"file_id":{"type":"string","description":"The ID of the file (e.g. F1234ABCD)"}},"required":["file_id"]},"enabled":false,"action":{"path":"/files.info","method":"GET","mapping":{"query":"{\n \"file\": arguments.file_id\n }"}}},{"name":"Download File","description":"Download the binary contents of a Slack file. Provide the file's private URL — the `url_private_download` (or `url_private`) field from a file object returned by List Files, Get File Info, or Get Channel History. Returns the file as a base64-encoded resource.","slug":"download_file","ai_risk":{"level":"low","score":1,"reasoning":"This tool downloads the contents of an existing file and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"The private download URL of the file (the `url_private_download` or `url_private` field from a Slack file object)."}},"required":["url"]},"enabled":false,"action":{"path":"{url}","method":"GET","responseType":"arraybuffer","mapping":{"params":"{ \"url\": arguments.url }"}}},{"name":"Get Upload URL","description":"Step 1 of uploading a file to Slack. Reserves an upload URL and a file ID for a file of the given name and size. Then call Upload File Content with the returned `upload_url` to send the file bytes, and finally call Complete Upload with the file ID to finalize and share it.","slug":"get_upload_url","ai_risk":{"level":"low","score":2,"reasoning":"This tool reserves an upload destination but does not create or modify shared content on its own, posing low risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"idempotentHint":false},"inputSchema":{"type":"object","properties":{"filename":{"type":"string","description":"Name of the file being uploaded (including extension)"},"length":{"type":"number","description":"Size of the file in bytes"},"alt_text":{"type":"string","description":"Description of image for screen readers (optional)"},"snippet_type":{"type":"string","description":"Syntax type of the snippet being uploaded, e.g. 'text', 'python' (optional)"}},"required":["filename","length"]},"enabled":false,"action":{"path":"/files.getUploadURLExternal","method":"GET","mapping":{"query":"{\n \"filename\": arguments.filename,\n \"length\": $string(arguments.length),\n \"alt_text\": arguments.alt_text ? arguments.alt_text : undefined,\n \"snippet_type\": arguments.snippet_type ? arguments.snippet_type : undefined\n }"}}},{"name":"Upload File Content","description":"Step 2 of uploading a file to Slack. Sends the file bytes (as base64) to the `upload_url` returned by Get Upload URL. The file is not visible in Slack until Complete Upload finalizes it with the file ID from Get Upload URL. Pass the same `filename` you gave Get Upload URL, and make sure `length` there matched the decoded size in bytes.","slug":"upload_file_content","ai_risk":{"level":"low","score":3,"reasoning":"This tool sends bytes to a pre-signed Slack upload URL. The file stays private and unshared until Complete Upload is called.","calculated_at":"2026-10-18T00:00:00.000Z"},"annotations":{"idempotentHint":true},"inputSchema":{"type":"object","properties":{"upload_url":{"type":"string","description":"The `upload_url` returned by Get Upload URL"},"data":{"type":"string","description":"File content encoded as a base64 string. It is sent as multipart/form-data."},"filename":{"type":"string","description":"Name of the file (including extension), the same one passed to Get Upload URL"},"mime_type":{"type":"string","description":"MIME type of the file, e.g. 'image/png' (optional, defaults to application/octet-stream)"}},"required":["upload_url","data","filename"]},"enabled":false,"action":{"path":"{url}","method":"POST","responseType":"text","mapping":{"headers":"{ \"Content-Type\": \"multipart/form-data\" }","params":"{ \"url\": arguments.upload_url }","body":"{\n \"file\": {\n \"data\": arguments.data,\n \"filename\": arguments.filename,\n \"mimeType\": arguments.mime_type ? arguments.mime_type : \"application/octet-stream\"\n }\n }"}}},{"name":"Complete Upload","description":"Final step of uploading a file to Slack. Finalizes one or more files whose bytes were already POSTed to the `upload_url` from Get Upload URL, and optionally shares them to a channel or thread. Provide the file ID(s) returned by Get Upload URL.","slug":"complete_upload","ai_risk":{"level":"medium","score":5,"reasoning":"This tool finalizes and shares uploaded files, which is a standard write operation on business data.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"files":{"type":"array","description":"List of files to finalize. Each item requires the file `id` returned by Get Upload URL and may include an optional `title`.","items":{"type":"object","properties":{"id":{"type":"string","description":"The file ID returned by Get Upload URL"},"title":{"type":"string","description":"Optional display title for the file"}},"required":["id"]}},"channel_id":{"type":"string","description":"ID of the channel to share the file(s) in (optional). If omitted the file is created but not shared."},"initial_comment":{"type":"string","description":"Message text to post with the shared file (optional)"},"thread_ts":{"type":"string","description":"Timestamp of the parent message to share the file into a thread (optional)"}},"required":["files"]},"enabled":false,"action":{"path":"/files.completeUploadExternal","method":"POST","mapping":{"body":"{\n \"files\": arguments.files,\n \"channel_id\": arguments.channel_id ? arguments.channel_id : undefined,\n \"initial_comment\": arguments.initial_comment ? arguments.initial_comment : undefined,\n \"thread_ts\": arguments.thread_ts ? arguments.thread_ts : undefined\n }"}}},{"name":"Remove Reaction","description":"Remove an emoji reaction from a message.","slug":"remove_reaction","ai_risk":{"level":"medium","score":5,"reasoning":"This tool removes an emoji reaction from a message, which modifies existing content.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel containing the message"},"timestamp":{"type":"string","description":"The timestamp of the message"},"name":{"type":"string","description":"The name of the emoji reaction to remove (without colons)"}},"required":["channel_id","timestamp","name"]},"enabled":false,"action":{"path":"/reactions.remove","method":"POST","mapping":{"body":"{\n \"channel\": arguments.channel_id,\n \"timestamp\": arguments.timestamp,\n \"name\": arguments.name\n }"}}},{"name":"Create List","description":"Create a structured list (table) in a channel.","slug":"create_list","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a structured list in a channel, which is a write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"channel_id":{"type":"string","description":"The ID of the channel to create the list in"},"name":{"type":"string","description":"Name of the list"},"columns":{"type":"array","description":"Column definitions. Each column needs \"name\" and \"type\" (e.g. \"text\", \"number\", \"date\", \"person\", \"checkbox\")","items":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"}}}}},"required":["channel_id","name","columns"]},"enabled":false,"action":{"path":"/lists.create","method":"POST","mapping":{"body":"{\n \"channel_id\": arguments.channel_id,\n \"name\": arguments.name,\n \"columns\": arguments.columns\n }"}}},{"name":"Add List Item","description":"Add a row to a Slack list.","slug":"add_list_item","ai_risk":{"level":"medium","score":5,"reasoning":"This tool adds a row to a list, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"},"values":{"type":"object","description":"Key-value pairs for each column in the list row"}},"required":["list_id","values"]},"enabled":false,"action":{"path":"/slackLists.items.create","method":"POST","mapping":{"body":"{\n \"list_id\": arguments.list_id,\n \"values\": arguments.values\n }"}}},{"name":"Update List Item","description":"Update a row in a Slack list.","slug":"update_list_item","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates a row in a list, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"},"item_id":{"type":"string","description":"The ID of the row to update"},"values":{"type":"object","description":"Key-value pairs with updated column values"}},"required":["list_id","item_id","values"]},"enabled":false,"action":{"path":"/slackLists.items.update","method":"POST","mapping":{"body":"{\n \"list_id\": arguments.list_id,\n \"item_id\": arguments.item_id,\n \"values\": arguments.values\n }"}}},{"name":"Delete List Item","description":"Delete a row from a Slack list.","slug":"delete_list_item","ai_risk":{"level":"medium","score":6,"reasoning":"This tool deletes a row from a list, which is a destructive operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"},"item_id":{"type":"string","description":"The ID of the row to delete"}},"required":["list_id","item_id"]},"enabled":false,"action":{"path":"/slackLists.items.delete","method":"POST","mapping":{"body":"{\n \"list_id\": arguments.list_id,\n \"item_id\": arguments.item_id\n }"}}},{"name":"List List Items","description":"Retrieve all rows from a Slack list.","slug":"list_list_items","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves all rows from a list and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"list_id":{"type":"string","description":"The ID of the list"}},"required":["list_id"]},"enabled":false,"action":{"path":"/slackLists.items.list","method":"GET","mapping":{"query":"{\n \"list_id\": arguments.list_id\n }"}}},{"name":"Create User Group","description":"Create a new user group (a @mention group).","slug":"create_user_group","ai_risk":{"level":"medium","score":5,"reasoning":"This tool creates a new user group, which is a write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Display name of the user group"},"handle":{"type":"string","description":"Handle used to @mention the group (without @)"},"description":{"type":"string","description":"Description of the user group"},"user_ids":{"type":"array","description":"Initial list of user IDs to add to the group","items":{"type":"string"}}},"required":["name","handle"]},"enabled":false,"action":{"path":"/usergroups.create","method":"POST","mapping":{"body":"{\n \"name\": arguments.name,\n \"handle\": arguments.handle,\n \"description\": arguments.description ? arguments.description : undefined,\n \"users\": arguments.user_ids ? $join(arguments.user_ids, \",\") : undefined\n }"}}},{"name":"Update User Group","description":"Update a user group's name or handle.","slug":"update_user_group","ai_risk":{"level":"medium","score":5,"reasoning":"This tool updates a user group's name or handle, which is a standard write operation.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"usergroup_id":{"type":"string","description":"The ID of the user group"},"name":{"type":"string","description":"New display name for the user group"},"handle":{"type":"string","description":"New handle for the user group (without @)"}},"required":["usergroup_id"]},"enabled":false,"action":{"path":"/usergroups.update","method":"POST","mapping":{"body":"{\n \"usergroup\": arguments.usergroup_id,\n \"name\": arguments.name ? arguments.name : undefined,\n \"handle\": arguments.handle ? arguments.handle : undefined\n }"}}},{"name":"Update User Group Members","description":"Set the complete list of members for a user group.","slug":"update_user_group_members","ai_risk":{"level":"medium","score":6,"reasoning":"This tool sets the complete list of members for a user group, which can significantly affect group membership.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"usergroup_id":{"type":"string","description":"The ID of the user group"},"user_ids":{"type":"array","description":"Complete list of user IDs that should be in the group","items":{"type":"string"}}},"required":["usergroup_id","user_ids"]},"enabled":false,"action":{"path":"/usergroups.users.update","method":"POST","mapping":{"body":"{\n \"usergroup\": arguments.usergroup_id,\n \"users\": $join(arguments.user_ids, \",\")\n }"}}},{"name":"List User Groups","description":"List all user groups in the workspace.","slug":"list_user_groups","ai_risk":{"level":"low","score":1,"reasoning":"This tool lists all user groups and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{}},"enabled":false,"action":{"path":"/usergroups.list","method":"GET","mapping":{"query":"{}"}}},{"name":"Get Workspace Info","description":"Get workspace name, domain, and ID.","slug":"get_workspace_info","ai_risk":{"level":"low","score":1,"reasoning":"This tool retrieves workspace information and is read-only, posing minimal risk.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"readOnlyHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{}},"enabled":false,"action":{"path":"/team.info","method":"GET","mapping":{"query":"{}"}}},{"name":"Set User Status","description":"Set the authenticated user's Slack status.","slug":"set_user_status","ai_risk":{"level":"medium","score":5,"reasoning":"This tool sets the user's Slack status, which modifies user profile information.","calculated_at":"2026-05-22T20:39:57.476Z"},"annotations":{"destructiveHint":true},"inputSchema":{"type":"object","properties":{"status_text":{"type":"string","description":"Status message text (max 100 characters)"},"status_emoji":{"type":"string","description":"Emoji for the status (e.g. ':palm_tree:')"},"status_expiration":{"type":"number","description":"Unix timestamp when the status should clear (0 or omit for no expiration)"}},"required":["status_text","status_emoji"]},"enabled":false,"action":{"path":"/users.profile.set","method":"POST","mapping":{"body":"{\n \"profile\": {\n \"status_text\": arguments.status_text,\n \"status_emoji\": arguments.status_emoji,\n \"status_expiration\": $exists(arguments.status_expiration) ? arguments.status_expiration : 0\n }\n }"}}}]}}
|