Create Post
create_postCreate a draft post on the workspace blog. Never publishes or sends: publish_post and broadcast_post are separate, explicit acts.
The fields are not interchangeable blurbs — each feeds a different surface, and one left blank degrades that surface silently rather than failing.
list_posts is the only view of this blog, and it carries two things a new draft would otherwise lack:
The Author, AuthorURL and AuthorAvatarURL of the most recent post: the blog's established byline. A new author photo is hosted by upload_post_image.
The Tags and Categories already in use. Every distinct term generates its own public index page, so a near-duplicate splits one topic across two pages holding one post each.
The four text fields appear on different surfaces:
Title is the visible headline — the page heading, index-card/RSS title, and newsletter fallback subject.
SEO Title is an optional independent search/social title. When blank, search and social metadata fall back to Title.
Summary is the HUMAN line — the lede under the title, the index card, the RSS entry. For a reader who has already arrived; when Description is blank, its word-aware first 160 characters also supply the metadata fallback.
Description is an optional search/social override, never rendered on the page. Blank uses the Summary fallback, never the post body.
BODY. Markdown, rendered with raw HTML disabled. Tables and footnotes render; raw HTML, inline SVG and fenced mermaid blocks do not — they publish as visible literal text. A comparison renders as a markdown table; a diagram does not render.
IMAGES. A body image is a Markdown image whose URL upload_post_image returned. An external URL, an invented path or SVG does not render as a picture; a table or a structured list carries a comparison instead.
COVER. The post page, card, social metadata, and the newsletter email use the dedicated CoverImageURL field, never the first Markdown image. Set it to a URL upload_post_image returned for this workspace; omit it to publish with no cover. Setting the cover does not add anything to Markdown, and a Markdown image is never picked up as the cover automatically. CoverImageAlt supplies the cover's text alternative. An omitted alt text marks a purely decorative cover.
The result is a draft. publish_post puts it on the public blog; broadcast_post emails the list and takes its own inbox-specific Subject.
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": {
"Title": "<Title>"
},
"name": "create_post"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| Slug | No | Optional URL slug. When omitted, one is derived from the title and de-duplicated against the workspace. Format: lowercase words joined by hyphens. | |
| Tags | No | Topic terms. Each one generates its own public tag index page, so a term already used on this blog (listed by list_posts) keeps one page per topic, while near-duplicates - AI, ai and artificial-intelligence - become three pages holding one post each instead of one page holding three. | |
| Title | Yes | Post headline and visible identity: the page heading, index-card title, RSS title and newsletter fallback subject. This is also the search/social title only when SEO Title is empty. Maximum 255 characters. | |
| Author | No | Author display name - the real person writing; the most recent post from list_posts carries the blog's current byline. Left blank, the post's structured data attributes it to the GoodSender organisation rather than to a person. | |
| Summary | No | The lede under the title on the post page, the preview blurb on the blog index card, the RSS entry, and the post's line in llms.txt. | |
| Markdown | No | The post body in Markdown, rendered by markdown-it with raw HTML DISABLED. Tables, lists, headings, links, blockquotes and footnote references such as [^1] all render. Raw HTML, inline SVG and fenced mermaid blocks do NOT - they are escaped and published as visible literal text; a comparison renders as a markdown table. Image URLs come from upload_post_image; the API does not restrict Markdown image URLs, and an external or invented one may not render. | |
| SEOTitle | No | Optional search/social title override, independent of the visible Title. Omit or send an empty string to use Title as the fallback. Maximum 255 characters. | |
| AuthorURL | No | Author profile URL matching Author - LinkedIn, GitHub or a personal site. MUST carry the scheme: a value that does not parse as http:// or https:// is silently DROPPED, so a bare handle or a scheme-less domain publishes as no link at all. | |
| Categories | No | Blog sections such as Guides, News or Engineering. Each generates its own public index page; list_posts shows the categories already in use. Categories group posts; Tags describe them. | |
| Provenance | No | Optional agent attribution recording that this post was machine-authored. All five fields are required together - a partial record is rejected - and the server stamps its own timestamp. It applies to a post written by an agent working in a code repository; omitted, no attribution is recorded. | |
| Description | No | Optional search/social description override: the meta description, OG/Twitter description and JSON-LD description. No theme renders it on the post page. Omit or send an empty string to use the existing word-aware Summary fallback capped at 160 characters, never body text. | |
| PublishedAt | No | Optional RFC 3339 publish timestamp, for example 2026-08-30T09:00:00Z. Omit it on a normal draft: publish_post stamps the current time when this is still empty, and keeps a value that is already set. Set it only to back-date an imported post or to carry a specific public date. | |
| CoverImageAlt | No | Optional text alternative for the cover image. Omission renders alt="". Ignored without CoverImageURL. | |
| CoverImageURL | No | Optional cover image URL, rendered on the post page, card, social metadata, and in the newsletter email - separate from any image inside Markdown. Only a URL upload_post_image returned for this workspace is valid; omit it to publish with no cover. Setting it does not add anything to Markdown, and an image already in Markdown is never picked up as the cover. | |
| AuthorAvatarURL | No | Optional author photo URL, shown beside the byline and as the author's image in structured data. Only a URL upload_post_image returned for this workspace is valid; omit it for no photo. The most recent post from list_posts carries the current author's AuthorAvatarURL. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| Slug | Yes | URL slug. | |
| Tags | Yes | Tags. | |
| Title | Yes | Visible post headline; also the search/social title fallback when SEO Title is empty. | |
| Author | Yes | Author display name if set. | |
| PostID | Yes | Post id. | |
| Status | Yes | draft or published. | |
| Summary | Yes | Human-facing lede; also the word-aware metadata-description fallback when Description is empty. | |
| Markdown | Yes | Markdown body. | |
| SEOTitle | Yes | Stored optional search/social title override, or empty when Title supplies the fallback. | |
| AuthorURL | Yes | Author URL if set. | |
| CreatedAt | Yes | ISO-8601 created time. | |
| UpdatedAt | Yes | ISO-8601 updated time. | |
| Categories | Yes | Categories. | |
| Provenance | Yes | Agent attribution, absent on a human-authored post. | |
| Description | Yes | Stored optional search/social description override, or empty when the word-aware Summary fallback supplies metadata. | |
| PublishedAt | Yes | ISO-8601 publish time if set. | |
| CoverImageAlt | Yes | Cover image alt text, or empty when unset. (FR-020) | |
| CoverImageURL | Yes | Cover image URL, or empty when unset. Rendered on the post page, card, social metadata, and in the newsletter email - distinct from any image inside Markdown. CoverImageAlt describes it. | |
| AuthorAvatarURL | Yes | Author photo URL if set — shown beside the byline and as the author's image in structured data. | |
| LastBroadcastAt | Yes | ISO-8601 broadcast time if set. |