Slack Block Kit Formatting Skill
This skill teaches agents to format Slack messages using Block Kit—a JSON-based UI framework for building rich, interactive messages.
When to Apply This Skill
Apply when:
-
Sending Slack messages via MCP tools
-
Creating notifications, alerts, or status updates
-
Building interactive messages with buttons or menus
-
Formatting EOD/EOW reports for Slack
-
Any message that should look professional
MCP Tools
Server: composio-config (Composio) Tool: SLACK_SEND_MESSAGE
{ "channel": "C12345678", "text": "Fallback text for notifications", "blocks": [ ... ] }
Important: Always include top-level text as notification fallback.
Architecture
Message Payload └── blocks[] (layout containers, max 50) └── Block elements (interactive components) └── Composition objects (text, options)
Block Types Quick Reference
Type Use For Key Rules
header
Titles 150 chars max, plain_text only
section
Main content 3000 chars, can have accessory
divider
Visual separation No content
image
Standalone images HTTPS URL required, alt_text required
context
Metadata, timestamps Max 10 elements, renders small/muted
actions
Button rows, menus Max 25 elements
table
Tabular data 1 per message, max 100 rows, 20 columns
rich_text
Formatted text Lists, quotes, code blocks, styled text
Table Block (NEW)
Constraints:
-
Only 1 table per message (error: only_one_table_allowed )
-
Table renders at BOTTOM of message (appended)
-
Max 100 rows, 20 columns
-
Cells can be raw_text or rich_text
Basic Table
{ "type": "table", "column_settings": [ { "align": "left" }, { "align": "center" }, { "align": "right" } ], "rows": [ [ { "type": "raw_text", "text": "Name" }, { "type": "raw_text", "text": "Count" }, { "type": "raw_text", "text": "Value" } ], [ { "type": "raw_text", "text": "Item A" }, { "type": "raw_text", "text": "5" }, { "type": "raw_text", "text": "$100" } ] ] }
Column Settings
Property Type Description
align
string left , center , or right
is_wrapped
boolean Whether to wrap long text (default: false)
Table with Rich Text Cells (Links, Bold)
{ "type": "table", "rows": [ [ { "type": "raw_text", "text": "Deal" }, { "type": "raw_text", "text": "ARR" } ], [ { "type": "rich_text", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "link", "text": "Acme Corp", "url": "https://hubspot.com/deal/123" } ] } ] }, { "type": "rich_text", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "text", "text": "$50,000", "style": { "bold": true } } ] } ] } ] ] }
Rich Text Block
Rich text provides more flexibility than mrkdwn. Use for complex formatting needs.
Rich Text Section (Basic)
{ "type": "rich_text", "elements": [ { "type": "rich_text_section", "elements": [ { "type": "text", "text": "Hello " }, { "type": "text", "text": "bold text", "style": { "bold": true } }, { "type": "text", "text": " and " }, { "type": "text", "text": "italic", "style": { "italic": true } } ] } ] }
Rich Text List (Bullet/Numbered)
{ "type": "rich_text", "elements": [ { "type": "rich_text_section", "elements": [{ "type": "text", "text": "Features shipped:" }] }, { "type": "rich_text_list", "style": "bullet", "elements": [ { "type": "rich_text_section", "elements": [{ "type": "text", "text": "HubSpot integration" }] }, { "type": "rich_text_section", "elements": [{ "type": "text", "text": "Mobile improvements" }] } ] } ] }
Rich Text Quote
{ "type": "rich_text", "elements": [ { "type": "rich_text_quote", "elements": [ { "type": "text", "text": "This is really going to change how we work." } ] } ] }
Rich Text Element Types
Type Properties Use For
text
text , style
Plain/styled text
link
url , text , style
Clickable links
user
user_id , style
@mentions
channel
channel_id , style
#channel links
usergroup
usergroup_id , style
@group mentions
emoji
name , unicode
Emoji
date
timestamp , format
Formatted dates
broadcast
range (here/channel/everyone) @here/@channel/@everyone
Text Style Object
{ "style": { "bold": true, "italic": true, "strike": true, "code": true } }
Block JSON Structures
Header Block
{ "type": "header", "text": { "type": "plain_text", "text": ":rocket: Header Text Here", "emoji": true } }
Section Block
{ "type": "section", "text": { "type": "mrkdwn", "text": "Bold and italic text with <https://example.com|links>" } }
Section with Accessory (Button)
{ "type": "section", "text": { "type": "mrkdwn", "text": "Your meeting has been processed." }, "accessory": { "type": "button", "text": { "type": "plain_text", "text": "View", "emoji": true }, "url": "https://app.askelephant.com/meetings/123", "action_id": "view_meeting" } }
Section with Fields (Two-Column Layout)
{ "type": "section", "fields": [ { "type": "mrkdwn", "text": "Status:\nComplete" }, { "type": "mrkdwn", "text": "Duration:\n45 min" }, { "type": "mrkdwn", "text": "Attendees:\n4 people" }, { "type": "mrkdwn", "text": "Priority:\nHigh" } ] }
Rules: Max 10 fields, each max 2000 chars.
Divider Block
{ "type": "divider" }
Image Block
{ "type": "image", "image_url": "https://example.com/chart.png", "alt_text": "Q4 revenue chart" }
Context Block
{ "type": "context", "elements": [ { "type": "mrkdwn", "text": ":clock1: Posted at <!date^1706451200^{date_short_pretty} at {time}|Jan 28, 2026>" } ] }
Actions Block
{ "type": "actions", "block_id": "actions_1", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "Approve", "emoji": true }, "style": "primary", "action_id": "approve_btn", "value": "approved" }, { "type": "button", "text": { "type": "plain_text", "text": "Reject", "emoji": true }, "style": "danger", "action_id": "reject_btn", "value": "rejected" } ] }
Button styles: primary (green), danger (red), or omit for default gray.
mrkdwn Syntax (NOT Standard Markdown!)
Text Formatting
Format Syntax Example
Bold text
important
Italic text
emphasis
Strikethrough
text
deleted
Code
code
function()
Code block
code
Multi-line
Quote
text
Indented
Links and Mentions
Type Syntax
URL <https://example.com>
URL with text <https://example.com|Click here>
User mention <@U12345678>
Channel link <#C12345678>
@here <!here>
@channel <!channel>
Escape Characters
Character Escape As
&
&
<
<
>
NOT Supported (Common Mistakes)
Wrong Correct
bold
bold
italic
italic
<url|text>
Header
Use header block
Message Templates by Use Case
Newsletter Template (Polished)
Use for company-wide updates, weekly digests, or announcements.
{
"text": "Paper Company Newsletter - November 12, 2019",
"blocks": [
{
"type": "header",
"text": {
"type": "plain_text",
"text": ":newspaper: AskElephant Update :newspaper:",
"emoji": true
}
},
{
"type": "context",
"elements": [
{
"text": "January 28, 2026 | Product Team",
"type": "mrkdwn"
}
]
},
{ "type": "divider" },
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":loud_sound: IN CASE YOU MISSED IT :loud_sound:"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "The HubSpot integration shipped last week. Customers can now sync all their meeting data to HubSpot automatically."
},
"accessory": {
"type": "button",
"text": { "type": "plain_text", "text": "Learn More", "emoji": true },
"url": "https://docs.askelephant.com/hubspot"
}
},
{ "type": "divider" },
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":calendar: | UPCOMING | :calendar:"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "02/01 Speaker ID V2 — Improved speaker identification\n02/15 Admin Onboarding — Streamlined workspace setup"
}
},
{ "type": "divider" },
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "FOR YOUR INFORMATION"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":bulb: Mobile app update is now available. Make sure customers update for better recording reliability."
}
},
{ "type": "divider" },
{
"type": "context",
"elements": [
{
"type": "mrkdwn",
"text": ":pushpin: Questions? Drop them in #product-forum"
}
]
}
]
}
Rob Report (Revenue Team, Simple Language)
Use for CRO/revenue team updates with simplified language and customer-visible features only.
{ "text": "What's New - January 27, 2026", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "What's New - January 27, 2026", "emoji": true } }, { "type": "section", "text": { "type": "mrkdwn", "text": "Hey Revenue Team! Here's what shipped that you can use with customers right now." } }, { "type": "divider" }, { "type": "header", "text": { "type": "plain_text", "text": "What's New", "emoji": true } }, { "type": "section", "text": { "type": "mrkdwn", "text": "The app runs faster now — Pages load quicker, especially with lots of conversations.\n\n*@ mentions work better in chat* — AskElephant understands who you're talking about more reliably." } }, { "type": "divider" }, { "type": "header", "text": { "type": "plain_text", "text": "What We Fixed", "emoji": true } }, { "type": "section", "text": { "type": "mrkdwn", "text": "• Notification banners showing at wrong time\n• Scrolling no longer jumps around\n• Words getting cut off in meeting details" } }, { "type": "divider" }, { "type": "header", "text": { "type": "plain_text", "text": "Revenue Wins", "emoji": true } }, { "type": "section", "text": { "type": "mrkdwn", "text": "Total New ARR: $20,399 (4 deals)\nExpansion: $5,700 (Hadco Construction)\nTotal ARR Impact: $26,100" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": "All features listed are available to your team now." } }, { "type": "table", "column_settings": [ { "align": "left" }, { "align": "center" }, { "align": "center" }, { "align": "center" }, { "align": "center" } ], "rows": [ [ { "type": "raw_text", "text": "SDR" }, { "type": "raw_text", "text": "Convos" }, { "type": "raw_text", "text": "Pitches" }, { "type": "raw_text", "text": "Meetings" }, { "type": "raw_text", "text": "ICP Held" } ], [ { "type": "raw_text", "text": "Jamis Benson" }, { "type": "raw_text", "text": "7" }, { "type": "raw_text", "text": "6" }, { "type": "raw_text", "text": "4" }, { "type": "raw_text", "text": "2" } ], [ { "type": "raw_text", "text": "Carter Thomas" }, { "type": "raw_text", "text": "8" }, { "type": "raw_text", "text": "6" }, { "type": "raw_text", "text": "5" }, { "type": "raw_text", "text": "1" } ], [ { "type": "raw_text", "text": "Team Total" }, { "type": "raw_text", "text": "18" }, { "type": "raw_text", "text": "14" }, { "type": "raw_text", "text": "12" }, { "type": "raw_text", "text": "3" } ] ] } ] }
Daily Digest (Engineering/Product)
{ "text": "AskElephant Daily Digest", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": "AskElephant Daily Digest", "emoji": true } }, { "type": "context", "elements": [ { "type": "mrkdwn", "text": ":newspaper: Thursday, January 23, 2026" } ] }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": ":trophy: Today's Headline\n\n>Dialpad Goes Live + Desktop Stability — Another major telephony platform now integrated." } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": ":sparkles: New Features\n\nCRM Integrations\n• Dialpad direct integration — full telephony support\n• Dialpad event handling — deduplication and routing\n\nRecording & Capture\n• Desktop MP4 audio — higher quality recordings\n• Web recording visual feedback" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": ":wrench: Improvements\n\n• Engagement page restored\n• AI description improvements\n• Query performance instrumented" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": ":bug: Bugs Fixed: 6\n\n• Auto logout toggle restored\n• Desktop recording stop reliability\n• Mobile push notification delivery" } }, { "type": "divider" }, { "type": "section", "text": { "type": "mrkdwn", "text": ":busts_in_silhouette: Team Focus" } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "Eduardo\nDialpad, desktop, mobile" }, { "type": "mrkdwn", "text": "Matt Noxon\nPerformance, dataloaders" }, { "type": "mrkdwn", "text": "Jason\nStripe, PostHog, analytics" }, { "type": "mrkdwn", "text": "Dylan\nVoiceprint, embeddings" } ] }, { "type": "divider" }, { "type": "context", "elements": [ { "type": "mrkdwn", "text": ":chart_with_upwards_trend: Stats: 6 features | 3 improvements | 6 bugs fixed" }, { "type": "mrkdwn", "text": ":rocket: 21 PRs merged • Eduardo leading with 10" } ] } ] }
Deal Closed Celebration
{ "text": "Deal Closed: Acme Corp - $50,000 ARR", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": ":tada: Deal Closed!", "emoji": true } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "Account:\nAcme Corp" }, { "type": "mrkdwn", "text": "ARR:\n$50,000" }, { "type": "mrkdwn", "text": "Rep:\n<@U12345>" }, { "type": "mrkdwn", "text": "Type:\nNew Business" } ] }, { "type": "context", "elements": [ { "type": "mrkdwn", "text": "Closed on <!date^1706451200^{date_long}|January 28, 2026>" } ] } ] }
Approval Request (Interactive)
{ "text": "Approval Needed: Enterprise Pricing", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": ":raised_hand: Approval Needed", "emoji": true } }, { "type": "section", "text": { "type": "mrkdwn", "text": "Enterprise Pricing Proposal\nNew tier at $2,500/mo for 50+ seats." } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "Requested by:\n<@U12345>" }, { "type": "mrkdwn", "text": "Deadline:\nFeb 1, 2026" } ] }, { "type": "actions", "block_id": "approval_actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "Approve", "emoji": true }, "style": "primary", "action_id": "approve_proposal" }, { "type": "button", "text": { "type": "plain_text", "text": "Reject", "emoji": true }, "style": "danger", "action_id": "reject_proposal" }, { "type": "button", "text": { "type": "plain_text", "text": "View Details", "emoji": true }, "url": "https://notion.so/proposal-123", "action_id": "view_details" } ] } ] }
Alert/Warning
{ "text": "Alert: High API Error Rate", "blocks": [ { "type": "header", "text": { "type": "plain_text", "text": ":rotating_light: Alert: High Error Rate", "emoji": true } }, { "type": "section", "text": { "type": "mrkdwn", "text": "API error rate has exceeded 5% threshold.\n\nCurrent rate: 7.2%\nThreshold: 5%\nDuration: 15 minutes" } }, { "type": "actions", "elements": [ { "type": "button", "text": { "type": "plain_text", "text": "View Dashboard", "emoji": true }, "url": "https://grafana.example.com/alerts", "style": "primary" }, { "type": "button", "text": { "type": "plain_text", "text": "Acknowledge", "emoji": true }, "action_id": "ack_alert" } ] }, { "type": "context", "elements": [ { "type": "mrkdwn", "text": ":clock1: Triggered at <!date^1706451200^{time}|2:30 PM>" } ] } ] }
Template Selection Decision Tree
What are you sending? │ ├── Update for Revenue Team (Rob, AEs, SDRs)? │ └── Use: Rob Report Template │ • Simple language (high school reading level) │ • Customer-visible features only │ • Table block for SDR metrics │ ├── Company-wide announcement? │ └── Use: Newsletter Template │ • Header with emoji │ • Context with date │ • "In Case You Missed It" section │ • "Upcoming" with dates in backticks │ • "For Your Information" callout │ ├── Engineering/Product digest? │ └── Use: Daily Digest Template │ • Headline quote block │ • Categorized sections (Features, Improvements, Bugs) │ • Team Focus with fields │ • Stats in context block │ ├── Deal closed? │ └── Use: Deal Closed Template │ • Header with :tada: │ • Fields for Account/ARR/Rep/Type │ • Context with date │ ├── Need approval? │ └── Use: Approval Request Template │ • Actions block with Approve/Reject buttons │ • Fields for requester/deadline │ ├── Alert/Error? │ └── Use: Alert Template │ • :rotating_light: emoji │ • Current vs threshold values │ • Acknowledge button │ └── Tabular data? └── Use: Table Block (1 per message) • Put at END of blocks array • Use column_settings for alignment • Center numeric columns
Block Selection Quick Guide
Content Type Best Block
Title/Headline header
Main text section
Key-value pairs section with fields
Text + button section with accessory
Standalone image image
Row of buttons actions
Metadata/footer context
Visual break divider
Tabular data table (1 per message, at end)
Complex formatting rich_text
Validation Checklist
Before sending:
-
Valid JSON syntax
-
Fallback text field at root level
-
All action_id values unique
-
Character limits respected (header: 150, section: 3000)
-
Image URLs are HTTPS
-
mrkdwn syntax correct (not standard Markdown)
-
Max 50 blocks for messages
-
Only 1 table block (if using tables)
-
Table block is LAST in blocks array
Common Emoji Reference
Type Emojis
Success :white_check_mark: :tada: :rocket:
Alert :warning: :rotating_light: :exclamation:
Info :information_source: :memo: :newspaper:
Revenue :moneybag: :chart_with_upwards_trend: :trophy:
Meetings :movie_camera: :calendar: :busts_in_silhouette:
Dev :hammer_and_wrench: :gear: :package: :bug:
Time :clock1: :hourglass: :stopwatch:
Category :sparkles: :wrench: :loud_sound: :bulb:
Date Formatting
Use <!date^TIMESTAMP^FORMAT|FALLBACK> in mrkdwn.
Token Output
{date_num}
2026-01-28
{date_short}
Jan 28, 2026
{date_long}
Monday, January 28th, 2026
{date_pretty}
today/yesterday/tomorrow or date
{time}
2:34 PM
{ago}
3 minutes ago
Example:
<!date^1706451200^{date_short_pretty} at {time}|Jan 28, 2026>
Testing
Recommend testing in Block Kit Builder before sending.