Skip to main content
Glama

Edit Post

edit_post
DestructiveIdempotent

Patch a post, draft or published. Send only the fields you are changing.

Two behaviours here destroy content quietly:

  • SEO Title, Description, CoverImageURL, AuthorAvatarURL and CoverImageAlt distinguish omission from an empty string: omit to preserve the stored value; send "" to clear it. Other string fields still treat "" as unchanged.

  • Markdown, Tags and Categories REPLACE wholesale. A partial value deletes everything not in it — send one tag and the rest are gone; send a paragraph as Markdown and the rest of the post is gone. get_post returns the complete current values.

Title remains the visible headline. SEO Title independently overrides the search/social title, falling back to Title when empty. Summary is the human lede. Description independently overrides the metadata description; clearing it resumes the word-aware Summary fallback capped at 160 characters, never body text. The body renders with raw HTML disabled.

COVER. CoverImageURL is the post page/card/social-metadata/newsletter cover, separate from any image inside Markdown — setting one never touches the other. Set it to a URL upload_post_image returned for this workspace. Sending a new CoverImageURL without restating CoverImageAlt clears the alt text — send both to change the picture and keep its description.

AUTHOR PHOTO. AuthorAvatarURL is the author's photo, shown beside the byline and as the author's image in structured data. Set it to a URL upload_post_image returned for this workspace; "" removes it.

Editing never publishes and never re-sends. A post already broadcast cannot be broadcast again, so an edit after that reaches the blog but not the inboxes that already received it.

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": {
      "PostID": "<PostID>"
    },
    "name": "edit_post"
  }
}

Input Schema

NameRequiredDescriptionDefault
SlugNoNew URL slug. Changing it on a published post breaks existing links to that post and affects its search ranking. Format: lowercase words joined by hyphens.
TagsNoReplaces the existing tags WHOLESALE when non-empty, and cannot clear them - an empty array leaves them unchanged. To add one tag, send every existing tag plus the new one, or the rest are deleted; list_posts and get_post return the current tags. Each distinct term generates its own public index page, so a near-duplicate of a term already used on this blog splits one topic across two pages.
TitleNoNew visible headline: the page heading, index-card/RSS title and newsletter fallback subject. It is also the search/social title only when SEO Title is empty. Maximum 255 characters. Changing this does NOT change the slug, so a published URL stays stable. Omit or send an empty string to leave it unchanged.
AuthorNoNew author display name - the real person. Left unset on a post that has none, the structured data attributes it to the GoodSender organisation rather than to a person.
PostIDYesId of the post to patch, from create_post or list_posts.
SummaryNoNew lede under the title, the blog index card, the RSS entry and the post's line in llms.txt.
MarkdownNoNew body, replacing the existing one WHOLESALE - send the complete post, not just the changed part. Rendered by markdown-it with raw HTML disabled: tables, lists, links and footnote references such as [^1] render, while raw HTML, inline SVG and fenced mermaid blocks are escaped and publish as literal text. The current body comes from get_post; anything not sent is discarded. Image URLs come from upload_post_image; the API does not restrict Markdown image URLs, and an external or invented one may not render.
SEOTitleNoNew independent search/social title override. Omit to leave it unchanged, send text to replace it, or send an explicit empty string to clear it and resume the Title fallback. Maximum 255 characters.
AuthorURLNoNew 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 and publishes as no link at all.
CategoriesNoReplaces the existing categories WHOLESALE when non-empty, and cannot clear them - an empty array leaves them unchanged. Send the complete set, not just additions. Broad sections shared across the whole blog; list_posts shows the categories already in use.
ProvenanceNoRe-stamp agent attribution. All five fields are required together - a partial record is rejected - and the server re-stamps its own timestamp on every write that carries one. Omit it to leave the stored value unchanged.
DescriptionNoNew search/social description override: the meta description, OG/Twitter description and JSON-LD description. Never rendered on the page. Omit to leave it unchanged, send text to replace it, or send an explicit empty string to clear it and resume the existing word-aware Summary fallback capped at 160 characters, never body text.
PublishedAtNoOptional RFC 3339 publish timestamp, for example 2026-08-30T09:00:00Z. On a draft this pre-sets the public date that publish_post will then keep instead of stamping now. On a published post it rewrites the displayed date.
CoverImageAltNoNew text alternative for the cover image. An empty value marks a purely decorative cover (alt=""). Like CoverImageURL, omit and empty differ: omit to leave it as it is, send text to replace it, send an explicit empty string to clear it (a JSON null behaves as omitted). Sending a new CoverImageURL without restating CoverImageAlt clears the alt text — send both to change the picture and keep its description.
CoverImageURLNoNew cover image URL for the post page, card, social metadata, and the newsletter email - separate from any image inside Markdown. Omit to leave the cover as it is, send a URL upload_post_image returned for this workspace to replace it, or send an explicit empty string to clear it. A JSON null behaves the same as omitting the field - it does NOT clear the cover; use an empty string for that.
AuthorAvatarURLNoNew author photo URL, shown beside the byline and as the author's image in structured data. Like CoverImageURL, omit and empty differ: omit to leave the photo as it is, send a URL upload_post_image returned for this workspace to replace it, or send an explicit empty string to clear it. A JSON null behaves the same as omitting the field - it does NOT clear the photo; use an empty string for that. Changing Author alone keeps the previous author's photo beside the new name.

Output Schema

NameRequiredDescriptionDefault
SlugYesURL slug.
TagsYesTags.
TitleYesVisible post headline; also the search/social title fallback when SEO Title is empty.
AuthorYesAuthor display name if set.
PostIDYesPost id.
StatusYesdraft or published.
SummaryYesHuman-facing lede; also the word-aware metadata-description fallback when Description is empty.
MarkdownYesMarkdown body.
SEOTitleYesStored optional search/social title override, or empty when Title supplies the fallback.
AuthorURLYesAuthor URL if set.
CreatedAtYesISO-8601 created time.
UpdatedAtYesISO-8601 updated time.
CategoriesYesCategories.
ProvenanceYesAgent attribution, absent on a human-authored post.
DescriptionYesStored optional search/social description override, or empty when the word-aware Summary fallback supplies metadata.
PublishedAtYesISO-8601 publish time if set.
CoverImageAltYesCover image alt text, or empty when unset. (FR-020)
CoverImageURLYesCover 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.
AuthorAvatarURLYesAuthor photo URL if set — shown beside the byline and as the author's image in structured data.
LastBroadcastAtYesISO-8601 broadcast time if set.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • changedInput schema / properties / AuthorAvatarURL / description
      Previous value: -"New author photo URL, shown beside the byline and as the author's image in structured data. Like CoverImageURL, omit and empty differ: omit to leave the photo as it is, send a URL upload_post_image returned for this workspace to replace it, or send an explicit empty string to clear it. A JSON null behaves the same as omitting the field - it does NOT clear the photo; use an empty string for that. Changing Author to a different person? Replace or clear the photo too, or the previous author's face stays beside the new name."New value: +"New author photo URL, shown beside the byline and as the author's image in structured data. Like CoverImageURL, omit and empty differ: omit to leave the photo as it is, send a URL upload_post_image returned for this workspace to replace it, or send an explicit empty string to clear it. A JSON null behaves the same as omitting the field - it does NOT clear the photo; use an empty string for that. Changing Author alone keeps the previous author's photo beside the new name."
    • changedInput schema / properties / Categories / description
      Previous value: -"Replaces the existing categories WHOLESALE when non-empty, and cannot clear them - an empty array leaves them unchanged. Send the complete set, not just additions. Broad sections reused across the whole blog; reuse what list_posts shows before inventing one."New value: +"Replaces the existing categories WHOLESALE when non-empty, and cannot clear them - an empty array leaves them unchanged. Send the complete set, not just additions. Broad sections shared across the whole blog; list_posts shows the categories already in use."
    • changedInput schema / properties / CoverImageAlt / description
      Previous value: -"New alt text for the cover: what the picture SHOWS, for a reader who cannot see it; one sentence, never a repeat of the title. Leave it empty when the cover only decorates the title (that renders alt=\"\"). Like CoverImageURL, omit and empty differ: omit to leave it as it is, send text to replace it, send an explicit empty string to clear it (a JSON null behaves as omitted). Sending a new CoverImageURL without restating CoverImageAlt clears the alt text — send both to change the picture and keep its description."New value: +"New text alternative for the cover image. An empty value marks a purely decorative cover (alt=\"\"). Like CoverImageURL, omit and empty differ: omit to leave it as it is, send text to replace it, send an explicit empty string to clear it (a JSON null behaves as omitted). Sending a new CoverImageURL without restating CoverImageAlt clears the alt text — send both to change the picture and keep its description."
    • changedInput schema / properties / Description / description
      Previous value: -"New search/social description override: the meta description, OG/Twitter description and JSON-LD description. Never rendered on the page, so it must stand alone. Omit to leave it unchanged, send text to replace it, or send an explicit empty string to clear it and resume the existing word-aware Summary fallback capped at 160 characters, never body text. Aim for 120-160 characters."New value: +"New search/social description override: the meta description, OG/Twitter description and JSON-LD description. Never rendered on the page. Omit to leave it unchanged, send text to replace it, or send an explicit empty string to clear it and resume the existing word-aware Summary fallback capped at 160 characters, never body text."
    • changedInput schema / properties / SEOTitle / description
      Previous value: -"New independent search/social title override. Omit to leave it unchanged, send text to replace it, or send an explicit empty string to clear it and resume the Title fallback. Aim for about 50-60 characters; 255 is the hard limit."New value: +"New independent search/social title override. Omit to leave it unchanged, send text to replace it, or send an explicit empty string to clear it and resume the Title fallback. Maximum 255 characters."
    • changedInput schema / properties / Slug / description
      Previous value: -"New URL slug. Changing it on a PUBLISHED post breaks every existing link to that post and its search ranking - change it only when the current slug is genuinely wrong and the post is still a draft. Lowercase words joined by hyphens."New value: +"New URL slug. Changing it on a published post breaks existing links to that post and affects its search ranking. Format: lowercase words joined by hyphens."
    • changedInput schema / properties / Summary / description
      Previous value: -"New HUMAN line: the lede under the title, the blog index card, the RSS entry and the post's line in llms.txt. Written for a reader who has already arrived, continuing from the title rather than restating it. One or two sentences, aim for up to 300 characters. Must not repeat the Description sentence."New value: +"New lede under the title, the blog index card, the RSS entry and the post's line in llms.txt."
    • changedInput schema / properties / Tags / description
      Previous value: -"Replaces the existing tags WHOLESALE when non-empty, and cannot clear them - an empty array leaves them unchanged. To add one tag, send every existing tag plus the new one, or the rest are deleted; list_posts and get_post return the current tags. Reuse terms already used on this blog rather than coining near-duplicates: each distinct term generates its own public index page."New value: +"Replaces the existing tags WHOLESALE when non-empty, and cannot clear them - an empty array leaves them unchanged. To add one tag, send every existing tag plus the new one, or the rest are deleted; list_posts and get_post return the current tags. Each distinct term generates its own public index page, so a near-duplicate of a term already used on this blog splits one topic across two pages."
    • changedInput schema / properties / Title / description
      Previous value: -"New visible headline: the page heading, index-card/RSS title and newsletter fallback subject. It is also the search/social title only when SEO Title is empty. A specific claim, not a topic label; 255 is the hard limit. Changing this does NOT change the slug, so a published URL stays stable. Omit or send an empty string to leave it unchanged."New value: +"New visible headline: the page heading, index-card/RSS title and newsletter fallback subject. It is also the search/social title only when SEO Title is empty. Maximum 255 characters. Changing this does NOT change the slug, so a published URL stays stable. Omit or send an empty string to leave it unchanged."
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations (destructiveHint/idempotent already flag mutation) by naming the exact destruction modes: omit-vs-empty-string divergence on SEO/cover/avatar fields, and wholesale replacement of Markdown, Tags and Categories with the consequence spelled out. It also discloses the post-broadcast limit and the CoverImageURL/CoverImageAlt coupling — genuinely non-obvious behavior an agent could not infer elsewhere.

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?

Long, but every block is labeled (SEO/Title/Description, COVER, AUTHOR PHOTO) and front-loaded with the destructive surprises before the descriptive semantics. Some redundancy with the schema descriptions (e.g. the wholesale-replace wording) could be trimmed, but the length is defensible for a 16-parameter destructive tool.

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

Completeness5/5

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

With an output schema present and rich annotations, the residual burden on the description is behavioral edge cases — and those are fully covered: omission semantics, empty-string clearing, alt-text clearing, author-avatar persistence, and the immutability of already-broadcast posts. Nothing needed to call it safely is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by synthesizing the parameters into a prioritized hazard list (which fields destroy silently, which fields treat "" as clear) rather than restating them field-by-field. Much of that content is duplicated in the schema, which keeps it short of a 5.

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?

Opens with a specific verb and resource ('Patch a post, draft or published') and adds the operating constraint 'send only the fields you are changing.' The closing line 'Editing never publishes and never re-sends' cleanly separates it from publish_post, broadcast_post and reannounce_post without needing the schema.

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?

Explicitly routes the agent to get_post for complete current values and to upload_post_image for cover/avatar URLs, and states the when-not condition (this never publishes or re-broadcasts). It does not explicitly contrast with create_post for new posts, but the draft/published framing and sibling routing cover the practical decision.

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.