SEO/GEO content engine. Seed, cluster, roadmap, brief, write, and publish — turning keywords into live articles. Delivers a compounding pipeline of organic traffic and AI-citation-friendly content, month over month.
Coding
PostKing · Getting Started
Try itRouter skill for PostKing — confirms the active brand, then hands off to the right specialist skill for posts, blogs, landing pages, SEO, or setup.
What it does
Router skill for PostKing — confirms the active brand, then hands off to the right specialist skill for posts, blogs, landing pages, SEO, or setup.
The skill document
Getting Started
The full zero-to-first-post path: connect, authenticate, fund the balance, onboard a brand from its website, connect socials, and ship a first scheduled post. This is the first skill to run for any new user or freshly-connected agent.
When to Use
Use this as the very first skill for any new user or freshly-connected agent session: checking auth state, funding credits, onboarding the first brand, connecting social accounts, or shipping the first post. Also use it any time you hit UNAUTHORIZED, INSUFFICIENT_CREDITS, or TRIAL_EXPIRED from another skill and need to route back through auth/billing.
When NOT to Use
Not for day-to-day content work once a brand is onboarded and funded — hand off to the postking-social/postking skill for calendar review, posts, blogs, and repurposing. Not for SEO, campaigns, competitor research, Reddit, or voice/quality passes — those are their own skills (postking-seo, postking-storylines, postking-competitor-intel, postking-reddit, postking-brand-voice).
Minimal tool subset
This skill needs 17 tools out of PostKing's 200+, grouped by stage:
Auth
health— no-auth status check; always call this first.login_start,login_complete— stdio device-flow authentication.
Credits & billing
get_credits— check balance and free-tier status.billing_list_packs— list one-off credit packs.billing_topup— buy a pack.billing_wallet— check the unified credit balance.billing_list_tiers— list subscription tiers.billing_subscribe— start a subscription.
Brand onboarding
onboard_brand— crawl a website, analyze audience, generate themes.create_brand— manual brand creation without a website crawl.get_onboarding_status— poll onboarding progress.list_themes— review generated content themes.
Socials
check_social_accounts— see what's connected.generate_connect_link— get an OAuth link for a platform.
First post
generate_post— draft post variations.approve_post— lock in a variation and schedule.
(whoami and logout are also available if you need to confirm identity or sign out, but aren't required for this flow.)
Prerequisites
None — this is the first skill to run when connecting to PostKing.
Pacing rules
This is a multi-stage flow. Obey these rules throughout:
- One stage per turn. Run the current stage, present the result, then stop and wait for the user. Don't chain into the next stage in the same turn, even on success.
- Never reuse remembered values without confirmation. Brand names, website URLs, social handles, theme choices, and post topics must be reconfirmed in the current conversation — don't pull them from prior sessions or long-term memory without surfacing the value and asking the user to confirm it.
- Fail loudly, never silently retry. If a stage fails, stop, surface the error verbatim, and ask the user how to proceed.
- Zero brands means onboarding is required, not optional — never skip ahead to other work without a brand.
Procedure
Step 1 — Check health first
Call health. This requires no authentication and tells you whether you're already logged in and what to do next. Always start here.
- Remote/OAuth transport (client connected to
https://mcp.postking.appvia an OAuth-aware host):healthreports that authentication already happened at the connector. Do not calllogin_start— there's no in-session login step. - Local stdio transport:
healthreports whether a token is stored. If not, continue to Step 2.
Step 2 — Authenticate (stdio only)
Call login_start. It returns a URL and a short code and begins polling on its own — the tool call itself waits for the browser approval step and reports success or timeout; you don't need a separate confirmation turn.
Show the URL and code to the user verbatim (no paraphrasing or redaction) and tell them to open it and approve. Use login_complete only if your client's flow separates "start" from "poll" — most stdio clients handle both in one login_start call.
Step 3 — Check credits
Call get_credits (detail: "short" for just the number, "full" for complete billing context).
- Healthy balance → continue to Step 5 (brand onboarding).
0, or a later operation returnsINSUFFICIENT_CREDITS→ go to Step 4.
Step 4 — Fund the balance
Ask the user once which they prefer: a one-off credit pack (agent-native default, instant off-session charge) or a subscription.
One-off pack:
billing_list_packs— SKUsagent_4/agent_5/agent_25/agent_50= $4/160cr, $5/220cr, $25/1200cr, $50/2600cr. The $5 pack covers a full demo run (a week of posts + SEO pipeline + a landing page). Show the options and let the user pick — don't guess.billing_topup({ packSku: "" }):status: "paid"(common case, card on file) — instant off-session charge; response includes the newbalance. Done immediately, do not poll.checkoutUrlreturned (no card on file) — present the URL, have the user complete Stripe Checkout, then pollbilling_walletevery few seconds (cap ~5 minutes) untilcreditsrises by the expected amount. Hosted Checkout sessions expire after ~30 minutes of inactivity — callbilling_topupagain for a fresh URL if that happens.
Subscription:
billing_list_tiers— GROWTH / PRO / ENTERPRISE. Ask which tier.billing_subscribe({ tier, interval })(interval: "month"or"year") — returns acheckoutUrl. Human-completion is the cleanest path: the user completes Checkout, the webhook provisions the account (grants credits, activates the plan).- Poll
billing_wallet(orget_credits) every few seconds (cap ~5 minutes) until the subscription is active. The agent spends from the same unifiedUser.creditspool either way — there's no separate agent wallet.
Step 5 — Onboard a brand
get_onboarding_status(or check viahealth/prior context) to see whether a brand already exists. If the user has zero brands, onboarding is required — don't proceed to anything else.- If zero brands: ask the user two questions in the current conversation, one at a time if the UI supports it — (1) "What's the name of the brand?", (2) "What's the website URL to analyze?" If a plausible value exists from prior context, surface it as a suggestion only ("Last time you mentioned
acme.com— still right, or different?") and wait for explicit confirmation. Never onboard silently on remembered values. onboard_brand({ websiteUrl, name })— crawls the site, analyzes audience, generates themes. Typically 30–90s.- Or
create_brand({ name, description, tone, audience })for manual setup without a crawl. get_onboarding_status({ brandId })— poll until analysis/theme generation finishes.list_themes({ brandId })— surface the generated themes (titles + one-line gloss each) and ask the user whether to keep, edit, or regenerate. Don't proceed silently.- If the user already has ≥1 brand with none active, don't auto-onboard — ask which existing brand to use, or whether to add a new one.
Deeper brand & theme editing (optional, outside this skill's minimal subset) — get_brand_info for the full audience/positioning reveal, edit_theme/delete_theme/generate_themes for individual theme edits or regeneration. These are covered in the postking skill; use them there once onboarding is complete if the user wants finer control.
Step 6 — Connect socials
check_social_accounts({ brandId })— see what's connected.- Ask the user which platform(s) they want connected before running anything — don't pick a default silently.
generate_connect_link({ brandId, platform })— platforms:linkedin,x,instagram,threads,facebook. Show the URL and ask the user to confirm once they've completed OAuth.
Step 7 — First post
- Confirm with the user which connected platform and which reviewed theme to use — don't pick silently.
generate_post({ brandId, platform, variations: 3 })— show the variations.approve_post({ postId, variation, schedule })— locks it in.- Hand off to the
postkingskill from here for calendar review and everything else day-to-day.
CLI fast path
If a shell is available, the same flow via pking (npm package postking-cli):
pking me # check auth
pking login-start # print URL+code (device flow)
pking login-finish # complete after user approves
pking user credits # check balance
pking billing packs # list one-off packs
pking billing topup --pack # buy a pack
pking billing tiers # list subscription tiers
pking billing subscribe --tier [--interval year]
pking onboard --name "" # crawl + analyze + themes
pking brand create --description "..." --tone "..." --audience "..." # manual
pking brand themes list # review generated themes
pking social check # see connected accounts
pking social connect-platform --platform
pking posts generate --platform --variations 3
pking posts approve --variation --schedule
pking login (unsplit) blocks for up to 15 minutes polling — prefer login-start / login-finish in an agent context to avoid timeouts. For new users without an account yet, pking register-start --email / pking register-finish runs the equivalent magic-link registration flow.
Expected Output
- Confirmed auth state (already-authenticated via transport, or freshly authenticated via device flow).
- A funded balance — instant charge, completed Checkout, or active subscription.
- A populated brand profile (tone, audience, reviewed themes).
- 1+ connected social platform.
- At least one scheduled post.
Pitfalls
INSUFFICIENT_CREDITS(HTTP 402) — balance too low. Run Step 4.RATE_LIMITED— back off using theretryAftervalue in the error envelope before retrying.UNAUTHORIZED— the stored token is invalid or expired. Re-runlogin_start(stdio) or reconnect the connector (remote/OAuth transport).TRIAL_EXPIRED— upgrade via thecheckoutUrlreturned in the error envelope.VALIDATION— invalid email format or a missing required field.NOT_FOUNDon the onboarding/audience status — analysis hasn't finished yet; wait briefly and retry once on the user's say-so, don't loop silently.- Stripe Checkout session expired (~30 min inactivity) — call
billing_topuporbilling_subscribeagain for a freshcheckoutUrl.
Verification
healthshould return successfully and report the current auth state before doing anything else.- After onboarding,
get_onboarding_status({ brandId })should report a terminal (non-running) state. check_social_accounts({ brandId })should reflect the platform just connected.
Next steps
Once authenticated, funded, and onboarded:
postking— day-to-day content: posts, content weeks, repurposing, blogs, landing pages, visuals, trends.postking-seo— SEO / GEO from seed keywords to published articles.postking-storylines— multi-channel marketing campaigns (Storylines).postking-competitor-intel— discover, register, and analyze a brand's competitors.
Related skills
SEO/GEO content engine. Seed, cluster, roadmap, brief, write, and publish — turning keywords into live articles. Delivers a compounding pipeline of organic traffic and AI-citation-friendly content, month over month.
Never run out of things to post. Generate, approve, and schedule across LinkedIn, X, Instagram, Threads, and Facebook, plus a recurring weekly cadence (Smart Week). Delivers a full, on-brand posting calendar without the daily grind.
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.
SEO Optimized Landing Pages. Main landing page and ICP- specific ones. Generate, edit, vibe-edit, and publish landing pages on PostKing, including comparison/side pages and custom domains, for launches and campaigns. Works with the SEO module to bring you 000's of impressions and visits organically!
Work on-brand with Branddock, the brand memory and brand check for AI. Use this skill whenever you create, rewrite or review content for a brand that uses Branddock (social posts, emails, blogs, ads, web copy, scripts) — it makes you fetch the real brand context first, write with it, score every out