Publish blogs that build authority and traffic. Generate, refine, and ship articles PostKing-hosted or pushed to WordPress, Medium, or Substack. Delivers a steady stream of SEO-ready articles without the writer's block.
Documents
blogizi
Try itDraft, update, and publish SEO blog posts to Blogizi from a local repo using the Blogizi CLI (preferred), hosted MCP as a sandbox backup, or the public API. Use when the user mentions Blogizi, blogizi draft/update/publish, MCP tools, posting markdown to a blog, SEO blog posts, or integrating with th
What it does
Draft, update, and publish SEO blog posts to Blogizi from a local repo using the Blogizi CLI (preferred), hosted MCP as a sandbox backup, or the public API. Use when the user mentions Blogizi, blogizi draft/update/publish, MCP tools, posting markdown to a blog, SEO blog posts, or integrating with the Blogizi public API / Obsidian plugin workflow.
The skill document
Blogizi CLI — AI Agent Guide
Help the human ship blog posts to Blogizi from their local repository. You (the coding agent) write the markdown in plain text; the CLI only authenticates and drafts/updates/publishes. Full human docs: README.md. Site overview: https://blogizi.com/llms.txt
Transport preference: CLI first → hosted MCP if the CLI cannot run (sandbox / no shell / no Node) → raw HTTP API only if neither is available.
Hard rules
- Never ask the user to paste an API key into chat. Tell them to run
blogizi authlocally (or edit~/.blogizi/config.jsonthemselves). For MCP, tell them to put the key in their MCP client config — never in the chat. - Never commit
~/.blogizi/config.json, API keys, or.envsecrets. - Default to drafts. Use
blogizi draft(or MCPdraft_post) for the first push unless the user explicitly asks to go live (blogizi publish/ MCPpublish_post). - Use
blogizi update(or MCPupdate_post) to re-push edits to an existing slug. Do not invent a new slug just to avoid conflicts. - Do not invent Blogizi dashboard UI steps beyond Account → API and project Settings. Prefer CLI + README (or MCP docs when using tools).
- Do not shell out to
claude/codex/geminivia Blogizi. Write the content yourself (or with the user), then draft/update via CLI or MCP.
Prerequisites checklist
Before drafting or publishing, verify (run commands; don't assume):
node -v # need >= 20
which blogizi || npm install -g blogizi
blogizi --help
test -f ~/.blogizi/config.json || echo "NOT AUTHENTICATED"
If not authenticated:
Ask the user to:
1. Open https://blogizi.com → Dashboard → Account → API
2. Copy the account API key
3. Run locally: blogizi auth
4. If they have multiple projects: blogizi use
If blogizi cannot be installed or run (sandbox, locked-down shell, no Node): skip the CLI checklist and use hosted MCP instead (see below). Do not fall back to inventing dashboard-only steps.
Core workflows
A. Write → draft → edit → update → publish (recommended)
# 1. You write ./posts/.md with Blogizi frontmatter (grounded in the repo)
# 2. Upload as draft
blogizi draft ./posts/.md
# 3. Improve the file with the user, then update the same slug
blogizi update ./posts/.md
# 4. Only when the user confirms "publish" / "make it live"
blogizi publish ./posts/.md
B. Multi-project accounts
blogizi use the-correct-project-slug
# or
blogizi auth --project the-correct-project-slug
Wrong project is a common failure mode — confirm slug when the user has more than one blog.
Frontmatter pattern (required for draft/update/publish)
---
title: "How we built our auth flow"
description: "≤160 char meta description; specific, not clickbait"
keyword: "indie app authentication"
slug: how-we-built-our-auth-flow
status: "draft"
date: "2026-08-07"
readingTime: 0
wordCount: 0
---
Body markdown here. Do not repeat the title as an H1 — the blog UI already shows the title.
Writing tips
- Ground the post in this repo (real APIs, files, decisions). Avoid generic filler.
slug: lowercase kebab-case; stable (changing slug creates a new post unless usingblogizi update/ APIupserton the old slug first).description: one sentence, SEO-useful.keyword: phrase the post should rank for.statusin the file is overridden bydraft(→ draft) andpublish(→ published).updateonly changes status when the file setsstatusexplicitly; otherwise the existing post keeps its visibility.
When the CLI is unavailable (sandbox / no shell)
Prefer the hosted MCP over raw HTTP. Use this path when:
- You cannot install or run
blogizi(restricted sandbox, no network install, no Node) - The client has MCP tools but no reliable shell
- The user already connected Blogizi MCP in Cursor / Claude / etc.
Docs: https://blogizi.com/docs/mcp
MCP connect (user configures once)
Streamable HTTP: https://blogizi.com/api/mcp with Authorization: Bearer .
{
"mcpServers": {
"blogizi": {
"url": "https://blogizi.com/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_ACCOUNT_API_KEY"
}
}
}
}
Stdio-only clients can bridge with mcp-remote (see MCP docs). Same auth rules: user adds the key in client config — not in chat.
MCP tools (map 1:1 to CLI)
| Goal | CLI | MCP tool |
|---|---|---|
| List blogs | (config / blogizi use) | list_projects |
| First push / new slug | blogizi draft | draft_post |
| Re-push same slug | blogizi update | update_post |
| Go live | blogizi publish | publish_post |
Post tools take title, slug, optional description / keyword / content, and projectSlug when the account has more than one project. update_post accepts optional status; omit it to keep draft/published. draft_post fails if the slug exists — use update_post.
With MCP you still write the post body yourself; pass it as content (markdown without frontmatter). You do not need a local .md file if the sandbox has nowhere useful to write one — but prefer a file when the repo is writable so the user can review.
Raw Public API (last resort)
Only if neither CLI nor MCP tools are available (or the user wants integration code). Base: https://blogizi.com
Authorization: Bearer YOUR_ACCOUNT_API_KEY
X-Blogizi-Project: project-slug
Content-Type: application/json
POST /api/posts
{
"title": "…",
"slug": "…",
"description": "…",
"keyword": "…",
"content": "markdown body",
"status": "draft",
"upsert": false,
"projectSlug": "optional-if-header-set"
}
upsert: true→ update existing post with the same slug (Obsidian /blogizi update/ MCPupdate_post).- List projects:
GET /api/account/projects - Prefer CLI → MCP → raw
curlin that order.
Usage examples (copy-ready)
# First-time setup (user runs with their key)
blogizi auth "$BLOGIZI_API_KEY" --project my-app
# After you wrote the markdown
blogizi draft ./content/rate-limiting-with-redis.md
# After edits to the same slug
blogizi update ./content/rate-limiting-with-redis.md
# User said publish
blogizi publish ./content/rate-limiting-with-redis.md
Best practices
- Write from the project root so paths and repo context stay clear.
- One keyword per post — narrow beats vague ("oauth pkce nextauth" > "authentication").
- Review before publish — show the user the file path + title/description; wait for explicit publish.
- Edit then update — after improving the
.md,blogizi updatewith the same slug (do not usedraftagain for an existing slug — create will fail). - Don't spam publish — no automated publish loops without human approval.
- Link related docs when helpful: CLI publishing, markdown frontmatter, Obsidian plugin.
Error handling
| Symptom | Likely cause | Agent action |
|---|---|---|
Not authenticated. Run: blogizi auth … | Missing ~/.blogizi/config.json | Instruct user to auth locally; do not request the key in chat |
Not authenticated / 401 from API | Bad or rotated key | User regenerates key in Account → API, re-runs blogizi auth |
| Error about multiple projects / project required | No projectSlug with multi-project account | blogizi use or auth with --project |
| Upload/publish 4xx duplicate slug | Post slug already exists | Use blogizi update for that slug, or change slug for a new post |
| Wrong blog updated | Wrong active project | Confirm projectSlug in config; blogizi use correct slug |
npm install -g blogizi fails | Node too old / permissions | Need Node 20+; suggest nvm or local npm link from clone |
| Network / fetch failed | Offline or API unreachable | Check connectivity to blogizi.com |
blogizi draft / suggest not found | Confused with old AI draft, or suggest removed | Use blogizi draft to save a draft; write the file yourself first |
blogizi missing / blocked in sandbox | No install or shell exec | Use MCP tools (draft_post / update_post / publish_post); user configures Bearer key in MCP client |
| Need to change a live post | Existing published slug | blogizi update path/to/post.md or MCP update_post (omit status to keep published) |
When a command fails: capture stderr, classify using the table, propose the smallest next step (usually one command for the user to run).
Anti-patterns
- Pasting API keys into prompts, commits, or GitHub issues
- Running
blogizi publishwithout explicit user consent - Calling non-existent
blogizi suggestor inventing AI-provider flags (--ai claude, etc.) - Inventing endpoints that aren't in the README / llms.txt
- Assuming session-cookie dashboard routes work with the API key (PATCH/DELETE post by id are session-only today)
Quick decision tree
User wants a Blogizi post?
├─ Can run blogizi CLI?
│ ├─ Not installed/authed? → install + user runs blogizi auth (+ use)
│ ├─ Need content? → YOU write .md with frontmatter (from repo context)
│ ├─ First push / new slug? → blogizi draft path/to/post.md
│ ├─ Edits to existing slug? → blogizi update path/to/post.md
│ └─ User said go live? → blogizi publish path/to/post.md
├─ Sandbox / no CLI, but MCP Blogizi tools available?
│ ├─ Not connected? → user adds /api/mcp + Bearer key in MCP client config
│ ├─ Need content? → YOU write body (+ title/slug/meta)
│ ├─ First push / new slug? → draft_post
│ ├─ Edits to existing slug? → update_post
│ └─ User said go live? → publish_post
└─ Neither CLI nor MCP? → raw POST /api/posts (same auth); prefer wiring MCP next
Related links
Related skills
Publish to Medium without an API token. Medium closed its API to new integrations in Jan 2025, so this skill uses the one stable path left: it writes your post as Medium-ready HTML, deploys it to your own GitHub Pages, and uses Medium's URL importer to create a draft. Say 'blog about X' and it scaffolds your blog repo on first run, then drafts each post end to end. It always stops at a draft for your review and never auto-publishes. Needs GitHub, Medium, and the gh CLI.
Jekyll blog authoring UI — manage posts, drafts, tags, and publishing workflow for static sites.
Create, schedule, and publish social media posts across Instagram, TikTok, YouTube, X, LinkedIn, Facebook, Pinterest, Threads, and Bluesky via the Social0 CLI (preferred) or MCP. Covers account listing, media upload, drafts, instant publish, scheduling, and per-platform publish status.
Use when creating English SEO blog content for product URL, including Markdown articles, blog-editor HTML fragments, SEO metadata, internal links, and cover images.
Schedule social media posts to 13 platforms (Bluesky, Threads, Instagram, LinkedIn, Mastodon, YouTube, Facebook Pages, Pinterest, Telegram, X/Twitter, Nostr)...