get_article
Get Article. Get one WriteStack article by ID, including markdown body, publicationId, contentVersion, and Substack draft/schedule status.
| Group | Access | MCP name |
|---|---|---|
| Articles | Read-only | get_article |
Description
The description the MCP server sends to the model, word for word. Its rules apply to every call.
Get one WriteStack article by ID, including markdown body, publicationId, contentVersion, and Substack draft/schedule status. The markdown may include headings, bold/italic/strike/code, lists, blockquotes, :::pullquote, :::callout, and :::paywall. ALWAYS call this immediately before update_article and pass the returned contentVersion as baseVersion — the user may have edited the article in WriteStack since you last saw it.
Arguments
| Argument | Type | Required | Description |
|---|---|---|---|
articleId | string | Yes | WriteStack article ID |
Example call
The smallest valid request: required arguments only, with placeholder values.
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_article",
"arguments": {
"articleId": "…"
}
}
}Result
The result has structuredContent that matches this schema. The same data is also in content as JSON text.
| Field | Type | Required | Description |
|---|---|---|---|
bodyMarkdown | string | null | Yes | |
contentVersion | number | No | |
id | string | Yes | |
images | object[] | No | |
images[].s3Url | string | Yes | |
images[].substackUrl | string | null | Yes | |
plannedForDate | string | null | Yes | |
publicationId | number | Yes | |
publishAt | string | null | No | |
status | string | Yes | |
substackDraftUrl | string | null | No | |
substackScheduledAt | string | null | No | |
substackSyncStatus | string | No | |
subtitle | string | null | Yes | |
title | string | Yes | |
topic | string | Yes |
Annotations
| Hint | Value |
|---|---|
readOnlyHint | true |
destructiveHint | false |
openWorldHint | false |
The full input and output JSON Schemas for every tool are in /mcp-tools.json.