— With support for Slack's optional arguments
This Action allows you to send messages (and reactions/threads/update/blocks/file uploads) to Slack from your Github Actions. Supports Slack's required arguments as well as all the optional once. It's JavaScript-based and thus fast to run.
The goal is to have zero npm production dependencies except @actions/core which is required for an action to work.

This action is just an HTTPS call to Slack API, so you can easily build this by yourself, or use this action or any one of the hundred other Slack actions available.
With the latest changes to Slack API, please use channel id instead of channel name. E.g. use CPPUV5KU0 instead of test (You can find the ID in the API calls or https://stackoverflow.com/questions/40940327/what-is-the-simplest-way-to-find-a-slack-team-id-and-a-channel-id)
This action supports:




Required: Github Repository Secret:
SLACK_BOT_USER_OAUTH_ACCESS_TOKEN - This is the Slack App token, the credentials for allowing you to send messages from github to SlackRequired: Github Action Parameters:
slack-bot-user-oauth-access-token - SLACK_BOT_USER_OAUTH_ACCESS_TOKEN secret
slack-channel - The channel/channels where you want the message (comma separated)
slack-text - The text of the message (or use slack-optional-blocks)
Optional: Github Action Parameters:
All the optional parameters that Slack supports, can be sent via the slack-optional-xxx parameter.
| Slack parameter name | Yaml parameter name |
|---|---|
icon_emoji |
slack-optional-icon_emoji |
link_names |
slack-optional-link_names |
and so forth.
Please see Slack API documentation for all available optional parameters: https://api.slack.com/methods/chat.postMessage
Result / return value
slack-result (.outputs.slack-result) - Contains the result of the sent message. This can be used for following steps like sending a reactionSample slack-result:
{
"statusCode": 200,
"statusMessage": "OK",
"ok": true,
"result": "<deprecated - same as response but as string>",
"response": {
"ok": true,
"channel": "XXXX",
"ts": "1612623790.009600",
"message": {
"type": "message",
"subtype": "bot_message",
"text": "Lipsum",
"ts": "1612623790.009600",
"username": "Lipsum",
"bot_id": "XXXX"
}
}
}
If you want to output or debug the result, add:
- name: Send Slack Message Result
run: echo "${{ steps.send-message.outputs.slack-result }}"
slack-results (.outputs.slack-results) - Contains an array of all the results when sending to multiple channels. This can be used for following steps like sending a reaction. See .github/workflows/7-slack-notification-multi-channel.yml.github/workflows/2-slack-notification.yml
This will send a Slack message every time someone push, creates pull request or create an issue
name: slack-notification
on: [push, pull_request, issues]
jobs:
slack-notifications:
runs-on: ubuntu-24.04
name: Sends a message to Slack when a push, a pull request or an issue is made
steps:
- name: Send message to Slack API
uses: archive/github-actions-slack@v2.0.0
id: notify
with:
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: CPPUV5KU0
slack-text: Hello! Event "${{ github.event_name }}" in "${{ github.repository }}" 🤓
- name: Result from "Send Message"
run: echo "The result was ${{ steps.notify.outputs.slack-result }}"

.github/workflows/2-slack-notification.yml
name: slack-notification-with-optional-parameters
on: [push, pull_request, issues]
jobs:
slack-notification-with-optional-parameters:
runs-on: ubuntu-24.04
name: Sends a message to Slack when a push, a pull request or an issue is made
steps:
- name: Send message to Slack API
uses: archive/github-actions-slack@v2.0.0
id: notify
with:
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: CPPUV5KU0 #USE CHANNEL ID, NOT CHANNEL NAME, SINCE ID IS USED IN NEW SLACK API's
slack-text: Hello! Something is burning! Or not...
slack-optional-icon_emoji: ":fire:"
- name: Result from "Send Message"
run: echo "The result was ${{ steps.notify.outputs.slack-result }}"

To send a thread response you have the same setup as for sending a message, but you add some extra optional parameters:
slack-optional-thread_ts - The timestamp of the message you want to reply/send thread to. You can find the timestamp in the response payload after sending a message
slack-optional-reply_broadcast - To broadcast thread reply in channel
.github/workflows/4-slack-thread.yml
See Send Thread Message part below:
name: slack-thread
on: [push, issues]
jobs:
slack-thread:
runs-on: ubuntu-24.04
name: Sends a message to Slack when a push, a pull request or an issue is made
steps:
- name: Send Slack Message
uses: archive/github-actions-slack@master
id: send-message
with:
slack-function: send-message
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: CPPUV5KU0
slack-text: This is a message
- name: Send "Slack Message" Result
run: echo "Data - ${{ steps.send-message.outputs.slack-result }}"
- name: Some step in between
run: echo "..."
- name: Send Thread Message
uses: archive/github-actions-slack@master
with:
slack-function: send-message
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }}
slack-text: This is a thread reply
slack-optional-thread_ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }}
#slack-optional-reply_broadcast: true # To broadcast thread reply in channel
- name: Send "Send Thread Message" Result
run: echo "Data - ${{ steps.send-message.outputs.slack-result }}"

Required: Github Repository Secret:
SLACK_BOT_USER_OAUTH_ACCESS_TOKEN - This is the Slack App token, the credentials for allowing you to send messages from github to SlackRequired: Github Action Parameters:
slack-bot-user-oauth-access-token - SLACK_BOT_USER_OAUTH_ACCESS_TOKEN secret
slack-channel - The channel where you want the message. You can find the channel id in the response payload after sending a message
slack-emoji-name - The name of the emoji to send (e.g. "fire"/"thumbsup")
slack-message-timestamp - The unique ts/timestamp of the message you want to react to. You can find the timestamp in the response payload after sending a message
Result / return value
slack-result (.outputs.slack-result) - Contains the result of the sent reaction.github/workflows/3-slack-reaction.yml
This will send a Slack message every time someone push, creates pull request or create an issue, and then, create a reaction to it
name: slack-reaction
on: [push, issues]
jobs:
slack-reaction:
runs-on: ubuntu-24.04
name: Sends a message to Slack when a push, a pull request or an issue is made
steps:
- name: Send Slack Message
uses: archive/github-actions-slack@v2.0.0
id: send-message
with:
slack-function: send-message
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: CPPUV5KU0
slack-text: Time to react...
- name: Send Slack Message Result
run: echo "Data - ${{ steps.send-message.outputs.slack-result }}"
- name: Some step in between
run: echo "..."
- name: Send Slack Reaction To Message
uses: archive/github-actions-slack@v2.0.0
with:
slack-function: send-reaction
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }}
slack-emoji-name: thumbsup
slack-message-timestamp: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }}
- name: Send Slack Reaction To Message Result
run: echo "Data - ${{ steps.send-message.outputs.slack-result }}"

Similar to Add Reaction, but with text instead.
Please see .github/workflows/5-slack-update-message.yml
With blocks you can create more rich and complex messages / message layouts: https://api.slack.com/messaging/composing/layouts

For some examples, please see:
Upload files to a Slack channel using the upload-file function.
Required: Github Action Parameters:
slack-bot-user-oauth-access-token - SLACK_BOT_USER_OAUTH_ACCESS_TOKEN secret
slack-channel - The channel where you want to upload the file
slack-upload-file-path - Path to the file to upload
Optional: Github Action Parameters:
slack-upload-filename - Override the filename shown in Slack
slack-upload-file-title - Title of the file
slack-upload-initial-comment - Initial comment to add alongside the file
Upload security checks:
Uploads are limited to https and allowlisted Slack upload hosts only. Currently the upload host must be files.slack.com.
Uploads are limited to 10 MB per file.
The upload path must point to a file with an allowlisted extension. Current allowlist: .txt, .log, .json, .yaml, .yml, .xml, .pdf, .jpg, .jpeg, .png, .gif, .webp, .bmp, .svg, .tif, .tiff, .doc, .docx, .xls, .xlsx, .ppt, .pptx.
.github/workflows/15-slack-upload-file.yml
name: slack-upload-file
on: [push]
jobs:
slack-upload-file:
runs-on: ubuntu-24.04
name: Uploads a file to Slack
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Upload File to Slack
uses: archive/github-actions-slack@v2.0.0
id: upload-file
with:
slack-function: upload-file
slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }}
slack-channel: CPPUV5KU0
slack-upload-file-path: path/to/file.png
slack-upload-file-title: My File
slack-upload-initial-comment: Here is the file!
- name: Result from "Upload File"
run: echo "${{ steps.upload-file.outputs.slack-result }}"

Follow this guide on how to create a Slack App and Bot for your workspace:
You should:
To be able to send messages to slack, the Action needs the Auth Token for the Slack App. Since the Auth Token is sensitive information, you should NOT place it in the yaml file of the Ac
$ claude mcp add github-actions-slack \
-- python -m otcore.mcp_server <graph>