create_many_notes
Create Many Notes. Create multiple notes at once.
| Group | Access | MCP name |
|---|---|---|
| Notes | Writes data | create_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
| Argument | Type | Required | Description |
|---|---|---|---|
notes | object[] | Yes | Array of notes to create (1–50) Min items 1. Max items 50. |
notes[].autoRestackAfterHours | integer | null | No | Optional 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[].bufferChannelIds | string[] | No | Optional 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[].bufferChannelPosts | object[] | No | Optional 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[].body | string | No | Plain-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[].bufferChannelId | string | Yes | Buffer channel ID from list_buffer_channels |
notes[].bufferChannelPosts[].imageUrl | string[] | No | Remote 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[].includePreviews | boolean | No | If true, attach a rich link-preview card from the first URL in this channel's body. Max 1 preview per channel. |
notes[].bufferChannelPosts[].reset | boolean | No | If true, delete this channel's custom post so it falls back to the Substack note. The channel stays selected. |
notes[].content | string | Yes | The note body text |
notes[].imageUrl | string[] | No | Optional 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[].includePreviews | boolean | No | If 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[].status | string | No | Note status One of: "draft", "ready". Default "draft". |
notes[].tags | string[] | No | Category/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.
| Field | Type | Required | Description |
|---|---|---|---|
created | number | Yes | |
errors | string[] | No | |
failed | number | Yes | |
message | string | Yes | |
notes | object[] | Yes | |
notes[].attachments | object[] | No | |
notes[].attachments[].type | string | Yes | |
notes[].attachments[].url | string | Yes | |
notes[].bufferChannelIds | string[] | No | |
notes[].bufferChannelPosts | object[] | No | |
notes[].bufferChannelPosts[].attachments | any[] | Yes | |
notes[].bufferChannelPosts[].body | string | Yes | |
notes[].bufferChannelPosts[].bufferChannelId | string | Yes | |
notes[].bufferChannelPosts[].reset | boolean | No | |
notes[].id | string | Yes | |
notes[].linkPreview | object | No | |
notes[].linkPreview.added | boolean | Yes | |
notes[].linkPreview.reason | string | No | |
notes[].linkPreview.url | string | No | |
notes[].preview | string | Yes | |
notes[].status | string | Yes | |
requested | number | Yes |
Annotations
| Hint | Value |
|---|---|
readOnlyHint | false |
destructiveHint | false |
openWorldHint | true |
The full input and output JSON Schemas for every tool are in /mcp-tools.json.
create_note
Create Note. Create a new note draft or ready note.
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).