Substack Write
substack_writePost, schedule and engage on Substack as the signed-in member. Each call acts on the member's real account.
Actions: post (now, or schedule with trigger_at), update_published, delete_published (permanent, irreversible), list_scheduled_drafts, sync_stats, sync_status, image_upload_token, video_upload_token; like, unlike, restack, unrestack, reply (Note only), comment (post only), delete_comment (your own).
Note content is HTML, not markdown: for formats and the exact call per format, use notes_studio action posting_formats. Engage only on items the member chose, post only replies and comments the member approved, keep a human pace, and never loop over a whole feed. To quote an article in a Note, use post with quote. If post returns outcome "unknown", check list_scheduled_drafts or the profile before any retry.
Call action help for parameters.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"action": "<action>"
},
"name": "substack_write"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | reply (Notes) and comment (posts): the text to publish, 1-5000 characters. | |
| force | No | sync_stats: bypass the 10-min per-user cooldown and re-sync now. | |
| limit | No | list_scheduled_drafts: max drafts to return. Default 20, max 100 (checked server side). | |
| quote | No | post: quote card. {article_url: the Substack article, text: the exact sentence(s) from ONE paragraph, theme?: one of primary, orange, green, tintedImageVibrant, tintedImageMuted, fadedImage, blurredImage, Vibrant, DarkVibrant, LightVibrant, Muted, DarkMuted, LightMuted (omit for Substack's default), alignment?: "left" | "center"}. The quote must be visible to the member (paid text only for paid readers). | |
| action | Yes | The operation to perform. Current actions: post, update_published, delete_published, list_scheduled_drafts, sync_stats, sync_status, image_upload_token, video_upload_token, like, unlike, restack, unrestack, reply, comment, delete_comment. Pass "help" for the live list with parameters; actions added after you connected appear there and work without reconnecting. | |
| content | No | update_published: full new HTML body. HTML only, NO markdown. Tags: <p>, <strong>, <em>, <code>, <pre>, <blockquote>, <ul>, <ol>, <a>. @Label mentions are matched against the mentions list. | |
| options | No | Extra parameters for an action whose params are not listed in this schema (see action "help"). Parameters that ARE listed in this schema must be passed at top level; here they are ignored. | |
| mentions | No | People to @mention. Omit on update_published to preserve existing mentions. | |
| max_pages | No | sync_stats: pages of 20 notes to fetch (default 5 = 100 notes). <=3 runs inline; larger runs in the background. | |
| target_id | No | like, unlike, restack, unrestack, reply, comment, delete_comment: id of the Note or post to act on. | |
| comment_id | No | delete_comment: id of the member's own reply or comment (returned by reply and comment). | |
| image_urls | No | post: HTTPS image file URLs to attach (1–6). Displayed as an image gallery. | |
| plain_text | No | post: note text. Newlines become separate paragraphs. Required for post. | |
| trigger_at | No | post: ISO 8601 datetime WITH timezone to schedule (e.g. "2026-06-10T15:17:00-04:00"). Omit to post immediately. | |
| target_type | No | like, unlike, restack, unrestack, reply, comment, delete_comment: "note" (target_id = the number after "c-" in the Note URL) or "post" (target_id = the numeric post id, e.g. from substack_read get_feed or the "p-" number in a post URL). | |
| attachment_ids | No | update_published: attachment IDs to set (integer or UUID string for post/video attachments). Omit to preserve existing. Pass [] to remove all. | |
| attachment_urls | No | post, update_published: Substack article or note URLs to attach as link cards. | |
| image_data_uris | No | post: base64 data URIs for local image files ("data:<mime>;base64,<b64>"). Counts toward the 6-image cap shared with image_urls. | |
| substack_handle | No | sync_stats: YOUR Substack handle for first-time user ID resolution (e.g. "jennyouyang"). | |
| substack_note_id | No | Substack note ID (the number after "c-" in the URL). Required for update_published, delete_published. | |
| video_upload_key | No | post: native Substack video key from the local MP4 upload path (action video_upload_token). One MP4, at most 5 minutes. Add trigger_at to schedule. | |
| reply_minimum_role | No | Who can reply: "everyone" (default), "paid", etc. Used by update_published and post. |