Postking blog
Teach any AI agent to run your content marketing. Open-source skill for PostKing - generate posts, plan content weeks, ship blog articles, build landing pages - installable in Hermes, Claude, and Codex.
npx -y skills add bitsandtea/postking-skills --skill postking-blogAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Create blog publications and generate, iterate on, and publish blog articles on PostKing — PostKing-hosted or pushed to connected external platforms like WordPress, Medium, or Substack — and check generation/publish status.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.4 KB, as published. Nobody here has run it
PostKing Blog
Handles the blog lifecycle on PostKing: publications (the containers articles live under), AI article generation, review/editing, and publishing — either to the PostKing-hosted blog or out to connected external platforms. Requires an active brand — use the postking skill's brand-pick flow first if one isn't set.
When to Use
Use this skill when the user wants to create or manage a blog publication; generate, review, edit, or rewrite a blog article; publish an article (hosted or external); check on an in-progress generation; or manage blog authors/categories.
When NOT to Use
- Social posts, content weeks, or repurposing to social →
postking-social. - Landing pages or side pages →
postking-landing-pages. - The SEO/GEO keyword-to-roadmap pipeline (seeds → keywords → clusters → briefs) that eventually produces briefs for articles →
postking-seo. This skill covers direct/manual blog generation and publishing, not that pipeline's brief-to-article automation. - Saved voice profile management or a standalone de-slop pass →
postking-brand-voice. - No active brand yet →
postking-getting-started.
Minimal tool subset
list_publications,create_publication,update_publication,list_blogs— publications.generate_blog_post,get_blog_status,get_job— async generation + polling.get_blog_article,update_blog_article,rewrite_text— review and iterate.publish_blog_article,list_publishing_connections,schedule_blog_article— publishing.list_blog_authors,create_blog_author,list_blog_categories,create_blog_category— metadata.import_blog_articles,delete_blog_article— housekeeping.
Procedure
Set up a publication
list_publications({ brandId? })(orlist_blogs, which also returns astatusBreakdownof existing articles) — find an existing publication.create_publication({ title, description?, layout?, brandId? })if none exists — returns apublicationId.
Generate a blog article
generate_blog_post({ publicationId, topic, voiceProfileId?, targetLength?, primaryKeywords?, secondaryKeywords?, brandId? })— note the param names:primaryKeywords/secondaryKeywords, notkeywords;targetLength(short/medium/long), notlength. Async; returnsarticleId+operationId.- Poll
get_blog_status({ articleId }), orget_job({ pollUrl: operationId, brandId, wait: true }), until status iscompleted(orfailed). get_blog_article({ articleId })— review the draft (full content, SEO fields,previewUrl,editUrl).
Review and iterate
update_blog_article({ articleId, title?, content?, excerpt?, status?, metaTitle?, metaDescription?, authorId?, categoryId? })for direct edits — only the fields you pass are changed.rewrite_text({ text, voice?, platform: "blog" })to polish a specific passage, then paste the result back in viaupdate_blog_article.- Re-run
generate_blog_postwith a refinedtopic/primaryKeywordsfor a fresh pass instead of patching piecemeal changes.
Publish
- PostKing-hosted:
update_blog_article({ articleId, status: "published" })makes it live on the brand's PostKing blog immediately. - Scheduled hosted publish:
schedule_blog_article({ articleId, scheduledAt })— future ISO 8601 datetime; auto-publishes (and auto-pushes to anyautoPublish-flagged external connections) when the time arrives. - External (WordPress / Medium / Substack, connected via the dashboard):
list_publishing_connections({ publicationId })to find connection IDs, thenpublish_blog_article({ articleId, connectionIds: [...] }). get_blog_status({ articleId })— confirm the final status and get the live URL(s).
CLI fast path
| Goal | Command |
|---|---|
| List publications / articles | pking blogs list [--status draft|published] / pking publications list |
| Create a publication | pking publications create --title "..." [--description "..."] |
| Generate a blog | pking blogs generate --publication <id> --topic "..." [--keywords "kw1,kw2"] [--voice <id>] [--length short|medium|long] --wait |
| Check generation status | pking blogs status <articleId> |
| View an article | pking blogs view <articleId> |
| Publish (hosted, or external via connections) | pking blogs publish <articleId> [--connections <id1,id2>] |
| Delete | pking blogs delete <articleId> |
For the full command catalog, use the postking skill's references/commands.md, or run pking blogs --help / pking publications --help.
Pitfalls
generate_blog_postparam names:primaryKeywords/secondaryKeywordsandtargetLength, notkeywords/length. Passing the wrong names silently drops them (extra zod fields are ignored, not errored).- Hosted publish vs. external publish are different tools.
publish_blog_articlerequires a non-emptyconnectionIdsarray — it's for pushing to external platforms, not for making the PostKing-hosted copy live. Useupdate_blog_article({ status: "published" })for that. - No
pking blogs auto-assign-ctaCLI command exists. If the user wants a CTA auto-assigned to a piece of content, that capability is the MCP toolseo_auto_assign_cta(owned by thepostking-seoskill's surface) — don't invent a CLI equivalent. - Generation is async and can take a couple of minutes. Poll
get_blog_statusorget_jobrather than assuming failure early;get_jobsupportswait: trueto block instead of polling manually. update_blog_articleis a partial update. Omitted fields are left unchanged — no need to resend the whole article to change one field.
Verification
get_credits({ detail: "short" })— confirms auth and balance.list_publications({})— returns at least one publication once set up (or an empty list if none created yet, which is expected pre-setup).