seo-blog-writer

"Turn a single long-tail query into a publish-ready blog post that ranks in search and gets quoted by AI assistants. Runs the full pipeline: classify the topic, research it against real sources, draft clean HTML, scrub LLM-tell vocabulary and typography, audit for AI-SEO (TL;DR block, query-phrased H2s, FAQ section, FAQPage + BreadcrumbList + HowTo JSON-LD), then publish through a platform adapter (Ghost Admin API, WordPress REST, or static-site file output). Platform-agnostic core; swap the publish step without rewriting the writing pipeline. Built for indie hackers, founders, and content marketers who want AI to draft posts that are actually citable - not paraphrased docs, not hallucinated benchmarks. Trigger when the user says: 'write a blog post on X', 'draft an article about X', 'publish a post on X to Ghost / WordPress / the static site', or any request to ship editorial content for a long-tail query."

5 Tools
publishing-skills Plugin
productivity Category

Allowed Tools

WebSearchWebFetchBash(python3:*)ReadWrite

Provided by Plugin

publishing-skills

Four composable skills that turn an AI agent into a platform-agnostic long-tail SEO publishing pipeline — topic research, drafting, SVG figures, and an editorial calendar. Ships Ghost, WordPress, and static-site adapters.

productivity v0.1.0
View Plugin

Installation

This skill is included in the publishing-skills plugin:

/plugin install publishing-skills@claude-code-plugins-plus

Click to copy

Instructions

seo-blog-writer

End-to-end pipeline for shipping a single long-tail blog post: topic -> research -> draft -> scrub -> AI-SEO audit -> publish. Designed for SEO and AI-citation extractability (FAQ blocks, BreadcrumbList + FAQPage + HowTo schema, query-phrased headings).

The writing pipeline is platform-agnostic — it produces a publish-ready bundle (clean HTML, slug, meta, JSON-LD blocks, feature-image alt). The publish step is pluggable: out-of-the-box adapters for Ghost Admin API, WordPress REST, and static-site file output. Adding another CMS (Webflow, Sanity, Strapi, Contentful, Hugo, Astro) is a matter of writing a 20-line POST snippet.

The skill takes one required argument: the topic. Optional flags control the publish target and state.


/seo-blog-writer <topic>
/seo-blog-writer <topic> --target ghost                     # publish via Ghost adapter
/seo-blog-writer <topic> --target wordpress                 # publish via WordPress REST
/seo-blog-writer <topic> --target static --out posts/       # write files into a static-site repo
/seo-blog-writer <topic> --target ghost --publish           # actually publish (default: draft)
/seo-blog-writer <topic> --target ghost --publish-at <ISO>  # schedule for future publish
/seo-blog-writer <topic> --angle "<angle>"                  # narrow the angle

Default state is draft — the post lands in the platform's editor for human review before going live, unless --publish or --publish-at is passed. --publish-at accepts an ISO 8601 UTC timestamp (e.g. 2026-05-10T07:42:00Z) and is mutually exclusive with --publish.

Default --target is static — writes a self-contained HTML file + a metadata.json next to it so you can wire any platform yourself.


Before you start — preflight

The platform-agnostic checks:


# 1. Python available (rasterizer, scrubber, schema builder)
command -v python3

# 2. Working directory writable
mkdir -p tmp/blog-drafts && touch tmp/blog-drafts/.touch && rm tmp/blog-drafts/.touch

3. (Optional) ai-seo MCP — check before continuing

Check whether the current agent session has access to a tool named audit_page from the ai-seo-mcp server (@automatelab/ai-seo-mcp). That MCP provides a programmatic citation-worthiness and schema score that Step 5 uses automatically when available.

  • If the MCP is connected: nothing to do — Step 5 will call audit_page automatically.
  • If the MCP is not connected: ask the user:

> "The ai-seo MCP (@automatelab/ai-seo-mcp) is not connected. Step 5 can run a programmatic citation-worthiness and schema score on your draft in addition to the manual audit. To install it:

> ```

> npx -y @automatelab/ai-seo-mcp

> ```

> then register it in your MCP config. See the ai-seo-mcp README for one-line configs for Claude Code, Cursor, and Cline. Type skip to continue with the manual-only audit."

Wait for the user's response before continuing to Step 0. Any response other than a config/install action counts as skip — proceed without the MCP.

Platform-specific credential checks live in the per-adapter sections at the end of this skill. The writing pipeline (Steps 0-7) runs without any platform credentials — credentials are only needed at Step 8.


Step 0 — Parse and classify the topic

The topic is the one thing the skill cannot invent. It must arrive as an argument.

Shape Example Treatment
Long-tail how-to "how to fix n8n HTTP Request 401 error" Ideal. Format = troubleshooting (template 1).
Integration walk-through "how to connect Airtable to Slack with Zapier" Format = integration (template 2).
Workflow tutorial "automate invoice processing with Make" Format = workflow tutorial (template 3).
Comparison "Zapier vs Make vs n8n" Format = comparison (template 4).
Definition / explainer "what is an AI agent" Format = explainer (template 5).
Use case / outcome "build a daily Slack digest from RSS with n8n" Format = use-case (template 6).
Listicle / roundup "12 best n8n templates for marketing teams" Format = listicle (template 7).
Migration guide "migrate from Zapier to n8n" Format = migration (template 8).
Release recap "what's new in n8n 1.80" Format = release-recap (template 9).
Too vague "AI", "automation" Stop. Ask the user to narrow it. Suggest 2-3 candidate long-tail variants.

If --angle was passed, append it to the topic. The classification picks the structural template used in Step 3.


Step 1 — Research

The piece must be specific. Real version numbers, real error messages, real screenshots — not generic "best practices."

1a. Identify the search intent

What does someone typing this query want? One sentence — the implicit desire behind the words.

  • "how to fix n8n HTTP 401" -> wants the exact change to make in the UI to stop the error
  • "Zapier vs Make" -> wants a quick decision, then a longer breakdown
  • "what is an AI agent" -> wants a one-paragraph explanation, then how it differs from a workflow

If you can't write one sentence describing the intent, the topic is too vague — go back to Step 0.

1b. Seed search and SERP teardown


WebSearch("<topic>")
WebSearch("<topic> <current-year>")  # force a fresh lens

Extract three structured signals from the page-1 results:

  1. Word count distribution — eyeball the top 5 results' length. Target 1.1–1.3x the median, not the longest. If the median is 600 words, don't write 1500 — that's padding.
  2. People Also Ask boxes — Google surfaces 4-8 PAA questions for most queries. These are free FAQ content. Capture verbatim into the FAQ-variant list.
  3. Currently-winning featured snippet — if there is one, note its format (paragraph, list, table). Write the lead paragraph in that exact shape; that's how you challenge for the snippet.

Goal: write something more specific or more current than the existing top results, not a paraphrase.

1c. Deep fetch

Pick 2-4 URLs from the SERP. Prioritize:

  • Vendor docs — primary sources for the tool being discussed.
  • GitHub issues / changelogs — for "fix X error" topics, the actual issue thread is gold.
  • Reddit / community forums — for confirming a workaround actually works in the wild.
  • Existing top-ranked posts — to see the bar you're clearing.

WebFetch(url, "Return the full article body as clean prose. Include code snippets,
error messages, and screenshot references verbatim. Do NOT summarize.")

Skip SEO-farm rewrites and listicles with no specifics.

1d. Five-question gate before drafting

Before writing, you must be able to answer all five.

  1. What is the exact query intent? (one sentence from 1a)
  2. What is the direct answer? (one to two sentences — the lead paragraph in compressed form)
  3. What's the canonical primary source? (vendor doc, GitHub issue, official changelog — at least one URL)
  4. What's the gotcha most existing posts miss? (the specific detail that makes this post worth writing). Hard rule: if the honest answer is "nothing, I'm summarizing the docs," abort and tell the user. A doc paraphrase will rank below the actual docs.
  5. What 3-6 follow-on questions belong in the FAQ? (long-tail variations of the main query, ideally lifted from the PAA boxes captured in 1b)

If any answer is ?, keep researching or ask the user for a specific source.

1e. Save research artifacts


mkdir -p tmp/blog-drafts
# <slug> = kebab-case of the topic, e.g. n8n-http-401-fix

Files (gitignored):

  • tmp/blog-drafts/.research.md — 5-question answers, source list, key quotes
  • tmp/blog-drafts/.interlinks.json — written in Step 1f (outbound interlink targets)
  • tmp/blog-drafts/.draft.html — written in Step 3
  • tmp/blog-drafts/.schema.html — written in Step 7b (JSON-LD