Tool reference

create_many_notes

Create Many Notes. Create multiple notes at once.

GroupAccessMCP name
NotesWrites datacreate_many_notes

Description

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

Create multiple notes at once. Each note's content body must be in Markdown format. Each note can have its own status, tags, auto-restack delay (autoRestackAfterHours), link-preview choice (includePreviews), optional imageUrl (remote image URLs, max 5 per note — fetched and stored like CSV import), Buffer channels (bufferChannelIds), and per-channel Buffer posts (bufferChannelPosts). If any content includes a link, ask the user if they'd like link previews before calling this tool; pass includePreviews: true only for notes where they confirm. You SHOULD ask the user which tags to apply before calling this — use list_tags first to show available tags if needed. Tags also control which reserved queue times the notes can take when later scheduled (OR match; untagged notes only use open or untagged-only times). When generating new note content, call get_writing_style first unless the user already pasted complete style instructions. Call list_buffer_channels first if setting Buffer channels or per-channel posts.

Arguments

ArgumentTypeRequiredDescription
notesobject[]YesArray of notes to create (1–50) Min items 1. Max items 50.
notes[].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.
notes[].bufferChannelIdsstring[]NoOptional array of Buffer channel IDs to cross-post this new 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. Channel IDs from bufferChannelPosts are merged in automatically. Omit or pass an empty array to skip Buffer cross-posting unless you also pass bufferChannelPosts. 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
notes[].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.
notes[].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.
notes[].bufferChannelPosts[].bufferChannelIdstringYesBuffer channel ID from list_buffer_channels
notes[].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.
notes[].bufferChannelPosts[].includePreviewsbooleanNoIf true, attach a rich link-preview card from the first URL in this channel's body. Max 1 preview per channel.
notes[].bufferChannelPosts[].resetbooleanNoIf true, delete this channel's custom post so it falls back to the Substack note. The channel stays selected.
notes[].contentstringYesThe note body text
notes[].imageUrlstring[]NoOptional remote image URLs to attach to the note (same as CSV import image_url). WriteStack fetches each URL and stores the image. Max 5. Pass full https:// URLs. Invalid or unreachable URLs are skipped. Max items 5.
notes[].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.
notes[].statusstringNoNote status One of: "draft", "ready". Default "draft".
notes[].tagsstring[]NoCategory/tag names to assign. 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": "create_many_notes",
    "arguments": {
      "notes": [
        {
          "content": "…"
        }
      ]
    }
  }
}

Result

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

FieldTypeRequiredDescription
creatednumberYes
errorsstring[]No
failednumberYes
messagestringYes
notesobject[]Yes
notes[].attachmentsobject[]No
notes[].attachments[].typestringYes
notes[].attachments[].urlstringYes
notes[].bufferChannelIdsstring[]No
notes[].bufferChannelPostsobject[]No
notes[].bufferChannelPosts[].attachmentsany[]Yes
notes[].bufferChannelPosts[].bodystringYes
notes[].bufferChannelPosts[].bufferChannelIdstringYes
notes[].bufferChannelPosts[].resetbooleanNo
notes[].idstringYes
notes[].linkPreviewobjectNo
notes[].linkPreview.addedbooleanYes
notes[].linkPreview.reasonstringNo
notes[].linkPreview.urlstringNo
notes[].previewstringYes
notes[].statusstringYes
requestednumberYes

Annotations

HintValue
readOnlyHintfalse
destructiveHintfalse
openWorldHinttrue

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

On this page