# schedule_notes_with_custom_dates (/docs/build/mcp-reference/schedule_notes_with_custom_dates)

{/* GENERATED by scripts/generate-mcp-reference.mjs from the MCP server tools/list. Do not edit. */}

| Group | Access | MCP name |
| --- | --- | --- |
| Schedule | Irreversible | `schedule_notes_with_custom_dates` |

<Callout type="warn">This tool changes data in a way that cannot be undone. Confirm with the writer before calling it.</Callout>

## Description [#description]

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

> Schedule notes at user-provided custom dates/times (one date per note). ONLY use this tool if: (1) the user explicitly requests specific dates/times for their notes, OR (2) the user has no recurring schedule template set up (schedule_notes returned an error about a missing template). In all other cases, prefer schedule_notes with the recurring template instead — that tool honors reserved tag lanes. Custom dates skip lane preference because you pick the time; if the chosen time matches a slot that has Buffer channels, those still replace the note's channels. All dates must be in the future. Pass dates as ISO 8601 strings (e.g. 2026-05-01T14:30:00Z). You can also set or update each note's autoRestackAfterHours at the same time (1–168 hours; null clears it), and cross-post each note to Buffer channels by passing per-note bufferChannelIds (call list_buffer_channels first to get valid IDs). You MAY create notes without asking. CRITICAL: Scheduling in WriteStack does NOT push notes to Substack. After scheduling, the user must open WriteStack and click the yellow Sync/Warning button so the Chrome extension syncs them — you cannot do this for them. BEFORE calling this tool, you MUST ask the user to confirm they understand they need to sync manually afterward, then pass userConfirmedManualSync: true. Never set that flag unless they explicitly confirmed in this conversation. IMPORTANT: Call get_schedule_capacity first. NEVER, under any circumstances, schedule more than the reported `remaining` (unless unlimited=true). If the user asks to schedule more than `remaining`, schedule only the first `remaining` notes, leave the rest as ready/drafts, and tell the user how many were scheduled and why the rest were not. Scheduling sets the notes' status to scheduled and assigns posting times; this integration cannot unschedule them, so the user would have to undo it in WriteStack.

## Arguments [#arguments]

| Argument | Type | Required | Description |
| --- | --- | --- | --- |
| `notes` | `object[]` | Yes | Array of (noteId, scheduledAt, autoRestackAfterHours?, bufferChannelIds?) entries (1–50). Each entry can independently set its own auto-restack delay and Buffer cross-post channels. 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 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. When set, WriteStack will also post the note to these Buffer channels (e.g. LinkedIn, X/Twitter, Threads) shortly after it goes live. Pass an empty array or omit to leave cross-posting unchanged; pass the channels you want to keep, since this replaces any previously set channels. 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[].noteId` | `string` | Yes | The note ID to schedule |
| `notes[].scheduledAt` | `string` | Yes | ISO 8601 datetime string (e.g. 2026-05-01T14:30:00Z). Must be in the future. |
| `userConfirmedManualSync` | `boolean` | Yes | Must be true. Only set this after the user has explicitly confirmed they understand they must manually sync these notes in WriteStack (yellow Sync/Warning button) after scheduling, because this MCP cannot push them to Substack. Do not assume confirmation. |

## Example call [#example-call]

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

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "schedule_notes_with_custom_dates",
    "arguments": {
      "notes": [
        {
          "noteId": "…",
          "scheduledAt": "…"
        }
      ],
      "userConfirmedManualSync": true
    }
  }
}
```

## Result [#result]

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

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `assignments` | `object[]` | Yes |  |
| `assignments[].autoRestackAfterHours` | `number \| null` | No |  |
| `assignments[].bufferChannelIds` | `string[]` | No |  |
| `assignments[].bufferChannelsOverridden` | `boolean` | No |  |
| `assignments[].noteId` | `string` | Yes |  |
| `assignments[].notePreview` | `string` | Yes |  |
| `assignments[].scheduledAt` | `string` | Yes |  |
| `assignments[].source` | `string` | No | One of: `"lane"`, `"open"`, `"any"`. |
| `message` | `string` | Yes |  |
| `requestedCount` | `number` | Yes |  |
| `scheduledCount` | `number` | Yes |  |
| `warnings` | `string[]` | No |  |

## Annotations [#annotations]

| Hint | Value |
| --- | --- |
| `readOnlyHint` | `false` |
| `destructiveHint` | `true` |
| `openWorldHint` | `false` |

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