io.github.bitsandtea/postking-mcp
NPM · POSTKING-MCP · 2 COMPONENTS · SCANNED SEP 30
PostKing MCP server for managing brands, generating posts, scheduling content, and publishing blogs.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 31 of 94 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 84 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability83
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 32233 tokens (~146/item across 220 items; 220 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 96% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 25 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_theme" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 221 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the io.github.bitsandtea/postking-mcp server?
io.github.bitsandtea/postking-mcp runs locally as an npm package, launched with npx -y postking-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · postking-mcp
claude mcp add bitsandtea-postking-mcp -- npx -y postking-mcp
{
"mcpServers": {
"bitsandtea-postking-mcp": {
"command": "npx",
"args": [
"-y",
"postking-mcp"
]
}
}
} {
"servers": {
"bitsandtea-postking-mcp": {
"command": "npx",
"args": [
"-y",
"postking-mcp"
]
}
}
} codex mcp add bitsandtea-postking-mcp -- npx -y postking-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"bitsandtea-postking-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"postking-mcp"
],
"enabled": true
}
}
} openclaw mcp add bitsandtea-postking-mcp --command npx --arg -y --arg postking-mcp
mcp_servers:
bitsandtea-postking-mcp:
command: "npx"
args: ["-y", "postking-mcp"] {
"McpServers": {
"bitsandtea-postking-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"postking-mcp"
]
}
}
} assistant mcp add bitsandtea-postking-mcp -t stdio -c npx -a -y postking-mcp
{
"mcpServers": {
"bitsandtea-postking-mcp": {
"command": "npx",
"args": [
"-y",
"postking-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 30 Sept 26 +1
- Stability: 0.97 → pass security
- 28 Sept 26 +1
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 25 Sept 26 +15
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 23 Sept 26 −3
- Stability: pass → 0.77 functional
- 22 Sept 26 +1
- Stability: 0.97 → pass security
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 30 Sept 2026 · Analysed npm/postking-mcp@1.1.7
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 94 packages
| Packages resolved | 94 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_domain ~100
Add a new custom domain to the active brand. After adding, call verify_domain to check DNS and activate it.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| domain | string | yes | Domain name, e.g. 'myblog.com' (protocol and www stripped automatically) |
| isPrimary | boolean | – | Set as primary domain for the brand |
| primaryContentType | string | – | What this domain primarily serves |
No output schema declared.
No examples provided.
approve_post ~110
Approve and schedule a draft post. Requires a future datetime. The scheduledAt must be an ISO 8601 UTC datetime, e.g. 2026-03-11T09:00:00Z. After approving, the post status becomes 'scheduled'.
| Name | Type | Req | Description |
|---|---|---|---|
| postId | string | yes | Post ID to approve |
| scheduledAt | string | yes | Future ISO 8601 UTC datetime to post at |
| timezone | string | – | User timezone, e.g. 'America/New_York' |
No output schema declared.
No examples provided.
billing_list_packs ~71
List available credit packs for one-off top-ups. Returns all packs with their SKU, price in USD, and credit amount. Call this tool first to show the user their options, then ask which pack they want. Only after the user explicitly chooses a pack, call billing_topup with that packSku.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
billing_list_tiers ~59
List available PostKing subscription tiers (GROWTH, PRO, ENTERPRISE). Returns each tier's name, price in USD, monthly credits, and billing interval options. Use billing_subscribe to create a subscription Checkout session for a chosen tier.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
billing_subscribe ~113
Create a Stripe Checkout session for a PostKing subscription. Returns { checkoutUrl, sessionId, tier, interval, amountUsd }. Subscription credits refill User.credits each billing period. The subscription Checkout is best completed by a human; the Link virtual card covers the first invoice only (renewals need a durable payment method).
| Name | Type | Req | Description |
|---|---|---|---|
| interval | string | – | Billing interval: "month" (default) or "year". |
| tier | string | yes | Subscription tier. One of: GROWTH, PRO, ENTERPRISE. |
No output schema declared.
No examples provided.
billing_topup ~324
Top up credits by charging the account's card on file (Stripe off-session). Prefers the headless path — no checkout link required. IMPORTANT: Only call this tool after the USER has explicitly chosen a specific pack — it triggers a real charge. To show the user their options first, call billing_list_packs and present the results; do NOT pick a pack on the user's behalf. The response is ONE OF two shapes: (1) Headless success (default when a card is on file): { status: 'paid', paymentIntentId, amountUsd, credits, balance, packSku, cardLast4/receiptUrl when available }. When you receive status === 'paid', the payment has already completed and the credits are in the wallet NOW. Announce to the user: payment ID, last-4 card digits, credits added, and new balance. You are DONE — do NOT call billing_wallet to poll. (2) Checkout fallback (only when there is no card on file): { checkoutUrl, sessionId, amountUsd, credits, packSku }. When you receive checkoutUrl, hand that link to the user so they can complete payment in their browser. Valid skus: agent_4 ($4 / 160 credits), agent_5 ($5 / 220 credits), agent_25 ($25 / 1200 credits), agent_50 ($50 / 2600 credits).
| Name | Type | Req | Description |
|---|---|---|---|
| packSku | string | yes | Credit pack SKU to purchase. One of: agent_4, agent_5, agent_25, agent_50. |
No output schema declared.
No examples provided.
billing_wallet ~93
Fetch the user's credit balance and recent usage entries. Returns { credits, recent } where recent is the last ~10 usage rows. Poll this to confirm a top-up landed ONLY after a billing_topup CHECKOUT result (one that returned a checkoutUrl), until credits rise. Do NOT poll after a status:'paid' headless top-up — those credits are already applied and the new balance is in the topup response.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
brand_truth_create ~192
Capture brand truths from plain natural-language text. Describe facts/observations about the brand in ordinary prose — a sentence or short paragraph (≤8000 chars). Do NOT pre-classify, pre-format, or guess the taxonomy: PostKing's LLM extraction pipeline reads the text and decides which atomic 'brand truths' to persist and which to skip (duplicates, too vague, or previously rejected facts). Returns { addedCount, skippedCount, added, skipped }: 'added' are the truths that were stored; 'skipped' lists each rejected quote with a reason. Review both — the skipped reasons tell you what didn't make it in and why.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| text | string | yes | Free-form natural-language description of facts/observations about the brand (≤8000 chars). Write it as plain prose — the extraction pipeline handles classification. |
No output schema declared.
No examples provided.
brand_truth_delete ~84
Delete a brand truth by ID. This also records rejection memory: the system learns to stop re-suggesting that fact during future extractions. Use it deliberately — deleting a truth teaches PostKing that the fact should not come back.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| id | string | yes | Brand truth entry ID to delete. |
No output schema declared.
No examples provided.
brand_truth_get ~165
Fetch a single brand truth by ID. short {id,name,type,pinned}; medium adds personaScope+tags+summary+timestamps; full = raw (includes full content). Use detail='full' to retrieve the complete content body.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| detail | string | – | Verbosity of returned item(s): "short" = id + primary label + status (cheap list scan); "medium" = key summary fields + counts (a useful glance); "full" = the complete object. Default "full". Lists d… |
| id | string | yes | Brand truth entry ID to retrieve. |
No output schema declared.
No examples provided.
brand_truth_list ~244
List the brand's stored brand truths (atomic facts/observations used to ground generation). short {id,name,type,pinned}; medium adds personaScope+tags+summary+timestamps; full = raw. Filter by type, personaScope, tags (array or comma-separated), or a free-text query.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| detail | string | – | Verbosity of returned item(s): "short" = id + primary label + status (cheap list scan); "medium" = key summary fields + counts (a useful glance); "full" = the complete object. Default "short". Lists… |
| limit | integer | – | Max number of entries to return. |
| personaScope | string | – | Filter by persona scope. |
| query | string | – | Free-text search across truth name/content. |
| tags | – | – | Filter by tags. Accepts an array (['pricing','tone']) or a comma-separated string ('pricing,tone'). |
| type | string | – | Filter by truth type. |
No output schema declared.
No examples provided.
brand_truth_update ~204
Targeted edit of an existing, known brand truth (by ID). This does NOT re-run the LLM extraction pipeline — it writes the provided fields directly. Use it to correct wording (name/description/content), fix the type/personaScope, adjust tags, or pin/unpin. To capture NEW facts from prose, use brand_truth_create instead.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| content | string | – | Updated full content body of the truth. |
| description | string | – | Updated description/summary. |
| id | string | yes | Brand truth entry ID to update. |
| name | string | – | Updated short label/name. |
| personaScope | string | – | Updated persona scope. |
| pinned | boolean | – | Pin (true) or unpin (false) this truth. |
| tags | array | – | Replacement tag list. Pass [] to clear all tags. |
| type | string | – | Reclassify the truth type. |
No output schema declared.
No examples provided.
cancel_post ~44
Cancel a scheduled or approved post, reverting it to draft status without deleting it. Use delete_post to remove it entirely.
| Name | Type | Req | Description |
|---|---|---|---|
| postId | string | yes | Post ID to cancel |
No output schema declared.
No examples provided.
check_ai_content ~49
Check whether text is likely AI-generated. Returns a score and analysis.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| text | string | yes | Text to check |
No output schema declared.
No examples provided.
check_social_accounts ~139
List all connected and disconnected social accounts for the active brand. Lists default short; pass detail=medium/full for more fields. Run before posting to confirm platform availability.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| detail | string | – | Verbosity of returned item(s): "short" = id + primary label + status (cheap list scan); "medium" = key summary fields + counts (a useful glance); "full" = the complete object. Default "short". Lists… |
No output schema declared.
No examples provided.
clear_post_visual ~74
Remove the selected visual from a post for a specific platform. Includes editInVisualEditor: a direct URL to edit the post in the visual editor (when active brand is set).
| Name | Type | Req | Description |
|---|---|---|---|
| platform | string | yes | Platform to clear the visual for, e.g. 'linkedin' |
| postId | string | yes | Post ID |
No output schema declared.
No examples provided.
competitor_add ~98
Async. Batch-add competitor domains (1–20) to the brand. Returns { operationId, status } — poll get_job until state=completed. Each domain triggers crawl + profile analysis. Typically takes ~2–5 min.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| domains | array | yes | One to twenty competitor domains to add (e.g. ['acme.com', 'rival.io']). |
No output schema declared.
No examples provided.
competitor_analyze ~106
Async. Trigger analysis for existing BrandCompetitor rows that are pending or failed. Use competitor_add to create new rows; use this to retry failed ones. Returns { operationId, status } — poll get_job until state=completed. Typically takes ~2–5 min.
| Name | Type | Req | Description |
|---|---|---|---|
| brandCompetitorIds | array | yes | IDs of existing BrandCompetitor rows to (re-)analyze (1–20). |
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_comparison_sources ~56
List the data sources used to build the brand's competitive comparison. Returns raw source records (URLs, snippets, timestamps) — useful for auditing comparison accuracy.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_delete ~61
Soft-delete a tracked competitor from the brand. No credits are refunded. Use competitor_update (empty body) to restore.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| competitorId | string | yes | BrandCompetitor ID to delete. |
No output schema declared.
No examples provided.
competitor_generate_overview ~62
Async. Generate the competitive landscape overview (uses ~20 credits). Returns { operationId, status } — poll get_job until state=completed. Typically takes ~2–5 min.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_get_comparison ~162
Get the brand's head-to-head competitive comparison. short {id,status,generatedAt,competitorCount}; medium adds summary+strengths+weaknesses; full = raw. Returns null when no comparison has been generated yet — use competitor_recompute_comparison to generate.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| detail | string | – | Verbosity of returned item(s): "short" = id + primary label + status (cheap list scan); "medium" = key summary fields + counts (a useful glance); "full" = the complete object. Default "full". Lists d… |
No output schema declared.
No examples provided.
competitor_get_overview ~147
Get the brand's competitive landscape overview. short {id,status,generatedAt}; medium adds summary excerpt; full = raw. Returns null when no overview exists — use competitor_generate_overview to create one.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| detail | string | – | Verbosity of returned item(s): "short" = id + primary label + status (cheap list scan); "medium" = key summary fields + counts (a useful glance); "full" = the complete object. Default "full". Lists d… |
No output schema declared.
No examples provided.
competitor_list ~156
List the brand's tracked competitors. short {id,domain,analysisState}; medium adds source,creditsCharged,lastError,addedAt,lastCrawledAt,cacheSource; full = raw. Also returns a dashboard link to the Competitors tab.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| detail | string | – | Verbosity of returned item(s): "short" = id + primary label + status (cheap list scan); "medium" = key summary fields + counts (a useful glance); "full" = the complete object. Default "short". Lists… |
No output schema declared.
No examples provided.
competitor_probe ~85
Start a competitor discovery probe. PostKing crawls the web to find rival domains automatically. Returns { started: true } when kicked off, or { alreadyRan, status } when a probe result already exists. Poll competitor_probe_status to check readiness, then use competitor_probe_classify to accept/reject candidates.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_probe_classify ~162
Classify a discovered (or manually added) competitor candidate. 'direct' seeds a BrandCompetitor row; 'similar' and 'not_relevant' update the probe JSON only. Call once per domain. Probe must be in completed state first. Returns { candidates } — the updated full candidate list.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| classification | string | yes | 'direct' = head-to-head competitor (adds to tracked list); 'similar' = adjacent market; 'not_relevant' = not a competitor. |
| domain | string | yes | The competitor domain to classify (e.g. 'rival.io'). |
| name | string | – | Optional human-readable name for the competitor (used when adding manually). |
No output schema declared.
No examples provided.
competitor_probe_status ~66
Check the status of the competitor discovery probe. Returns { status, candidates? } — status is one of: pending | running | completed | failed. When completed, candidates contains the discovered domains ready for classification.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_recompute_comparison ~53
Trigger a fresh head-to-head comparison recompute. Use after adding or re-analyzing competitors to get an up-to-date comparison.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_refresh ~64
Async. Refresh all active competitors for the brand (re-crawl + re-profile). Returns { operationId, status } — poll get_job until state=completed. Typically takes ~2–5 min.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
competitor_update ~108
Update a competitor's settings. Currently supports toggling excludeFromSeoPull (removes the domain from keyword-gap pull without deleting it). Send an empty body to restore a soft-deleted competitor.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| competitorId | string | yes | BrandCompetitor ID to update. |
| excludeFromSeoPull | boolean | – | When true, excludes this competitor from the SEO keyword-pull. Omit to restore a soft-deleted row. |
No output schema declared.
No examples provided.
connect_domain_to_publication ~111
Connect a verified domain to a blog publication so articles are served from that domain.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| domainId | string | yes | Domain ID (from list_domains) |
| pathPrefix | string | – | Path prefix if routingType is 'path', e.g. '/blog' |
| publicationId | string | yes | Blog publication ID (from list_blogs) |
| routingType | string | – | How the blog is routed on the domain |
No output schema declared.
No examples provided.
create_api_key ~81
Create a new PostKing API key. The raw token (pk_live_*) is returned ONCE in this response and never shown again. Store it immediately — treat it like a password. Scope: 'write' (default) or 'read'.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | Descriptive name for the key |
| scope | string | – | Permission scope |
No output schema declared.
No examples provided.
create_blog_author ~82
Create a new author for blog articles. Returns an authorId that can be used in generate_blog_post and update_blog_article.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| string | – | Author email address | |
| firstName | string | yes | Author first name |
| lastName | string | yes | Author last name |
No output schema declared.
No examples provided.
create_blog_category ~78
Create a new category in a blog publication.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| description | string | – | – |
| name | string | yes | Category name |
| publicationId | string | yes | Blog publication ID |
| slug | string | yes | URL slug, e.g. 'marketing-tips' |
No output schema declared.
No examples provided.
create_brand ~154
STEP 1 of brand onboarding (manual path — no website crawl). Creates a new brand from user-supplied name/description, sets it as active, then RETURNS a `nextStep` payload telling you to ask the user which platforms they publish on. After the user answers, call `set_brand_mediums` with their picks. Ask the user for a description if they did not provide one — onboarding will fail without it.
| Name | Type | Req | Description |
|---|---|---|---|
| audience | string | – | Target audience description |
| description | string | – | Brand description (required if no website) |
| name | string | yes | Brand name |
| tone | string | – | Writing tone, e.g. 'Bold & Direct' |
| website | string | – | Website URL |
No output schema declared.
No examples provided.
create_comparison_page ~698
Create a comparison / 'X vs Y' / 'best <category>' page for the brand WITHOUT going through the full SEO cluster → brief flow. One call kicks off generation, then this tool polls until the page is built and returns its slug(s) + link. `mode` controls the engine: 'research' crawls the named competitors + live SERP results before writing — slower (can take several minutes) but produces the strongest, best-grounded page; 'simple' skips all crawling and lets the LLM author from what you provide — fast, best when you already have the facts or just want a quick draft. When your inputs are sparse (few/no options, no domains, no seedData), prefer 'research' — it will discover and ground the comparison for you and yield a far stronger page than 'simple'. `seedData` (simple mode): paste your own raw facts/notes/competitor details here and the LLM writes from them instead of crawling — this is how you feed your own data and avoid a crawl. Async — fires the create, then polls the operation up to ~5 min. On success returns { briefId, sidePageId, sidePageSlug, landingPageSlug, webUrl, warnings }. If it is still running after the wait, returns { status: 'still_generating', operationId } — poll get_job with that operationId until state is 'completed'; do NOT fabricate the page yourself. Any `warnings` are surfaced verbatim — relay them to the user (e.g. sparse-input notes such as 'research mode would produce a stronger page').
| Name | Type | Req | Description |
|---|---|---|---|
| allowGenericRoundup | boolean | – | Allow a generic category roundup when no concrete options are supplied. |
| brandId | string | – | Brand ID (defaults to active brand) |
| briefData | – | – | Advanced: a full pre-built structured comparison brief. When supplied, generation uses it directly and skips the LLM authoring step. |
| mode | string | yes | Generation engine. 'research' = crawl the competitors + live SERP, then write (slower, strongest, best for sparse inputs). 'simple' = no crawl, LLM authors from what you pass (fast; pair with seedDat… |
| options | array | – | The things being compared. Omit to let research mode discover them. |
| parentLandingPageSlug | string | – | Slug of the parent landing page to nest this comparison under. Defaults to the brand's primary landing page. |
| pinnedCompetitor | object | – | A specific competitor to anchor a head-to-head comparison around. |
| preset | string | – | Page shape: head_to_head (X vs Y), alternatives_listicle (X vs alternatives), or category_roundup (best <category>). Inferred when omitted. |
| primaryKeyword | string | yes | The topic/keyword the page targets, e.g. "Acme vs alternatives", "best CRM for startups", "Notion vs Obsidian". |
| proposedSlug | string | – | Desired URL slug fragment for the new page (auto-generated from primaryKeyword if omitted). |
| seedData | string | – | Simple-mode only: your own raw data/notes/facts about the options. When set, the LLM writes from this instead of crawling — feed it here to avoid a research crawl. |
| voiceProfileId | string | – | Voice profile ID to write the page in. |
No output schema declared.
No examples provided.
create_post ~168
Save a post draft with custom content to one or more platforms. Supported platforms: x, linkedin, instagram, threads, facebook. After creating, call approve_post with a future ISO 8601 datetime to schedule it. To check which platforms are connected first, call check_social_accounts. Each created post includes editInVisualEditor: a direct URL to edit it in the visual editor.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| content | string | yes | Post content |
| platforms | array | yes | One or more platforms: x | linkedin | instagram | threads | facebook |
| scheduledAt | string | – | ISO 8601 UTC datetime to schedule immediately on save, e.g. 2026-03-11T09:00:00Z |
No output schema declared.
No examples provided.
create_publication ~78
Create a new blog publication (the container that articles live under). Returns a publicationId needed for generate_blog_post.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| description | string | – | – |
| layout | string | – | – |
| title | string | yes | Publication name, e.g. 'My Blog' |
No output schema declared.
No examples provided.
dashboard_link ~111
Return a clickable browser link to a PostKing dashboard page. ALWAYS use this instead of guessing dashboard URLs. The SEO roadmap / content plan is section 'seo_briefs' (or 'seo' for the overview) — there is NO '/seo/roadmap' page.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| section | string | – | Dashboard section to link to. Defaults to 'overview'. SEO roadmap/content plan → 'seo_briefs'. Reddit module → 'reddit'. |
No output schema declared.
No examples provided.
delete_asset ~64
Soft-delete an asset from the brand library. Pass confirm: true to proceed.
| Name | Type | Req | Description |
|---|---|---|---|
| assetId | string | yes | Asset ID to delete |
| brandId | string | – | Brand ID (defaults to active brand) |
| confirm | boolean | yes | Must be true to confirm deletion |
No output schema declared.
No examples provided.
delete_blog_article ~43
Permanently delete a blog article.
| Name | Type | Req | Description |
|---|---|---|---|
| articleId | string | yes | Blog article ID |
| brandId | string | – | Brand ID (uses active brand if omitted) |
No output schema declared.
No examples provided.
delete_domain ~41
Remove a custom domain. Connected blogs and landing pages are unlinked but not deleted.
| Name | Type | Req | Description |
|---|---|---|---|
| domainId | string | yes | Domain ID to delete (from list_domains) |
No output schema declared.
No examples provided.
delete_landing_page ~51
Permanently delete a landing page. Pass confirm: true to proceed — this is irreversible.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be true to confirm deletion |
| slug | string | yes | Landing page slug |
No output schema declared.
No examples provided.
delete_post ~38
Cancel and delete a post regardless of its current status (draft, scheduled, or posted).
| Name | Type | Req | Description |
|---|---|---|---|
| postId | string | yes | Post ID to delete |
No output schema declared.
No examples provided.
delete_side_page ~56
Delete a side page. Pass confirm: true to proceed.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Must be true to confirm deletion |
| sideKey | string | yes | Side page key |
| slug | string | yes | Parent landing page slug |
No output schema declared.
No examples provided.
delete_theme ~45
Delete a content theme from the active brand.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (uses active brand if omitted) |
| themeId | string | yes | Theme ID to delete |
No output schema declared.
No examples provided.
delete_weekly_schedule ~56
Permanently remove the weekly schedule for the active brand. Pass confirm: true to proceed.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| confirm | boolean | yes | Must be true to confirm deletion |
No output schema declared.
No examples provided.
disable_weekly_schedule ~43
Pause the weekly content schedule without deleting it. Re-enable later with enable_weekly_schedule.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
No output schema declared.
No examples provided.
disconnect_social_account ~47
Disconnect a social account by its account ID.
| Name | Type | Req | Description |
|---|---|---|---|
| accountId | string | yes | Social account ID to disconnect |
| brandId | string | – | Brand ID (uses active brand if omitted) |
No output schema declared.
No examples provided.
edit_audience ~257
Async LLM ai-edit of the brand's audience/ICP. Describe the change in `prompt` (natural language). `sections` is REQUIRED — the audience section(s) to edit (e.g. 'demographics', 'painPoints', 'positioning'). If unsure which sections are valid for this brand, call preview_audience_edit first and use the section keys it returns. Returns { operationId, status } — poll get_job(operationId) until state is 'completed' (or 'failed'/'cancelled' on error). Only one audience edit can run at a time; a second call returns an 'already_running' notice. Typically takes ~30–90 s.
| Name | Type | Req | Description |
|---|---|---|---|
| brandId | string | – | Brand ID (defaults to active brand) |
| prompt | string | yes | Natural-language instruction describing the change to make to the audience/ICP. |
| sections | array | yes | REQUIRED. Audience section keys to edit (e.g. ['demographics'], ['painPoints'], ['positioning']). Call preview_audience_edit to discover valid values for this brand. |
| subsections | object | – | Optional map of section → subsection keys to scope the edit more narrowly (e.g. { demographics: ['ageRange'] }). |
No output schema declared.
No examples provided.
What is the io.github.bitsandtea/postking-mcp server?
io.github.bitsandtea/postking-mcp is listed in the public MCP registry as io.github.bitsandtea/postking-mcp. PostKing MCP server for managing brands, generating posts, scheduling content, and publishing blogs. This page covers its npm package (postking-mcp).
Is the io.github.bitsandtea/postking-mcp server safe to use?
io.github.bitsandtea/postking-mcp scores 84 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 30 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.bitsandtea/postking-mcp server expose?
io.github.bitsandtea/postking-mcp exposes 220 tools: login_start, login_complete, logout, whoami, list_brands, and 215 more. Their descriptions and schemas cost roughly 31,224 tokens of context every time the server is loaded.
Is the io.github.bitsandtea/postking-mcp server still maintained?
io.github.bitsandtea/postking-mcp is still listed as active in the MCP registry. We last reached this channel on 30 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.bitsandtea/postking-mcp server under?
io.github.bitsandtea/postking-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.