Overview
This article lists every tool the Postnomic MCP server exposes, grouped by area, with each tool's purpose and key parameters. Every tool runs through the same REST API as the dashboard, as the owner of the connected Personal Access Token — see MCP Server Overview for how authentication and permissions work.
Public IDs (blogId, postId) are the same public identifiers used throughout the Postnomic API
and dashboard URLs, not internal database IDs.
Blogs
list_blogs— List the blogs the authenticated user can access, with their public IDs, names, slugs, anddefaultLanguage— the language a post's own title and content are written in. Other languages are added withset_post_translation. No parameters.create_blog— Create a new blog. You become its Admin. The blog counts against your plan: once the plan's blog limit is reached the call is refused with 403 "Blog limit reached"; a slug that is taken or reserved is refused with 409.name,slug(lowercase letters and digits separated by single hyphens),canonicalBaseUrl.description(optional),defaultLanguage(optional two-letter code, defaulten; cannot be changed later),defaultLayout(optional,DefaultorMasonry),sidebarTagLimit(optional).
rename_blog— Rename a blog: its display name, its slug, or both. Requires the Admin role. Changing the slug copies all of the blog's media files to the new slug, rewrites the media references stored in that blog's posts and translations, and then switches the blog's address. No other blog is touched. The old slug and every old media URL keep answering for 90 days, so existing integrations and links keep working. It is reversible: rename back to the old slug. If the call fails part-way the blog is unchanged — repeat the same call to continue. See Renaming a Blog in Blog Settings.blogId.name,slug(both optional, at least one).
list_former_blog_slugs— List the slugs a blog had before it was renamed, with when each was retired and until when it keeps answering. Requires the Admin role.blogId.
Posts (read)
list_posts— List all posts on a blog.blogId— the blog's public ID.
get_post— Get a single post by its public ID.blogId,postId.
get_post_by_slug— Get a single post by its URL slug, when you do not have its public ID. The slug may be the post's own or one of its translations'.blogId,slug.includeUnpublished(optional, defaulttrue) — also find drafts and scheduled, unpublished, and archived posts. That needs the Editor role; passfalseto look among published posts only, which any member of the blog may do.
Posts (write)
create_post— Create a new post. Created as a draft unlesspublishis set.blogId,title,slug(must be unique within the blog).authorIdentityUserId(optional) — defaults to the caller.content,excerpt(optional).tags,categories(optional arrays of slugs).publish(optional, defaultfalse) — publish immediately after creation.publishedAt(optional) — the UTC date/time the post was originally published. The post is then created already published with that publication date, which is what you want when importing content first published elsewhere. It needs the Editor role, must not be in the future (useschedule_postfor that), and cannot be combined with a required review; each is rejected with 400/403 rather than silently creating a draft.coverImageUrl,thumbnailImageUrl,shareImageUrl(optional) — see Media below.
update_post— Replace a post's title, slug, content, excerpt, tags, categories, and image URLs. Anything you leave out is cleared, so read the post withget_postfirst.blogId,postId,title,slug,content,excerpt,tags,categories.coverImageUrl,thumbnailImageUrl,shareImageUrl(optional).publishedAt(optional) — the UTC date/time the post was originally published. Use it to restore a publication date that republishing overwrote, for example afterunarchive_postandpublish_post. Accepted only while the post is Published or Unpublished, and never for a future time — useschedule_postfor that; both are rejected with 400. Omit it and the stored publication date is left untouched. See Post Lifecycle in Content Publishing for the full rules.
delete_post— Delete a post by archiving it. The post is taken offline but kept, andunarchive_postrestores it. Identical toarchive_post.blogId,postId.
archive_post— Archive a post: taken offline, kept with all its content, restorable withunarchive_post. Requires the Editor role.blogId,postId.
delete_post_permanently— Permanently delete a post together with its translations, reviews, and cross-posts. This cannot be undone — preferarchive_postunless the post really must be gone. Requires the Editor role.blogId,postId.
Lifecycle
publish_post— Manually publish a post. The post must be Draft, Scheduled, or InReview.blogId,postId.
unpublish_post— Manually unpublish a post. The post must be Published.blogId,postId.
schedule_post— Schedule a post to be automatically published at a future date/time.blogId,postId,publishAt(UTC date/time).
unarchive_post— Restore an archived post to Draft so it can be edited and republished. The post must be Archived.blogId,postId.
Translations
set_post_translation— Create or update a post's translation in a specific non-default language. The default language is edited throughupdate_post, not this tool.blogId,postId,lang(ISO-639-1 code, e.g.de; must not be the blog's default language),title,slug(unique per blog and language),content.excerpt(optional).
delete_post_translation— Delete a post's translation in a specific non-default language.blogId,postId,lang.
Media
upload_image— Upload an image to a blog's media library and return its metadata, including itsurl.blogId,fileName(with extension, e.g.cover.jpg),base64Content(base64-encoded image bytes).folderPath(optional) — a virtual folder inside the blog's media library.- Accepts
jpg,jpeg,png,gif,webp, andsvg; the decoded image must be 10 MB or smaller. - The returned
urlis a relative/media/blob/...path — the platform's native form for post images. Pass it as-is intocreate_post/update_post'scoverImageUrl,thumbnailImageUrl, orshareImageUrl, or use it inline in a post's content; the platform resolves it wherever the post is rendered.
Analytics
get_blog_insights— Get a blog's analytics dashboard: KPIs, daily traffic, top posts, geo distribution, referrers, and device breakdown.blogId,days(optional, default30, max365).
get_post_stats— Get analytics for a single post: views, unique visitors, comments, traffic, referrers, devices, and geo distribution.blogId,postId.