Skip to content

Feature: Add slack_set_status, slack_set_dnd, and OOO write tools #40

Description

@kaushikprajapati

Problem

The Slack MCP plugin currently exposes read tools and message-send tools, but no way for an AI agent to update the user's profile status, set or clear DND, or configure an out-of-office state. Every "set me OOO from X to Y" workflow has to bounce back to the user halfway through to click through Slack's UI — which defeats the point of an agent integration for one of the most common asks.

The underlying Web API endpoints already exist; they just aren't surfaced as MCP tools.

Proposed solution

Add three (optionally four) tools that wrap existing Slack Web API methods:

  1. slack_set_status — wraps users.profile.set

    • Params: status_text (string, ≤100 chars), status_emoji (e.g. :palm_tree:), status_expiration (Unix timestamp; 0 = no expiration)
    • Required scope: users.profile:write
  2. slack_set_dnd — wraps dnd.setSnooze

    • Param: num_minutes (int)
    • Required scope: dnd:write
  3. slack_end_dnd — wraps dnd.endSnooze

    • No params
    • Required scope: dnd:write
  4. slack_set_ooo (composite, optional but high-value) — single call that takes start_ts, end_ts, status_text, status_emoji and:

    • Sets status with status_expiration = end_ts (Slack auto-clears at the end)
    • Sets DND for (end_ts − start_ts) minutes
    • Done in one tool call instead of an agent orchestrating four lower-level calls plus its own scheduler.

Adjacent quality-of-life:

  • Extend slack_read_user_profile concise output to include status_text, status_emoji, status_expiration (already in the upstream API response — just plumb through).
  • Surface the new write scopes in the OAuth install screen so users re-consent once instead of hitting missing_scope per tool.
  • Optionally add slack_set_presence (wraps users.setPresence, auto | away).

All four tools are user-scoped writes — they only affect the authenticated user's own profile and DND, no admin or workspace-wide impact.

Use case

A PM asks their agent: "Set up OOO on Slack from Jun 1 through Jun 4, I'll be checking periodically." The agent can already:

  • Draft the OOO message
  • Schedule a heads-up post in their team channel via slack_schedule_message
  • Read current DND state via slack_read_user_profile

…but cannot actually set the status emoji + text, cannot pause notifications, and cannot schedule those changes for a future date. The user is forced to click through Slack → avatar → Update your status → Set custom status → Choose date and time → Pause notifications themselves — which is exactly the multi-step UI navigation the agent integration is supposed to eliminate.

This came up in a real session today. Drafting the message, scheduling the channel post, and reading DND were all handled by the MCP tools in seconds; the actual OOO toggle had to be punted back to the user.

Risk

Low. All four endpoints are user-scoped and well-trodden in Slack's API surface. Status text could leak unintended content if hallucinated — the same _draft pattern used by slack_send_message_draft would address this for slack_set_status if needed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    discussionM-T: An issue where more input is needed to reach a decisionenhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions