Skip to main content
Glama

Schedule article

schedule_article

Schedule an article to Substack, Medium, LinkedIn Articles, X, WordPress, or Ghost. WordPress and Ghost support publishMode draft, which saves a remote draft without publishing or emailing. Creates an article draft when draftId is absent. Supports cover and inline images, Substack-only inline video, and destination-specific SEO metadata. Substack supports native paywall and subscribe controls at explicit positions in contentHtml; ordinary links remain links. Audience and email delivery are controlled by the supplied fields. LinkedIn Articles requires a separate browser-session connection from regular posts; pending session sync saves new input as a draft without scheduling. Returns scheduling outcomes and advisories.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional tag list for newly created drafts. Substack receives all supplied tags. Medium receives its supported first 5 topics and returns a warning when extras are omitted. The saved draft remains unchanged.
mediaNoOptional inline images or Substack article videos for a newly created draft. Replaces {{media:N}} placeholders in array order; leftovers are appended. kind defaults to image; video requires Substack as the sole platform. Supports public URLs, data URIs, and base64 bytes. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url.
titleNoRequired when creating a new draft.
draftIdNoOptional existing article draft id to schedule as-is.
subtitleNoOptional article subtitle for newly created drafts. Substack omits subtitles over 250 characters and returns a warning without changing the saved draft.
timezoneNoIANA timezone the scheduledFor time(s) above are expressed in (e.g. "Europe/London"). Default UTC.
platformsYes
coverImageNoOptional cover image for a newly created draft, placed at the top of the published body. Supports public HTTPS URLs, data URIs, or base64 image bytes. URL ingestion depends on source-host access. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url.
contentHtmlNoRequired when creating a new draft. Supports public <img> or <video> elements and {{media:N}} placeholders resolved from media entries. Video articles require Substack as the sole platform. Native Substack paywall markup is <hr data-type="paywall"> at the selected paragraph boundary, or a single {{NARRAREACH_PAYWALL}} token; paywallMarker supports custom tokens. Native subscribe block markup is <div data-type="button" data-kind="subscribeCaption" data-text="Subscribe" data-caption="Your caption"></div> with HTML-escaped attribute values. data-kind="subscribe" represents a button without caption. Ordinary links remain links.
publicationNoSubstack destination as a publication name, handle, or URL, for example "AI Newsroom", "@theainewsroom", or "https://theainewsroom.substack.com". Optional when exactly one active Substack publication is connected; Narrareach selects it automatically. Required when more than one active Substack publication is connected, except that when it is missing Narrareach uses the publication the writer scheduled or published to most recently and says so in substackPublicationSelection.message, with publicationChoices listing the others; tell the writer which one was used. If there is no previous choice, the value is ambiguous, or Narrareach cannot confirm the session publishes there, nothing is scheduled and the result has requiresPublicationChoice: true with publicationChoices (name, handle, url, substackConnectionId). Ask which one they want, then call again with publication set to the chosen handle (and draftId when a draft was already saved).
publishModeNoOnly valid when all selected destinations are WordPress or Ghost. Defaults to publish; draft saves a remote draft at the scheduled time without publication.
scheduledForNoShared local wall-clock publishing date/time interpreted in timezone, including DST. A Z or explicit UTC offset represents an absolute instant. LinkedIn articles require at least 20 minutes of lead time.
isPaidContentNoWhether the Substack article is paid-only. Default false.
paywallMarkerNoOptional custom marker in contentHtml where the selected free preview ends; must appear exactly once. The standard {{NARRAREACH_PAYWALL}} marker is recognized without this field. Creates a native paywall and enables paid access without changing sendToNewsletter.
sendToNewsletterNoSubstack email delivery setting. Default true.
addSearchMetadataNoGenerate SEO titles, descriptions, and a Substack slug for supported article destinations. SEO metadata is generated automatically on Revenue Writer, Full Agentic Mode, and Teams & Agencies, and for trials or other accounts with article SEO access. Set this option to false to turn it off. X does not support separate article SEO settings.
linkedinAuthorUrnNoLinkedIn personal profile or Company Page author URN belonging to the connected LinkedIn Articles account.
platformSchedulesNoOptional per-platform overrides taking precedence over scheduledFor. Same wall-clock + timezone rule applies to each scheduledFor here; LinkedIn entries require at least 20 minutes of lead time.
mediumPublicationIdNoOptional authorized Medium publication id when platforms includes MEDIUM. Absent means the personal profile. Writer-only access submits for editorial review and leaves the story unscheduled until acceptance. Explicit publication rejection allows personal-profile delivery with a warning; ambiguous submissions remain unpublished for review. Draft-only delivery does not submit to a publication.
substackConnectionIdNoExact Substack connection identifier, retained for backward compatibility, for example publicationChoices[].substackConnectionId from a requiresPublicationChoice result. publication is the preferred public destination selector; when both are given they must name the same publication.
linkedinNewsletterUrnNoLinkedIn newsletter URN belonging to the connected LinkedIn Articles account. Required when linkedinPublicationType is newsletter.
mediumNotifyFollowersNoWhether to email Medium subscribers about this story. Only valid when platforms includes MEDIUM. Defaults to false (no email). Best-effort: a failure to apply this setting never blocks the publish/schedule and is reported as a warning.
linkedinPublicationTypeNoLinkedIn destination type. Defaults to an individual article; newsletter represents a user-selected newsletter destination.
linkedinShareCommentaryNoOptional LinkedIn share text used when publishing a LinkedIn article.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
codeNo
countYes
postsYes
messageNo
nextStepNo
warningsYes
advisoriesNo
choiceScopeNo
aiVisibilityNo
createdDraftYes
connectedAccountNo
publicationChoicesNo
substackPublicationYes
publicationChoiceReasonNo
requiresPublicationChoiceNo
substackPublicationSelectionNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / aiVisibility
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "checks": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "detail": {
      +            "type": "string"
      +          },
      +          "id": {
      +            "type": "string"
      +          },
      +          "status": {
      +            "enum": [
      +              "pass",
      +              "weak",
      +              "missing"
      +            ],
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "status",
      +          "detail"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "guidance": {
      +      "type": "string"
      +    },
      +    "needsJudgment": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "topFixes": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "wordCount": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "wordCount",
      +    "checks",
      +    "topFixes",
      +    "needsJudgment",
      +    "guidance"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • changedOutput schema / properties / posts / items / properties / substackDelivery / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "note": {
      -        "type": "string"
      -      },
      -      "requiresVerification": {
      -        "type": "boolean"
      -      },
      -      "state": {
      -        "enum": [
      -          "waiting",
      -          "publishing",
      -          "verifying"
      -        ],
      -        "type": "string"
      -      },
      -      "verification": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "action": {
      -            "type": "string"
      -          },
      -          "connectionId": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "endpoint": {
      -            "type": "string"
      -          },
      -          "instruction": {
      -            "type": "string"
      -          },
      -          "tool": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "connectionId",
      -          "tool",
      -          "endpoint",
      -          "action",
      -          "instruction"
      -        ],
      -        "type": "object"
      -      },
      -      "verificationUrl": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "note",
      -      "requiresVerification"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "note": {
      +        "type": "string"
      +      },
      +      "requiresVerification": {
      +        "type": "boolean"
      +      },
      +      "state": {
      +        "enum": [
      +          "waiting",
      +          "publishing",
      +          "verifying"
      +        ],
      +        "type": "string"
      +      },
      +      "verification": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "action": {
      +            "type": "string"
      +          },
      +          "connectionId": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "endpoint": {
      +            "type": "string"
      +          },
      +          "instruction": {
      +            "type": "string"
      +          },
      +          "scheduledPostId": {
      +            "type": "string"
      +          },
      +          "tool": {
      +            "type": "string"
      +          },
      +          "tools": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "cancel": {
      +                "type": "string"
      +              },
      +              "complete": {
      +                "type": "string"
      +              },
      +              "start": {
      +                "type": "string"
      +              },
      +              "status": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "status",
      +              "start",
      +              "complete",
      +              "cancel"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "connectionId",
      +          "tool",
      +          "endpoint",
      +          "action",
      +          "instruction"
      +        ],
      +        "type": "object"
      +      },
      +      "verificationUrl": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "note",
      +      "requiresVerification"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / addSearchMetadata / description
      Previous value: -"Generate SEO titles, descriptions, and a Substack slug for supported article destinations. In MCP it defaults to true when the account has article SEO access; pass false to skip. Readers do not see these fields; they help search engines and AI tools understand the article. X does not expose separate article SEO settings."New value: +"Generate SEO titles, descriptions, and a Substack slug for supported article destinations. SEO metadata is generated automatically on Revenue Writer, Full Agentic Mode, and Teams & Agencies, and for trials or other accounts with article SEO access. Set this option to false to turn it off. X does not support separate article SEO settings."
  4. Changed1 schema field changed
    • changedInput schema / properties / addSearchMetadata / description
      Previous value: -"Generate SEO titles, descriptions, and a Substack slug for supported article destinations. Requires article SEO access. X does not expose separate article SEO settings."New value: +"Generate SEO titles, descriptions, and a Substack slug for supported article destinations. In MCP it defaults to true when the account has article SEO access; pass false to skip. Readers do not see these fields; they help search engines and AI tools understand the article. X does not expose separate article SEO settings."
  5. Changed5 schema fields changed
    • changedInput schema / properties / platformSchedules / items / properties / platform / enum
      Previous value: -[
      -  "SUBSTACK",
      -  "MEDIUM",
      -  "LINKEDIN",
      -  "X"
      -]New value: +[
      +  "SUBSTACK",
      +  "MEDIUM",
      +  "LINKEDIN",
      +  "X",
      +  "WORDPRESS",
      +  "GHOST"
      +]
    • changedInput schema / properties / platforms / items / enum
      Previous value: -[
      -  "SUBSTACK",
      -  "MEDIUM",
      -  "LINKEDIN",
      -  "X"
      -]New value: +[
      +  "SUBSTACK",
      +  "MEDIUM",
      +  "LINKEDIN",
      +  "X",
      +  "WORDPRESS",
      +  "GHOST"
      +]
    • addedInput schema / properties / publishMode
      Added value: +{
      +  "description": "Only valid when all selected destinations are WordPress or Ghost. Defaults to publish; draft saves a remote draft at the scheduled time without publication.",
      +  "enum": [
      +    "publish",
      +    "draft"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / posts / items / properties / outcome
      Added value: +{
      +  "enum": [
      +    "saved_draft"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / posts / items / properties / remoteEditUrl
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  6. Changed1 schema field changed
    • changedOutput schema / properties / posts / items / properties / substackDelivery / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "note": {
      -        "type": "string"
      -      },
      -      "requiresVerification": {
      -        "type": "boolean"
      -      },
      -      "state": {
      -        "enum": [
      -          "waiting",
      -          "publishing"
      -        ],
      -        "type": "string"
      -      },
      -      "verification": {
      -        "additionalProperties": false,
      -        "properties": {
      -          "action": {
      -            "type": "string"
      -          },
      -          "connectionId": {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "endpoint": {
      -            "type": "string"
      -          },
      -          "instruction": {
      -            "type": "string"
      -          },
      -          "tool": {
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "connectionId",
      -          "tool",
      -          "endpoint",
      -          "action",
      -          "instruction"
      -        ],
      -        "type": "object"
      -      },
      -      "verificationUrl": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "note",
      -      "requiresVerification"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "note": {
      +        "type": "string"
      +      },
      +      "requiresVerification": {
      +        "type": "boolean"
      +      },
      +      "state": {
      +        "enum": [
      +          "waiting",
      +          "publishing",
      +          "verifying"
      +        ],
      +        "type": "string"
      +      },
      +      "verification": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "action": {
      +            "type": "string"
      +          },
      +          "connectionId": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "endpoint": {
      +            "type": "string"
      +          },
      +          "instruction": {
      +            "type": "string"
      +          },
      +          "tool": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "connectionId",
      +          "tool",
      +          "endpoint",
      +          "action",
      +          "instruction"
      +        ],
      +        "type": "object"
      +      },
      +      "verificationUrl": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "note",
      +      "requiresVerification"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  7. Changed1 schema field changed
    • changedOutput schema / properties / posts / items / properties / substackDelivery / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "note": {
      -        "type": "string"
      -      },
      -      "requiresVerification": {
      -        "type": "boolean"
      -      },
      -      "state": {
      -        "enum": [
      -          "waiting",
      -          "publishing"
      -        ],
      -        "type": "string"
      -      },
      -      "verificationUrl": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "note",
      -      "requiresVerification"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "note": {
      +        "type": "string"
      +      },
      +      "requiresVerification": {
      +        "type": "boolean"
      +      },
      +      "state": {
      +        "enum": [
      +          "waiting",
      +          "publishing"
      +        ],
      +        "type": "string"
      +      },
      +      "verification": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "action": {
      +            "type": "string"
      +          },
      +          "connectionId": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "endpoint": {
      +            "type": "string"
      +          },
      +          "instruction": {
      +            "type": "string"
      +          },
      +          "tool": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "connectionId",
      +          "tool",
      +          "endpoint",
      +          "action",
      +          "instruction"
      +        ],
      +        "type": "object"
      +      },
      +      "verificationUrl": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "state",
      +      "note",
      +      "requiresVerification"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  8. Changed2 schema fields changed
    • addedOutput schema / properties / posts / items / properties / substackDelivery
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "note": {
      +          "type": "string"
      +        },
      +        "requiresVerification": {
      +          "type": "boolean"
      +        },
      +        "state": {
      +          "enum": [
      +            "waiting",
      +            "publishing"
      +          ],
      +          "type": "string"
      +        },
      +        "verificationUrl": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "state",
      +        "note",
      +        "requiresVerification"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / posts / items / required
      Previous value: -[
      -  "heldForEditorialReview",
      -  "deliveryNote",
      -  "id",
      -  "itemUrl",
      -  "type",
      -  "status",
      -  "scheduledFor",
      -  "timezone",
      -  "publishedAt",
      -  "error",
      -  "platforms",
      -  "recurringScheduleId",
      -  "draft"
      -]New value: +[
      +  "substackDelivery",
      +  "heldForEditorialReview",
      +  "deliveryNote",
      +  "id",
      +  "itemUrl",
      +  "type",
      +  "status",
      +  "scheduledFor",
      +  "timezone",
      +  "publishedAt",
      +  "error",
      +  "platforms",
      +  "recurringScheduleId",
      +  "draft"
      +]
  9. Changed2 schema fields changed
    • addedOutput schema / properties / posts / items / properties / deliveryNote
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / posts / items / required
      Previous value: -[
      -  "heldForEditorialReview",
      -  "id",
      -  "itemUrl",
      -  "type",
      -  "status",
      -  "scheduledFor",
      -  "timezone",
      -  "publishedAt",
      -  "error",
      -  "platforms",
      -  "recurringScheduleId",
      -  "draft"
      -]New value: +[
      +  "heldForEditorialReview",
      +  "deliveryNote",
      +  "id",
      +  "itemUrl",
      +  "type",
      +  "status",
      +  "scheduledFor",
      +  "timezone",
      +  "publishedAt",
      +  "error",
      +  "platforms",
      +  "recurringScheduleId",
      +  "draft"
      +]
  10. Changed3 schema fields changed
    • changedOutput schema / properties / publicationChoiceReason / enum
      Previous value: -[
      -  "not_specified",
      -  "ambiguous",
      -  "identity_unconfirmed"
      -]New value: +[
      +  "not_specified",
      +  "ambiguous",
      +  "identity_unconfirmed",
      +  "confirmation_required"
      +]
    • removedOutput schema / properties / substackPublicationSelection / properties / source / const
      Removed value: -"remembered_choice"
    • addedOutput schema / properties / substackPublicationSelection / properties / source / enum
      Added value: +[
      +  "remembered_choice",
      +  "sole_connection"
      +]
  11. Changed10 schema fields changed
    • changedInput schema / properties / publication / description
      Previous value: -"Substack destination as a publication name, handle, or URL, for example \"AI Newsroom\", \"@theainewsroom\", or \"https://theainewsroom.substack.com\". Optional when exactly one active Substack publication is connected; Narrareach selects it automatically. Required when more than one active Substack publication is connected."New value: +"Substack destination as a publication name, handle, or URL, for example \"AI Newsroom\", \"@theainewsroom\", or \"https://theainewsroom.substack.com\". Optional when exactly one active Substack publication is connected; Narrareach selects it automatically. Required when more than one active Substack publication is connected, except that when it is missing Narrareach uses the publication the writer scheduled or published to most recently and says so in substackPublicationSelection.message, with publicationChoices listing the others; tell the writer which one was used. If there is no previous choice, the value is ambiguous, or Narrareach cannot confirm the session publishes there, nothing is scheduled and the result has requiresPublicationChoice: true with publicationChoices (name, handle, url, substackConnectionId). Ask which one they want, then call again with publication set to the chosen handle (and draftId when a draft was already saved)."
    • changedInput schema / properties / substackConnectionId / description
      Previous value: -"Legacy internal Substack connection identifier retained for backward compatibility; publication is the public destination selector."New value: +"Exact Substack connection identifier, retained for backward compatibility, for example publicationChoices[].substackConnectionId from a requiresPublicationChoice result. publication is the preferred public destination selector; when both are given they must name the same publication."
    • addedOutput schema / properties / choiceScope
      Added value: +{
      +  "enum": [
      +    "publication",
      +    "profile"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / code
      Added value: +{
      +  "const": "SUBSTACK_PUBLICATION_CHOICE_REQUIRED",
      +  "type": "string"
      +}
    • addedOutput schema / properties / message
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / nextStep
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "instruction": {
      +      "type": "string"
      +    },
      +    "tool": {
      +      "enum": [
      +        "schedule_article",
      +        "schedule_note"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "tool",
      +    "instruction"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / publicationChoiceReason
      Added value: +{
      +  "enum": [
      +    "not_specified",
      +    "ambiguous",
      +    "identity_unconfirmed"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / publicationChoices
      Added value: +{
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "handle": {
      +        "type": "string"
      +      },
      +      "isDefault": {
      +        "type": "boolean"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "substackConnectionId": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "handle",
      +      "url",
      +      "isDefault",
      +      "substackConnectionId"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / requiresPublicationChoice
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / substackPublicationSelection
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "instruction": {
      +      "type": "string"
      +    },
      +    "message": {
      +      "type": "string"
      +    },
      +    "publication": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "handle": {
      +          "type": "string"
      +        },
      +        "isDefault": {
      +          "type": "boolean"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "substackConnectionId": {
      +          "type": "string"
      +        },
      +        "url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "handle",
      +        "url",
      +        "isDefault",
      +        "substackConnectionId"
      +      ],
      +      "type": "object"
      +    },
      +    "source": {
      +      "const": "remembered_choice",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "source",
      +    "message",
      +    "publication",
      +    "instruction"
      +  ],
      +  "type": "object"
      +}
  12. Changed2 schema fields changed
    • changedInput schema / properties / coverImage / description
      Previous value: -"Optional cover image for a newly created draft, placed at the top of the published body. Supports public HTTPS URLs, data URIs, or base64 image bytes. URL ingestion depends on source-host access."New value: +"Optional cover image for a newly created draft, placed at the top of the published body. Supports public HTTPS URLs, data URIs, or base64 image bytes. URL ingestion depends on source-host access. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url."
    • changedInput schema / properties / media / description
      Previous value: -"Optional inline images or Substack article videos for a newly created draft. Replaces {{media:N}} placeholders in array order; leftovers are appended. kind defaults to image; video requires Substack as the sole platform. Supports public URLs, data URIs, and base64 bytes."New value: +"Optional inline images or Substack article videos for a newly created draft. Replaces {{media:N}} placeholders in array order; leftovers are appended. kind defaults to image; video requires Substack as the sole platform. Supports public URLs, data URIs, and base64 bytes. In ChatGPT, for a file the user attached in the chat, first call upload_media with it in file, then pass the returned publicUrl here as url."
  13. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-idempotent, non-destructive write, and the description adds meaningful behavior: pending session sync saves input as a draft without scheduling, warnings don't alter saved drafts, and it returns scheduling outcomes and advisories. It could say more about failure/permission behavior, but the added context is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and each subsequent sentence carries distinct information (draft creation, images/video, paywall, session sync, returns). It is dense and long, but given 24 parameters the length is largely justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description still covers the key edge cases (draft vs publish, video restrictions, Substack paywall, publication selection). Complete enough for correct invocation, with only minor gaps around permission/auth requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 96%, so the schema already documents nearly every parameter thoroughly. The description adds only light cross-cutting context (audience/email controlled by supplied fields) rather than new per-parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Schedule) plus resource (an article) and enumerates the exact destinations (Substack, Medium, LinkedIn Articles, X, WordPress, Ghost). This cleanly distinguishes it from siblings like schedule_note/schedule_notes and create_draft.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides rich contextual guidance: when draftId is absent it creates a draft, publishMode draft applies only to WordPress/Ghost, LinkedIn Articles needs a separate browser session, and Substack multi-publication ambiguity is handled. It stops short of explicit when-to-use-vs-alternative routing against sibling tools, so not a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources