Skip to main content
Glama

Server Details

Publish blog posts, send newsletters and emails from Claude, Claude Code, Codex and ChatGPT.

Ownership verified
Status
Healthy
Uptime
100.0% over the last 24 hours
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
good-sender/mcp
GitHub Stars
1
Server Listing
GoodSender MCP Server
ChatGPT
–
Claude
–

TDQS

B3.2/5.0

Scored across 54 tools

Disambiguation3/5

Most resources are clearly separated (posts, templates, recipients, groups, sender identities, blog designs), but the email-sending surface has real overlap: enqueue_email, enqueue_template_email, send_consentless_email, send_template_draft_test_email, send_pending_emails, send_post_test and broadcast_post all send mail through slightly different paths. The very long descriptions mostly disambiguate them, but an agent must read carefully to avoid misselection.

Naming Consistency3/5

There are two competing conventions: verb_noun (create_post, list_groups, delete_recipients, edit_recipient) and resource-prefixed noun_verb (blog_design_list, blog_design_create, blog_design_checkpoint_restore), plus exceptions like blog_design_activate, get_post_distribution, template_format and upload_post_image. Names remain readable and groupable by resource, but the pattern is not predictable across the server.

Tool Count2/5

54 tools is far above the heavy threshold, and while the domain is genuinely broad (blog design, posts, distribution, templates, recipients, sending, domains), the blog-design checkpoint lifecycle alone contributes many near-parallel tools. The set feels over-expanded rather than tightly scoped.

Completeness4/5

Coverage is strong: full post lifecycle (create/get/edit/delete/publish/broadcast/reannounce/preview/distribution), template CRUD plus preview/format docs, recipient and group management, sender identities, blog settings, custom domain and design lifecycle. Minor gaps remain, notably no delete_group or delete_sender_identity/domain, so a few resources can be created but never fully retired.

Publisher details

Operator
GoodSender · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
Requires a GoodSender account (OAuth sign-in, no install). Blog tools need a workspace with a blog; sending email needs a sender identity on a verified domain. Daily and monthly sending quotas apply. On Claude Team/Enterprise an organization owner must add GoodSender first. · Publisher source

Available Tools

54 tools
add_group_membersAdd Group MembersC
Idempotent
Inspect

Add members to a group

Inputs: Members (required), GroupName (required). Returns: Result

blog_design_activateActivate a blog designA
DestructiveIdempotent
Inspect

Make this saved design the live blog design. Readers see it at once. The workspace keeps one active design. An empty design is rejected. This changes the public site immediately. The previous design stays in the list, so going back is activating it again (the stock one is flagged IsDefault in 'blog_design_list').

Inputs: DesignID (required). Returns: Title, DesignID

blog_design_checkpoint_listList blog design checkpointsA
Read-onlyIdempotent
Inspect

List all checkpoints of a design. The oldest checkpoint is the saved version. Newer checkpoints are unsaved versions of the same design.

Inputs: DesignID (required). Returns: Checkpoints

blog_design_checkpoint_restoreRestore blog design to a checkpointA
DestructiveIdempotent
Inspect

Restoring the design to a checkpoint deletes all checkpoints created since the chosen one. Selected checkpoint becomes the current one. The deleted checkpoints cannot be recovered. When this design is the active (live) blog design and the live version is one of the deleted checkpoints, the public blog changes at once to the restored checkpoint.

Inputs: CheckpointID (required). Returns: Title, Checkpoint

blog_design_createCreate a new blog designAInspect

Create a new blog design from Title, Templates, and Images. The blog title and description are blog settings returned by get_blog and changed by update_blog. A design never changes them.

'blog_design_template_format' documents the template format. Notices in the result report template problems for the user to review; a notice does not undo the design.

Inputs: Title (required), Images (required), Templates (required). Returns: Notices, NewCheckpoint

blog_design_editEdit blog designAInspect

Edit a blog design by applying changes to the templates. The blog title and description are blog settings returned by get_blog and changed by update_blog. A design never changes them.

'blog_design_template_format' documents the template format the changes must follow. Notices in the result report template problems for the user to review; a notice does not undo the checkpoint.

Inputs: Changes (required), DesignID (required), EditToken (required), CheckpointID (required), +1 more. Returns: Notices, NewCheckpoint

blog_design_get_latest_checkpointGet blog design contentsC
Read-onlyIdempotent
Inspect

Get the latest checkpoint of a design.

Inputs: DesignID (required). Returns: LatestCheckpoint

blog_design_image_upload_urlPrepare a blog design image upload URLAInspect

Get a short-lived URL for uploading one blog design image (logo or favicon).

PUT the image bytes to UploadURL. The JSON response field url is the stored image URL. blog_design_edit accepts that url as LogoURL, Favicon32URL, or Favicon180URL.

Returns: ExpiresAt, UploadURL

blog_design_listList all available blog designsA
Read-onlyIdempotent
Inspect

Returns a paginated list of saved blog designs ordered by creation date, with the active one and the stock (default) one flagged.

Inputs: Page (required). Returns: Page, Items, NextPage

blog_design_saveSave a blog designA
DestructiveIdempotent
Inspect

Keep this checkpoint and delete every older checkpoint of the same design. When this design is the active (live) blog design, the saved checkpoint goes live at once: readers of the public blog see it immediately. The checkpoint must be the newest one. The design id stays the same. Specified checkpoint becomes the only version of the design after saving. Template notices in the result are the ones already returned when the checkpoint was created.

Inputs: CheckpointID (required). Returns: Notices, DesignID

blog_design_template_formatBlog design template formatA
Read-onlyIdempotent
Inspect

GoodSender blog design template format and data documentation: the Liquid templates a blog design is made of, and the data each template receives.

broadcast_postBroadcast PostA
Destructive
Inspect

Email a published post's newsletter to consented recipients on the blog sending domain. At most once per post — and not at all if a publish already sent the newsletter selected in the post's distribution. Requires a configured blog sender and a public address for the post.

This is irreversible and unrepeatable — the one moment this post reaches the list. send_post_test sends a test copy of the same email to a single inbox beforehand.

The email carries the Subject, the post's cover image when one is set (CoverImageURL), the Summary (else the saved newsletter summary, else the post's summary) and a "Read the full post" link button to the post's public address — never the post body. edit_post changes the cover; an edit after broadcasting cannot reach the inboxes already sent. Without a Subject the email falls back to the saved subject, else the post title; a title and a subject are different jobs.

Inputs: PostID (required), Subject, Summary. Returns: Plan, Slug, Tags, Title, +17 more

check_sender_domain_statsCheck Sender Domain StatsA
Read-onlyIdempotent
Inspect

Report each email sender domain's verification status, consent counts and email counts.

Verification status is refreshed from GoodSender on every call. Consent and email counts are the server's last known state (see ConsentStateAsOf); this tool never sends email. The result is a per-domain table: one row per sender domain, stats in columns.

Returns: ConsentStateAsOf, StatsPerSenderDomain

connect_blog_domainConnect Blog Custom DomainA
Destructive
Inspect

Claim a custom hostname for the workspace blog. Returns DNS targets to configure. The blog must already have a title.

Inputs: Domain (required). Returns: Domain, Status, DNSCname, CheckedAt, +5 more

create_groupCreate GroupAInspect

Create a new group of recipients.

Recipient groups are used to specify multiple recipients for an email or email template in a reusable way. Group members can be added and removed after the group is created using the 'add_group_members' and 'remove_group_members' tools. After successful creation, the group can be used for enqueuing emails or creating email templates.

Inputs: GroupName (required), Recipients (required). Returns: Result

create_postCreate PostAInspect

Create 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.

Inputs: Title (required), Slug, Tags, Author, +11 more. Returns: Slug, Tags, Title, Author, +16 more

create_post_previewCreate Post PreviewAInspect

Mint a signed preview URL for a post (draft or published).

Inputs: PostID (required). Returns: URL

create_recipientsCreate RecipientsA
Destructive
Inspect

Register recipients on the server for the given verified sender domains and request their consent.

Every listed recipient is submitted, whether or not it already exists locally (for example as a member of a group made with create_group); the server decides who gets a consent email: pending recipients and ones asked more than the cooldown ago are (re-)asked, granted recipients are re-asked only once inactive (120+ days without opens or clicks), denied ones never. A non-empty name replaces the stored one and an empty name keeps it; edit_recipient changes only the name. Consent emails are queued by the server. DomainResults reports the request outcome; list_recipients reports the last-known consent state. Neither guarantees delivery.

Inputs: Recipients (required), SenderDomains (required). Returns: Result, DomainResults

create_sender_identityCreate Sender IdentityA
Idempotent
Inspect

Create a new sender identity.

The sender's domain must exist and be verified. Verification requires all five of its DNS records — both DKIM CNAMEs, the return-path CNAME, the click-tracking CNAME and the DMARC TXT — to be in place. The Domain page of the GoodSender Console (https://goodsender.com/dashboard) lists which records are still missing. 'check_sender_domain_stats' reports existing sender domains and their verification status.

Inputs: Sender (required). Returns: Result

create_template_draftCreate Template DraftAInspect

Create a draft of a new template. The draft can be edited, previewed, and saved as a template. 'template_format' documents the template format, with examples.

Every sender identity, recipient and recipient group the template references must already exist; a reference to one that does not fails validation. Sender identities, recipients and groups are listed by 'list_sender_identities', 'list_recipients' and 'list_groups', and created by 'create_sender_identity', 'create_recipients' and 'create_group'.

Inputs: Name (required), Template (required). Returns: Result, TemplateToken, TemplateDataSchema

delete_postDelete PostB
DestructiveIdempotent
Inspect

Permanently delete a post.

Inputs: PostID (required). Returns: Result

delete_recipientsDelete RecipientsA
DestructiveIdempotent
Inspect

Permanently delete recipients: removes each from all groups, and deletes all emails for those addresses (both historical and queued). Addresses not in the database are ignored.

Inputs: Recipients (required). Returns: Result

delete_templateDelete TemplateA
DestructiveIdempotent
Inspect

Permanently delete a template by name. Also removes all emails created using this template from the database.

Inputs: Name (required). Returns: Result

edit_postEdit PostA
DestructiveIdempotent
Inspect

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.

Inputs: PostID (required), Slug, Tags, Title, +12 more. Returns: Slug, Tags, Title, Author, +16 more

edit_recipientEdit RecipientA
DestructiveIdempotent
Inspect

Update display name for an existing recipient. Does not trigger any new consent requests.

Inputs: Recipient (required). Returns: Result

edit_sender_identityEdit Sender IdentityA
DestructiveIdempotent
Inspect

Update display name for an existing sender identity. Does not change email or domain.

Inputs: Sender (required). Returns: Result

edit_templateEdit TemplateAInspect

Edit a template using ordered search/replace changes. On success, modified template draft token is returned while old template token is invalidated.

Each change locates an exact OldString substring in the current template content and replaces it with NewString. OldString MUST be unique in the current content; include surrounding context (entire lines, nearby tags) until it is unique. Changes apply sequentially: each change sees the result of all previous changes.

  • To insert: set OldString to a unique anchor that already exists, set NewString to that same anchor plus the inserted text.

  • To delete: set NewString to an empty string.

Changes match against the current content, which 'get_template_content' returns. 'template_format' documents the template format.

Inputs: Changes (required), TemplateToken (required). Returns: Result, UpdatedTemplate, UpdatedTemplateToken, UpdatedTemplateDataSchema

enqueue_emailEnqueue EmailA
Destructive
Inspect

Enqueue an email to be sent.

Consentless template emails are sent immediately. Emails to recipients who have already granted consent are sent right away. For every other recipient the email is queued, and a consent request is sent now if the recipient has none yet. A queued email is sent once its recipient has granted consent and consent state is next refreshed: by 'send_pending_emails', or by a later call to another tool that sends email. Nothing is sent while the server is idle.

Inputs: To (required), Body (required), Subject (required), From. Returns: Result

enqueue_template_emailEnqueue Template EmailA
Destructive
Inspect

Enqueue a template-based email to be sent.

Emails to recipients who have already granted consent are sent right away. For every other recipient the email is queued, and a consent request is sent now if the recipient has none yet. New recipients are auto-registered and sent the consent request during this call. A queued email is sent once its recipient has granted consent and consent state is next refreshed: by 'send_pending_emails', or by a later call to another tool that sends email. Nothing is sent while the server is idle.

Inputs: TemplateData (required), TemplateName (required). Returns: Result

get_blogGet Blog SettingsA
Read-onlyIdempotent
Inspect

Get publication settings for the API key's workspace (title, description, sender, theme, custom domain) and the live design state. Design.IsDefault true means the blog still renders the stock design every workspace starts from; the blog_design_* tools create a custom one. Theme says nothing about it.

Returns: Theme, Title, Design, SEOTitle, +9 more

get_blog_custom_domainGet Blog Custom DomainA
Read-onlyIdempotent
Inspect

Get custom-domain claim status and DNS targets for the workspace blog.

Returns: Domain, Status, DNSCname, CheckedAt, +5 more

get_postGet PostA
Read-onlyIdempotent
Inspect

Get one post by id, including markdown body.

Inputs: PostID (required). Returns: Slug, Tags, Title, Author, +16 more

get_post_distributionGet Post DistributionA
Read-onlyIdempotent
Inspect

Where a post goes when it is published, and what earlier publishes did there.

For each of the six third-party destinations — dev.to (Republish: the whole post, updated on each publish), X, LinkedIn, Bluesky and Mastodon (Announce: a short Text plus the post's HomeURL, once), and Hashnode, retired and always reported Available: false — whether it is Available, Connected (and as which Account), Selected, the reviewed Copy and the Text an announce would post, the Budget the Copy (else the Text) uses with the link, when it was last delivered, the last Error, whether one is InProgress, and where it landed. ExternalURL links to the delivered post on any destination when available, including disconnected accounts. For the newsletter: Selected, Subject, Summary, how many Recipients it would reach, what Blocker stops it, and SentAt.

publish_post acts on exactly this selection: it is what will go out in the user's name. Read-only.

Inputs: PostID (required). Returns: PostID, Status, HomeURL, Newsletter, +2 more

get_templateGet TemplateA
Read-onlyIdempotent
Inspect

Get a template by name. The returned template token is accepted by 'render_template_preview', 'edit_template', 'get_template_content' and 'save_template'. Edits made with the token stay in a draft until 'save_template' stores them under the template's name.

Inputs: Name (required). Returns: TemplateToken, TemplateDataSchema

get_template_contentGet Template ContentA
Read-onlyIdempotent
Inspect

Get current contents of a template including all pending changes made with 'edit_template' tool.

Inputs: TemplateToken (required). Returns: Content

list_groupsList GroupsC
Read-onlyIdempotent
Inspect

List all groups

Returns: Groups

list_postsList PostsA
Read-onlyIdempotent
Inspect

List all posts (draft and published) for the API key's workspace blog.

The only view of the blog a new post is written into, and the source for three things a draft would otherwise invent:

  • The byline: Author, AuthorURL and AuthorAvatarURL of the most recent post. upload_post_image returns URLs accepted for new author photos.

  • The taxonomy: the Tags and Categories already in use. Each distinct term generates its own public index page, so near-duplicates such as AI, ai and artificial-intelligence become three pages of one post instead of one page of three.

  • The house voice, and whether the topic has already been covered.

Also returns each post's PostID, Status and LastBroadcastAt.

Returns: Posts

list_recipientsList RecipientsA
Read-onlyIdempotent
Inspect

List recipients with group memberships and their last known consent status per verified sender domain (as of ConsentStateAsOf).

Inputs: Limit, AfterEmail. Returns: Recipients, ConsentStateAsOf

list_sender_identitiesList Sender IdentitiesA
Read-onlyIdempotent
Inspect

List all sender identities and whether each sender's domain is verified.

Returns: SenderIdentities

list_templatesList TemplatesA
Read-onlyIdempotent
Inspect

List all email templates.

Returns: Templates

publish_postPublish PostA
Destructive
Inspect

Publish a post to the public blog, then act on its distribution.

Makes the post publicly reachable and eligible for search indexing, the RSS feed and llms.txt — and delivers it wherever its distribution is selected: every selected Republish destination (dev.to) receives the post, and is updated in place on a later publish; every selected Announce destination (X, LinkedIn, Bluesky, Mastodon) that has not announced this post yet posts its text and the post's link, once; and a selected newsletter is emailed to the list, once. Publishing again never announces or mails twice. A third-party failure never fails the publish — it is recorded on that destination instead — and a newsletter blocker (no sending domain, no From address, no public address) means the email is not sent, so each delivery is attempted, not guaranteed.

get_post_distribution reports exactly where this will go. Those posts and that email go out in the user's name and cannot be recalled.

The post publishes with the fields it has: without a Description the search snippet publishes empty; without a Summary themed blogs render no lede; without an Author the structured data credits the GoodSender organisation instead of a person; AuthorAvatarURL is the byline photo (optional; a URL returned by upload_post_image, or the photo of the most recent post by the same author). get_post shows all of them.

The public date comes from PublishedAt: this stamps the current time only when that field is still empty, and keeps a value already set, so a back-dated draft publishes with its own date.

broadcast_post emails the list after publishing without requiring the newsletter to be selected in the distribution — also at most once per post.

Inputs: PostID (required). Returns: Plan, Post, Title, Distribution

reannounce_postRe-announce PostA
Destructive
Inspect

Post a published post to one Announce destination (X, LinkedIn, Bluesky or Mastodon) again — the only way to announce twice, and the retry for an announce that failed. A publish never announces a post twice on its own.

This posts publicly in the user's name, and a second post on the same platform cannot be recalled from GoodSender. The destination must be selected in the post's distribution, connected, and the post must have a public address to link to; the announce is queued and its outcome appears on get_post_distribution. Plan lists the exact text and link that will be posted.

Inputs: PostID (required), Destination (required). Returns: Plan, Result, Distribution

remove_blog_custom_domainRemove Blog Custom DomainB
DestructiveIdempotent
Inspect

Remove the claimed custom domain from the workspace blog.

Returns: Domain, Status, DNSCname, CheckedAt, +5 more

remove_group_membersRemove Group MembersC
DestructiveIdempotent
Inspect

Remove members from a group

Inputs: GroupName (required), MemberEmails (required). Returns: Result

render_template_previewRender Template PreviewA
Read-onlyIdempotent
Inspect

Render a template preview with provided data: the email exactly as the template produces it.

'template_format' documents the template format. The sender identity in the template header must exist; otherwise rendering returns an error.

Inputs: TemplateData (required), TemplateToken (required). Returns: To, From, HTML, Result, +5 more

save_templateSave TemplateC
DestructiveIdempotent
Inspect

Save referenced template into the database.

Inputs: TemplateToken (required). Returns: Result

send_consentless_emailSend Consentless EmailA
Destructive
Inspect

Send a consentless template-based email.

The email is sent immediately, without waiting for recipient's consent.

Inputs: To (required), Subject (required), Template (required), From. Returns: Result

send_pending_emailsSend Pending EmailsA
Destructive
Inspect

Send queued custom and template emails whose recipients have granted consent since they were queued.

Refreshes sender domains and recipient consent state from GoodSender, then hands every queued email whose recipient has now consented to the mail queue, which sends it within seconds. Sending cannot be undone. Emails whose recipient has not consented stay queued; emails to recipients who declined are dropped. Returns the remaining queue per sender domain.

Returns: EmailsPerDomain, ConsentStateAsOf

send_post_testSend Post Test EmailA
Destructive
Inspect

Send a one-off test email of the post to a single inbox. Requires a configured blog sender. Charges the workspace send quota.

The rehearsal for broadcast_post, and the only way to see a post as an email before it reaches the list. Works on a draft, so it belongs before publishing, not after.

The test is meant for the user's own inbox, not an address from the mailing list. With the Subject and Summary intended for the broadcast it rehearses the real thing: the email carries the subject, the post's cover image when one is set (CoverImageURL, which create_post and edit_post set), that summary and a link to the post — never the post body. A post with no public address yet still sends: its link then points at the blog landing page instead of the post.

Inputs: PostID (required), Recipient (required), Subject, Summary. Returns: Result, Recipient

send_template_draft_test_emailSend Template Draft Test EmailA
Destructive
Inspect

Enqueue one test email from a draft template (by token) as custom content — not linked to a saved template name.

Rendered subject and body come from the draft; only the given recipient receives the message (template To:/groups ignored for delivery). Consent rules match other enqueue tools: sends immediately if consent is already granted; otherwise it queues and is sent on the next tool call that refreshes consent state after consent is granted.

Inputs: Recipient (required), TemplateData (required), TemplateToken (required). Returns: Result

set_post_distributionSet Post DistributionA
DestructiveIdempotent
Inspect

Change where a post goes when it is published: select or deselect each destination, set or clear each Announce destination's reviewed text, and select the newsletter with its subject and summary. Only what you pass changes; omitted fields stay as they are.

The GoodSender API enforces the dashboard's rules: a destination can be turned on only while it is connected and syndication is available, and an Announce text can be saved only while syndication is available and must fit its destination's limit (turning one off or clearing a text is always allowed). A request the API refuses changes nothing. Nothing is published or sent here — publish_post acts on this selection.

get_post_distribution reports the current selection. Changes lists exactly what this call changes; the selection decides what later goes out in the user's name.

Inputs: PostID (required), X, Devto, Bluesky, +3 more. Returns: Result, Changes, Distribution

template_formatTemplate FormatC
Read-onlyIdempotent
Inspect

GoodSender email template format documentation

update_blogUpdate Blog SettingsA
DestructiveIdempotent
Inspect

Create or patch publication settings for the API key's workspace. This is the only place the public title and description are set. SEO Title and SEO Description are publication-wide overrides for the blog homepage and archive, independent of the visible Title and Description. Omit either SEO field to preserve it, send text to replace it, or send "" to clear it and resume that field's current public-content fallback. Other empty string fields remain omitted. A title is required the first time settings are saved.

Inputs: Theme, Title, SEOTitle, SenderName, +5 more. Returns: Theme, Title, Design, SEOTitle, +9 more

upload_post_imageUpload Post ImageAInspect

Upload an image for a blog post. Send the file bytes as base64 — works in local and hosted MCP. Converted to WebP and stored; returns a stable HTTPS URL. Allowed types: JPEG, PNG, GIF, WebP. Max 10 MB decoded.

A URL this tool returned for this workspace is the only one the API accepts as a cover or an author photo. The URL also works for in-body images. Markdown is not restricted by the API, but external, guessed or placeholder image URLs may not render, and local file paths are not publicly accessible.

The URL has three independent uses, and setting one does not set the others:

  • COVER. CoverImageURL on create_post or edit_post: the post page/card/social-metadata/newsletter image, described by CoverImageAlt.

  • AUTHOR PHOTO. AuthorAvatarURL on create_post or edit_post: the photo beside the byline and the author's image in structured data.

  • BODY ILLUSTRATION. Insert it into Markdown as alt where the text earns it — a diagram or figure that shows something the prose cannot.

It takes real image bytes, such as a file the user supplied. Nothing else substitutes for them: the blog renders markdown with raw HTML disabled, so inline SVG and fenced mermaid blocks publish as visible literal text rather than as a picture. A markdown table or a structured list is the correct way to carry a comparison or a set of figures.

A body illustration's alt text describes what the image SHOWS. It is what screen readers announce and what appears when the image fails to load; the filename is only a fallback. For the cover, that description goes in CoverImageAlt on create_post/edit_post, and is omitted when the cover only decorates the title.

Inputs: DataBase64 (required), ContentType (required), Filename. Returns: URL, Bytes, Width, Height

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    Related MCP Connectors

    Related MCP Servers

    Try in Browser

    Glama MCP Gateway

    Add one secure layer between your agents and this server.