Tool reference

update_note

Update Note. Update an existing note's content, status, tags, auto-restack delay (autoRestackAfterHours), Buffer cross-post channels (bufferChannelIds), per-channel Buffer posts (bufferChannelPosts), or link preview (includePreviews).

GroupAccessMCP name
NotesIrreversibleupdate_note
This tool changes data in a way that cannot be undone. Confirm with the writer before calling it.

Description

The description the MCP server sends to the model, word for word. Its rules apply to every call.

Update an existing note's content, status, tags, auto-restack delay (autoRestackAfterHours), Buffer cross-post channels (bufferChannelIds), per-channel Buffer posts (bufferChannelPosts), or link preview (includePreviews). The content body must be in Markdown format. If the resulting content includes a link, ask the user if they'd like a link preview before calling this tool; pass includePreviews: true only if they confirm. Pass autoRestackAfterHours: null to disable auto-restack on a note that previously had it. To set Buffer channels, call list_buffer_channels first and pass bufferChannelIds (empty array clears them). To give a channel different text or images than the Substack note, pass bufferChannelPosts. Changing tags changes which reserved queue times the note can take if it is scheduled later. Overwrites the current value of each field you pass; this integration has no undo, so call get_note first and confirm with the user before replacing existing content.

Arguments

ArgumentTypeRequiredDescription
autoRestackAfterHoursinteger | nullNoOptional auto-restack delay in hours (1–168). If set, after the note is published WriteStack will automatically restack (re-post) it the given number of hours later to boost visibility. Pass null or omit to disable auto-restack on the note. Requires the WriteStack browser extension v1.4.78 or higher to actually fire. Min 1. Max 168.
bufferChannelIdsstring[]NoOptional array of Buffer channel IDs to cross-post this note to once it publishes on Substack. Call list_buffer_channels first to get the valid IDs — only IDs returned by that tool are accepted. Maximum 20 channels per note — requests with more are rejected. Omit to leave cross-posting unchanged; pass an empty array to clear/disable Buffer cross-posting; pass the channel IDs you want (this replaces any previously set channels). Channel IDs from bufferChannelPosts are merged in automatically. Requires a connected Buffer account. Platform limits still apply: Instagram requires an image or video, and Instagram feed images must be between 4:5 and 1.91:1 aspect ratio for automatic posting (otherwise Buffer falls back to Notify Me). See https://support.buffer.com/article/622-instagrams-accepted-aspect-ratio-ranges
bufferChannelPostsobject[]NoOptional per-channel Buffer post overrides when a channel should have different text or images than the Substack note. Call list_buffer_channels first. Each item needs bufferChannelId and, unless reset is true, a plain-text body (max 5000). Those channel IDs are also selected on the note (merged with bufferChannelIds, still max 20). imageUrl attaches images to that channel only — they are not added to the Substack note. Omit imageUrl to keep existing channel images; pass [] to clear them. includePreviews adds a link card from the first URL in that channel's body (max 1). reset: true deletes the override so the channel falls back to the note. Removing a channel from bufferChannelIds does not delete a saved override. Platform limits still apply: Instagram requires an image or video, and Instagram feed images must be between 4:5 and 1.91:1 aspect ratio for automatic posting (otherwise Buffer falls back to Notify Me). See https://support.buffer.com/article/622-instagrams-accepted-aspect-ratio-ranges Max items 20.
bufferChannelPosts[].bodystringNoPlain-text override for this channel (max 5000). Required unless reset is true. This is what Buffer publishes for this channel instead of the Substack note. Max length 5000.
bufferChannelPosts[].bufferChannelIdstringYesBuffer channel ID from list_buffer_channels
bufferChannelPosts[].imageUrlstring[]NoRemote image URLs for this channel only (max 5). WriteStack fetches and stores them. They are not added to the Substack note. Omit to keep existing channel images; pass [] to clear them. Max items 5.
bufferChannelPosts[].includePreviewsbooleanNoIf true, attach a rich link-preview card from the first URL in this channel's body. Max 1 preview per channel.
bufferChannelPosts[].resetbooleanNoIf true, delete this channel's custom post so it falls back to the Substack note. The channel stays selected.
contentstringNoNew note body text
contentJsonstringNoNew note body JSON, as a tiptap JSON string. Not a must, recommended only for fixes where updating the content doesn't work. Read a few jsonBody examples of published notes first to get an idea of the format.
includePreviewsbooleanNoIf the note's content contains a link (full https:// URL or bare domain like writestack.io), ask the user whether they want a rich link-preview card (image, title, description) attached before creating/updating the note - do not assume yes. If they confirm, pass includePreviews: true. Prefer writing links as full https:// URLs in the content so previews resolve reliably. Only one preview can be attached per note; if there are multiple links, the first link in the content is used.
noteIdstringYesThe note ID to update
statusstringNoNew note status One of: "draft", "ready".
tagsstring[]NoReplace all tags with these category names. Tags also decide which reserved queue times this note can take: a note matches a reserved slot if it shares ANY of the slot's tags. Untagged notes only use open or untagged-only times. Call list_tags first to show available names.

Example call

The smallest valid request: required arguments only, with placeholder values.

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "update_note",
    "arguments": {
      "noteId": "…"
    }
  }
}

Result

The result has structuredContent that matches this schema. The same data is also in content as JSON text.

FieldTypeRequiredDescription
bufferChannelIdsstring[]No
bufferChannelPostsobject[]No
bufferChannelPosts[].attachmentsobject[]Yes
bufferChannelPosts[].attachments[].typestringYes
bufferChannelPosts[].attachments[].urlstringYes
bufferChannelPosts[].bodystringYes
bufferChannelPosts[].bufferChannelIdstringYes
bufferChannelPosts[].resetbooleanNo
linkPreviewobjectNo
linkPreview.addedbooleanYes
linkPreview.reasonstringNo
linkPreview.urlstringNo
messagestringYes
noteIdstringYes

Annotations

HintValue
readOnlyHintfalse
destructiveHinttrue
openWorldHinttrue

The full input and output JSON Schemas for every tool are in /mcp-tools.json.

On this page