Updates an existing Slack Canvas document with markdown content. Supports appending, prepending, or replacing content.
Using action=replace WITHOUT providing a section_id will OVERWRITE THE ENTIRE CANVAS content. This is destructive and irreversible. You MUST call slack_read_canvas first to retrieve section IDs, then pass the appropriate section_id to replace only the target section.
append: Adds new content to the END of the specified section's block (inserted after the last content under that section, just before the next header section)
prepend: Inserts new content immediately AFTER the targeted element. If the section_id is a header, content appears after the header line but before the section's existing body content. If the section_id is a non-header element (paragraph, list, table, etc.), content is inserted directly after that element.
replace: Replaces ONLY the specified section's content block (safe)
Important: The section_id_mapping contains IDs for ALL content elements — headers (#, ##, ###), paragraphs, lists, tables, and callouts — not just header sections. For best results with append/prepend, target a header section_id to insert within that section's block.
append: Adds content to the END of the canvas (after the last section)
prepend: Inserts content after the canvas title but before existing body content (the title is preserved)
replace: ⚠️ REPLACES THE ENTIRE CANVAS — avoid unless user explicitly wants full replacement
canvas_id (str, required): ID of the canvas to update (e.g., "F1234567890") action (str, required): One of "append", "prepend", or "replace". Defaults to "append" content (str, required): Markdown-formatted content to insert or replace section_id (Optional[str]): Section ID from slack_read_canvas. Can reference any content element (header, paragraph, list, table, callout). For append/prepend, targeting a header section_id is recommended as it operates on the header's content block. append inserts after the last content in that section's block (before the next header); prepend inserts immediately after the targeted element; replace overwrites the section's block. STRONGLY RECOMMENDED for replace action to avoid overwriting the entire canvas.
canvas_id (str): ID of the updated canvas canvas_url (str): URL link to the updated canvas — always share this with the user section_id_mapping (dict): Updated mapping of section IDs to their markdown content after the edit. Each key is a section ID string (e.g., "temp:C:abc123") and each value is the markdown content of that element. Contains IDs for ALL content elements (headers, paragraphs, lists, tables, callouts), not just headers. Use these section IDs in subsequent slack_update_canvas calls to target specific sections, enabling multi-step editing workflows without needing to call slack_read_canvas again between edits.
- User wants to add content to an existing canvas (append/prepend)
- User wants to update a specific section of a canvas (replace with section_id)
- User wants to rewrite an entire canvas (replace without section_id — only if explicitly requested)
- User wants to create a new canvas (use
slack_create_canvas instead)
- User wants to read a canvas (use
slack_read_canvas instead)
- User only wants to send a simple message (use
slack_send_message instead)
1. Call slack_read_canvas with the canvas_id to get content and section IDs 2. Identify the target section_id from the section_id_mapping 3. Call slack_update_canvas with action=replace and the section_id
Append to the end of a canvas (no section_id): slack_update_canvas(canvas_id="F0123ABC456", action="append", content="
Here is the appended content.")
Append to the end of a specific section: slack_update_canvas(canvas_id="F0123ABC456", action="append", section_id="temp:C:abc123", content="
This content is added at the end of the specified section.")
Replace a specific section (safe — only that section is changed): slack_update_canvas(canvas_id="F0123ABC456", action="replace", section_id="temp:C:abc123", content="
This replaces only the targeted section.")
Prepend within a specific section (inserts right after the section header, before existing body content): slack_update_canvas(canvas_id="F0123ABC456", action="prepend", section_id="temp:C:abc123", content="This paragraph appears right after the section header, before the section's existing body content.")
not_supported_free_team: Canvas operations not supported on free teams
canvas_not_found: Invalid canvas_id or user lacks access
invalid_content: Content format is invalid
permission_denied: User lacks permission to edit this canvas
section_not_found: The provided section_id does not exist in the canvas
REQUIRED: Must be a non-empty string when updating canvas content. Only omit this field if you are updating ONLY the title.
The canvas content, formatted as Canvas-flavored Markdown.
Canvas-flavored Markdown is different from Slack message formatting. When creating content for Canvases, adhere to the following Canvas-only rules:
- The content should be formatted as standard Markdown, including headers, lists, links, checklists, tables, and other Markdown formatting.
- When writing user IDs, you should format them as:
 where U15CTCJ83 is the user\'s Slack ID.
- When user references are used in their own line, they will render as larger cards, if referenced inline they will render as special text.
- When writing channel IDs, you should format them as:
 where C15CTCJ83 is the channel\'s Slack ID. Always use the channel\'s ID, NEVER use the channel name.
- NEVER output a channel as <#C1234567890> or a user as <@U1234567890>, even when part of a text quote, instead use the format above.
- Links should be formatted as:
[link text](https://example.com). Do not surround the link in angle brackets.
- IMPORTANT: Only use these URL schemes in links:
http://, https://, mailto:, tel:, ftp://, slack://, or relative paths starting with /. Other schemes like javascript:, data:, file: will be automatically removed from the canvas.
- Images should be formatted as:

- Image syntax must appear only in a top-level, stand-alone line. Images are not supported in other elements
- Salesforce records should be formatted as:
 where <org_id> is the Salesforce org ID and <record_id> is the Salesforce record ID, the org ID and record ID should be the full IDs which would be 18 characters long. Example: 
- Salesforce records syntax must appear only in a top-level, stand-alone line. Salesforce records are not supported in other elements
- Quoted text should be formatted as:
> This is quoted text, but you should only use quotes on their own line.
- Slack-style emojis are supported, e.g. :tada: or :wave:
- Use only ATX headings
#, ##, ###. NEVER use deeper headings ####-######.
- Do not place headings inside list items.
- In list items, allow only paragraphs with inline formatting.
- Thematic breaks (---, ***, ___) are only allowed at the top level.
- When nesting lists, do not mix list types:
- Numbered lists can only contain nested numbered lists, and cannot contain nested bulleted lists
- Bulleted lists can only contain nested bulleted lists, and cannot contain nested numbered lists
- Code blocks are not allowed inside list items.
- If a table cell contains multi-line content, <br> can be used, e.g. 'line one<br>line two'
- The title provided through the
title field will be used as the title of the canvas. Do not include the title in the content section.
<example1>
:large_green_circle: On Track
The channel to coordinate the build, testing, and launch of Platypus


- Project Plan
- Google Drive
- 
- Project Channel
-  - [GTM Channel](https://gtm.wiki.com)
</example1> <example2> |Message|User Author| |---|---| |[Here is the python guide](https://team.slack.com/archives/C016VCYCL74/p1727122965001469)|| |[The Java guide isn\'t ready](https://team.slack.com/archives/C016VCYCL74/p1727122965001469)||\n\n
print("Hello, world!")
\n\n </example2>
- When a layout is requested use the ::: {.layout} as the starting delimiter and ::: as the ending delimiter of the full layout. Then each column should be wrapped in ::: {.column} as the starting delimiter and ::: as the ending delimiter. There can only be up to 3 columns in a layout and tables and callouts are not supported in layouts or columns.
- Callouts should be formatted with ::: {.callout} as the starting delimiter and ::: as the ending delimiter in markdown. Use them to highlight important information, such as warnings, important prerequisites, and notices.
- Do not use tables within callouts and callouts cannot be nested within other elements.
<example_markdown_with_callout> ::: {.callout} This is a callout ::: </example_markdown_with_callout>
- In block quotes, ONLY use: plain text paragraphs with inline formatting. No headings, lists, code blocks, or nested quotes.
- Code blocks are allowed only at the top level (not inside block quotes or list items).
CRITICAL RESTRICTIONS
- Canvas Nesting Rules (MUST FOLLOW):
- In list items, ONLY use: plain text paragraphs with inline formatting (bold, italic, inline
code, links).
- Code blocks, block quotes, and headings must always be separated from lists by blank lines.
- In layouts no tables or callouts are supported.- Layouts are not supported in tables or callouts.
<example_correct_usage>
- Item with inline
code formatting
- Item with bold text and [links](https://example.com)
</example_correct_usage>
<example_blocks_and_quotes_outside_lists>
code block at top level
- List item one
- List item two
> Block quote at top level
</example_blocks_and_quotes_outside_lists>
WHEN CITING SOURCES:
- When your content references information from web search results or other sources, you MUST include inline citation links using the [[N]](url) format throughout the content, exactly as you would in a chat response.
- Place citations inline next to the claims they support, e.g. "Shaidorov won gold [[7]](https://en.wikipedia.org/wiki/...)"
- Do NOT collapse all sources into a single "Source:" line at the bottom. Each fact should be cited where it appears.
- The citation links will be automatically enriched with page titles for readability.
- Format date headings and key dates (including due dates, deadlines, milestones) as  ONLY. Never append day names or date text.
Correct usage: <example_date_heading_correct>
</example_date_heading_correct>
Incorrect usage (has day name and date text): <example_date_heading_incorrect>
</example_date_heading_incorrect>- User Profile Cards: To display a user's profile card as a standalone section (not inline), use the format  where user_id is the Slack user ID. CRITICAL: Use parentheses () around @user_id, NOT angle brackets <>. Example: . Profile cards should be on their own line and will render as larger cards with user information.
Correct usage (standalone profile card on its own line): <example_user_profile_card_correct>

 </example_user_profile_card_correct>- Slack Files: ONLY for files with URLs matching *.slack.com/files/*, ALWAYS embed using . For standalone display (card): place on its own line. For inline reference (clickable text): embed directly in paragraph like "The  contains...". Do not use this syntax for non-Slack files.
✗ Does NOT create new canvases (use slack_create_canvas) ✗ Does NOT support setting canvas permissions or sharing ✗ Does NOT support deleting a canvas