GoodSender
Server Details
Publish blog posts, send newsletters and emails from Claude, Claude Code, Codex and ChatGPT.
- 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
Scored across 54 tools
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.
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.
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.
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
- Operator website
- https://goodsender.com · Publisher source
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://goodsender.com/docs/mcp/ · 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 toolsadd_group_membersAdd Group MembersCIdempotentInspect
Add members to a group
Inputs: Members (required), GroupName (required). Returns: Result
blog_design_activateActivate a blog designADestructiveIdempotentInspect
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 checkpointsARead-onlyIdempotentInspect
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 checkpointADestructiveIdempotentInspect
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 contentsCRead-onlyIdempotentInspect
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 designsARead-onlyIdempotentInspect
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 designADestructiveIdempotentInspect
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 formatARead-onlyIdempotentInspect
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 PostADestructiveInspect
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 StatsARead-onlyIdempotentInspect
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 DomainADestructiveInspect
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 RecipientsADestructiveInspect
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 IdentityAIdempotentInspect
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 PostBDestructiveIdempotentInspect
Permanently delete a post.
Inputs: PostID (required). Returns: Result
delete_recipientsDelete RecipientsADestructiveIdempotentInspect
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 TemplateADestructiveIdempotentInspect
Permanently delete a template by name. Also removes all emails created using this template from the database.
Inputs: Name (required). Returns: Result
edit_postEdit PostADestructiveIdempotentInspect
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 RecipientADestructiveIdempotentInspect
Update display name for an existing recipient. Does not trigger any new consent requests.
Inputs: Recipient (required). Returns: Result
edit_sender_identityEdit Sender IdentityADestructiveIdempotentInspect
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 EmailADestructiveInspect
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 EmailADestructiveInspect
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 SettingsARead-onlyIdempotentInspect
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 DomainARead-onlyIdempotentInspect
Get custom-domain claim status and DNS targets for the workspace blog.
Returns: Domain, Status, DNSCname, CheckedAt, +5 more
get_postGet PostARead-onlyIdempotentInspect
Get one post by id, including markdown body.
Inputs: PostID (required). Returns: Slug, Tags, Title, Author, +16 more
get_post_distributionGet Post DistributionARead-onlyIdempotentInspect
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 TemplateARead-onlyIdempotentInspect
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 ContentARead-onlyIdempotentInspect
Get current contents of a template including all pending changes made with 'edit_template' tool.
Inputs: TemplateToken (required). Returns: Content
list_groupsList GroupsCRead-onlyIdempotentInspect
List all groups
Returns: Groups
list_postsList PostsARead-onlyIdempotentInspect
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 RecipientsARead-onlyIdempotentInspect
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 IdentitiesARead-onlyIdempotentInspect
List all sender identities and whether each sender's domain is verified.
Returns: SenderIdentities
list_templatesList TemplatesARead-onlyIdempotentInspect
List all email templates.
Returns: Templates
publish_postPublish PostADestructiveInspect
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 PostADestructiveInspect
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 DomainBDestructiveIdempotentInspect
Remove the claimed custom domain from the workspace blog.
Returns: Domain, Status, DNSCname, CheckedAt, +5 more
remove_group_membersRemove Group MembersCDestructiveIdempotentInspect
Remove members from a group
Inputs: GroupName (required), MemberEmails (required). Returns: Result
render_template_previewRender Template PreviewARead-onlyIdempotentInspect
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 TemplateCDestructiveIdempotentInspect
Save referenced template into the database.
Inputs: TemplateToken (required). Returns: Result
send_consentless_emailSend Consentless EmailADestructiveInspect
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 EmailsADestructiveInspect
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 EmailADestructiveInspect
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 EmailADestructiveInspect
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 DistributionADestructiveIdempotentInspect
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 FormatCRead-onlyIdempotentInspect
GoodSender email template format documentation
update_blogUpdate Blog SettingsADestructiveIdempotentInspect
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
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
Read, write, translate and sync WordPress and Webflow blog articles from Claude.
Write blog articles with AI and publish them to WordPress, Shopify and 30+ platforms.
Email marketing in Claude or ChatGPT: draft, preview and send campaigns. You approve every send.
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMulti-platform blog publishing tool that enables users to save, schedule, and publish SEO-optimized articles to platforms like websites, LinkedIn, Twitter, and Substack directly from Claude.-
- AlicenseNot gradedqualityDmaintenanceCreate, manage, and publish Substack posts with full rich text formatting directly from Claude Desktop or any MCP-compatible client.64 npm26MIT
- AlicenseAqualityBmaintenanceEnables AI tools to research, write, and publish finished blog posts to Ghost and WordPress in the user's voice, supporting multiple author personas and destinations through natural language.142MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI coding assistants to publish news articles to a website database, REST API, or local JSON file.-
Glama MCP Gateway
Add one secure layer between your agents and this server.