Slack Tools
Compare all-tools, selected-function, and read-only SlackTools configurations for messaging, channel listing, history, and file access.
"""
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/activateInstall dependencies
uv pip install -U agno openai slack-sdkExport 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.pyFull source: cookbook/91_tools/slack_tools.py