Slack Tools

Compare all-tools, selected-function, and read-only SlackTools configurations for messaging, channel listing, history, and file access.

slack_tools.py
"""
Slack Tools
===========

Environment variables:
    SLACK_TOKEN         Bot token (xoxb-) for standard Slack APIs
    SLACK_USER_TOKEN    User token (xoxp-) required for search_messages

Run: pip install openai slack-sdk
"""

from agno.agent import Agent
from agno.tools.slack import SlackTools

# ---------------------------------------------------------------------------
# Create Agent
# ---------------------------------------------------------------------------


# Example 1: Enable all Slack tools
agent_all = Agent(
    tools=[
        SlackTools(
            all=True,  # Enable all Slack tools
        )
    ],
    markdown=True,
)

# Example 2: Enable specific tools only
agent_specific = Agent(
    tools=[
        SlackTools(
            enable_send_message=True,
            enable_list_channels=True,
            enable_get_channel_history=False,
            enable_upload_file=False,
            enable_download_file=False,
        )
    ],
    markdown=True,
)

# Example 3: Read-only agent (no send_message)
agent_readonly = Agent(
    tools=[
        SlackTools(
            enable_send_message=False,
            enable_list_channels=True,
            enable_get_channel_history=True,
            enable_upload_file=False,
            enable_download_file=True,
        )
    ],
    markdown=True,
)

# Run examples

# ---------------------------------------------------------------------------
# Run Agent
# ---------------------------------------------------------------------------
if __name__ == "__main__":
    agent_all.print_response(
        "Send 'Hello from Agno!' to #general",
        stream=True,
    )

    agent_specific.print_response(
        "List all channels in the workspace",
        stream=True,
    )

    agent_readonly.print_response(
        "Get the last 5 messages from #general",
        stream=True,
    )

Configure the three examples

Install your Slack app in the workspace and invite its bot to the target channel. Replace #general with that channel's ID or name. These prompts need chat:write, channels:read, and channels:history for a public channel. Add users:read to resolve display names; private-channel discovery and history need the corresponding groups:read and groups:history scopes. Reinstall the app after changing scopes.

The first prompt posts an actual message. For this standalone example, replace SlackTools(all=True) with SlackTools(include_tools=["send_message", "list_channels"]). The broader all=True configuration also exposes workspace search, which needs Slack event context and additional scopes.

In agent_readonly, add enable_send_message_thread=False: disabling send_message alone still leaves thread replies enabled. The user token is optional for these three prompts; it is needed only if you additionally enable legacy search_messages.

Channel listing follows pagination over visible, unarchived channels; private channels require include_private=True. History returns one batch, not an exhaustive channel archive. See Slack history access for membership and token requirements.

Run the Example

Set up your virtual environment

uv venv --python 3.12
source .venv/bin/activate

Install dependencies

uv pip install -U agno openai slack-sdk

Export environment variables

export OPENAI_API_KEY="your_openai_api_key_here"
export SLACK_TOKEN="your_slack_token_here"

Run the example

Save the code above as slack_tools.py, then run:

python slack_tools.py

Full source: cookbook/91_tools/slack_tools.py