PostKing MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| POSTKING_API_URL | No | Override the API base URL | https://try.postking.app |
| POSTKING_API_TOKEN | No | Skip device login by providing a token directly |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| login_startA | Start the PostKing login flow. Returns a URL and short code for the user to visit in their browser. IMPORTANT: Immediately after this tool returns, show the URL + code to the user and then call |
| login_completeA | Wait for the user to approve the PostKing login code in their browser and then save the token. Polls automatically; call this immediately after |
| logoutA | Clear locally stored PostKing credentials. |
| whoamiA | Return the profile of the currently authenticated PostKing user (email, plan, credit balance, token source). |
| list_brandsA | List all brands on your PostKing account. Returns id+name+website by default (short). Use detail='medium' for description, 'full' for all raw fields. To zoom into one brand call get_brand_info with detail='full'. |
| set_active_brandA | Set the active brand for this session. All subsequent tools will use this brand by default. |
| get_brand_infoA | Get a brand's profile. Returns core identity fields plus slim summaries: themes as [{id,title}], voiceProfiles as [{id,name,isActive,optimizedMedium}], blogAuthors as [{id,firstName,lastName}], and postCount/memberCount as numbers. Use list_themes, list_voices, list_blog_authors, list_posts, or get_brand_members for full detail on each. |
| create_brandA | 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 |
| onboard_brandA | STEP 1 of brand onboarding (website path). Crawls the site in the background and kicks off audience analysis + 10 themes. Sets the new brand as active and RETURNS a |
| set_brand_mediumsA | STEP 2 of brand onboarding. Saves the list of platforms the brand publishes on. Call this immediately after |
| get_brand_mediumsA | Read which publishing platforms (mediums) a brand posts to. Read-only counterpart to set_brand_mediums. NOTE: Reddit is NOT a medium — Reddit is a separate repurpose module; use the reddit_* tools or dashboard_link section 'reddit'. |
| get_brand_membersA | List all active members of a brand with their role and user info (id, name, email). |
| get_onboarding_statusA | STEP 3 of brand onboarding. Polls background analysis + theme generation. detail='short' returns status only; detail='medium' (default) adds audienceSummary+themeCount; detail='full' returns raw data. Poll every ~15s. When done, surface the audience review + themes to the user. |
| list_themesA | List all content themes for the active brand with their IDs. detail='short' (default) returns id+title; detail='medium' adds content preview; detail='full' returns raw content. |
| edit_themeA | Edit an existing content theme's title or content instructions. |
| delete_themeA | Delete a content theme from the active brand. |
| generate_themesA | Generate new content themes using AI. Waits a short grace window for generation to finish; if it's still running server-side after that, returns a 'generating' status instead of blocking — call list_themes a few seconds later to retrieve the new themes. Deducts credits. |
| get_social_media_rulesA | Read a brand's per-platform social media content rules (the same rules editable in dashboard Settings → Social media rules). Covers content/structure/engagement/visual-strategy guidance plus secrets, guidelines, content types, things to avoid, and core principles. Call this BEFORE set_social_media_rules so you only change the fields you intend to. |
| set_social_media_rulesA | Update a brand's social media content rules for ONE platform. By default this MERGES your provided fields into the existing rules (send only what you want to change — other fields are preserved; arrays you provide replace the old array). Set replace=true to overwrite the entire platform ruleset. Valid platforms: linkedin, x/twitter, facebook, instagram, threads, general. Tip: call get_social_media_rules first to see current values. |
| generate_postA | Generate AI content for a platform. Returns quickly with a postId and a 'generating' or 'completed' status — it does NOT block until generation fully finishes. Deducts 10 credits per variation. To control what the post is about, pass |
| generate_bulk_postsB | Generate and schedule multiple posts across a date range in the background. |
| create_postA | 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. |
| list_postsA | List recent posts and drafts. Filter by status or platform. Use status='created' to find unscheduled drafts. Returns id+status+scheduledAt by default; use detail='medium' or 'full' for more fields. For a single post use get_post. |
| get_postA | View the full content and status of a single post. Use detail='short'|'medium'|'full' to control verbosity (default full). Multi-variation posts expose a |
| approve_postA | 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'. |
| reschedule_postB | Move a scheduled post to a new time. Pass a future ISO 8601 UTC datetime. |
| schedule_postA | Schedule a draft or approved post for a specific time. Equivalent to approve_post but named to match 'pking posts schedule'. Pass a future ISO 8601 UTC datetime. After scheduling the post status becomes 'scheduled'. |
| cancel_postA | Cancel a scheduled or approved post, reverting it to draft status without deleting it. Use delete_post to remove it entirely. |
| delete_postA | Cancel and delete a post regardless of its current status (draft, scheduled, or posted). |
| get_calendarA | View upcoming scheduled posts sorted by date. Returns id+status+scheduledAt by default; use detail='medium' or 'full' for more fields. For a single post use get_post. |
| repurpose_contentA | Turn a URL, text, blog post, or existing PostKing post into new content for social media or blogs. IMPORTANT: When the source is a URL, pass it directly to this tool via sourceUrl — do NOT fetch or crawl the URL yourself first. PostKing handles all crawling internally. Source types: url | text | blog | social_post. Target types: social (LinkedIn, X, etc.) | blog | text. Supports detail param: short=ids only, medium=key fields (default), full=raw response. |
| generate_textA | Generate or rewrite general-purpose, email-style/formal text — follow-up emails, cover letters, outreach messages, formal notes, etc. Returns quickly with an operationId and a 'still_generating' or 'completed' status — it does NOT block until generation fully finishes. This is NOT for social media posts — use generate_post for those. This is also NOT for a simple voice-only rewrite of existing text with no other options — for that, use rewrite_with_voice or rewrite_text instead. Reach for generate_text when you need mode selection (generate vs rewrite), a stated purpose, a target length, or when there's no source text at all (mode='generate'). mode='generate' writes new text from a |
| list_voicesA | List all available voice profiles with their IDs. Lists default short; pass detail=medium/full for more fields. |
| rewrite_with_voiceC | Rewrite text using a specific voice profile. |
| rewrite_textB | Rewrite text using a voice profile or general writing rules. |
| humanize_textC | Apply LLM rewrite and BERT replacements to reduce AI detection signals in text. |
| check_ai_contentA | Check whether text is likely AI-generated. Returns a score and analysis. |
| check_social_accountsA | 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. |
| generate_connect_linkA | Generate a secure browser link to connect a social media account. Share this URL with the user to complete OAuth. |
| disconnect_social_accountB | Disconnect a social account by its account ID. |
| list_domainsA | List all custom domains for the active brand. Lists default short; pass detail=medium/full for more fields including SSL status, verification, and connected blogs or landing pages. |
| add_domainA | Add a new custom domain to the active brand. After adding, call verify_domain to check DNS and activate it. |
| verify_domainA | Check DNS verification for a domain. Returns whether it's pointing to PostKing servers and what A record is needed if not. |
| delete_domainA | Remove a custom domain. Connected blogs and landing pages are unlinked but not deleted. |
| connect_domain_to_publicationA | Connect a verified domain to a blog publication so articles are served from that domain. Supports three routingType modes: 'path' ({domain}/blog), 'root' (bare {domain}), and 'subdomain' (blog.{domain} — provisions a separate Domain row that needs its own DNS verification before it resolves). |
| get_creditsA | Check your current PostKing credit balance and free-tier status. |
| healthA | Check PostKing API health and local auth state. No authentication required — safe to call first thing in a session to see whether you're logged in and what to do next. |
| list_blogsA | LIST tool. Even detail='full' OMITS article bodies (kept bounded) — to read an article's content, call get_blog_article. The number of rows is controlled by |
| create_publicationA | Create a new blog publication (the container that articles live under). Returns a publicationId needed for generate_blog_post. |
| update_publicationA | Update an existing blog publication's metadata — title, description, domain/routing config, or layout. Only the fields you pass are changed (partial update). Distinct from create_publication (which creates a new one). publicationId comes from list_publications or list_blogs. |
| delete_publicationA | Permanently delete a blog publication. Only allowed when it has zero articles and no connected domain/external sync/publishing connections — otherwise the API refuses with an explanation of what's still attached (remove/disconnect those first, e.g. delete_blog_article for every article under it). |
| generate_blog_postA | Generate a full AI blog article. Requires a publicationId (from list_blogs or create_publication). Pass a voiceProfileId to write in a specific person's style (IDs from list_voices). Returns an articleId + operationId; generation is async — poll get_blog_status until completed, then get_blog_article. Use update_blog_article to edit, or publish_blog_article to push to external platforms. To make it live on your PostKing blog, call update_blog_article with status: 'published'. |
| get_blog_articleA | Fetch a blog article by ID. detail='short' returns id/title/slug/status; detail='medium' adds excerpt+wordCount+previewUrl+editUrl; detail='full' (default) returns the COMPLETE content plus previewUrl (GUI preview link) and editUrl (dashboard editor link). Pass maxContentChars only if you need to bound the body size; omit it to get the whole article. |
| update_blog_articleA | Edit a blog article — title, content, excerpt, SEO fields, status, author, category, featured/header image, or CTA. Set status='published' to make it live on your PostKing blog. CTA (call-to-action) is structured data, NOT part of the article body — never write CTA markup into |
| schedule_blog_articleA | Schedule an existing blog article to auto-publish at a future date/time. scheduledAt must be a future ISO 8601 datetime. When the time arrives, the article publishes to the PostKing blog and auto-pushes to any connected external platforms flagged autoPublish. To publish immediately instead, use update_blog_article with status='published'. |
| delete_blog_articleA | Permanently delete a blog article. |
| list_blog_authorsA | List all blog authors for the active brand. Returns id+name by default (short); use detail='medium' for email/social links. Author IDs can be passed to generate_blog_post or update_blog_article. |
| list_blog_categoriesA | List all categories for a blog publication. Returns id+name+slug by default (short); use detail='medium' for description+articleCount. |
| create_blog_categoryB | Create a new category in a blog publication. |
| list_publishing_connectionsA | List external publishing connections for a blog publication (WordPress, Medium, Substack, etc.). |
| publish_blog_articleA | Push a blog article to connected external platforms (WordPress, Medium, Substack, etc.). Get connection IDs from list_publishing_connections. |
| import_blog_articlesA | Import articles from an external blog, RSS feed, or Blogger URL into a PostKing publication as drafts. Returns id+title+slug by default (short); use detail='medium' for wordCount. Inspect individual articles with get_blog_article. |
| get_blog_statusA | Poll the async generation status of a blog article. Use the articleId returned by generate_blog_post. Status: pending | running | completed | failed. |
| create_blog_authorA | Create a new author for blog articles. Returns an authorId that can be used in generate_blog_post and update_blog_article. |
| list_publicationsA | List all blog publications (the containers that blog articles live under). detail='short' returns id+name; detail='full' returns raw rows. Distinct from list_publishing_connections which lists external platforms like WordPress. |
| get_seo_roadmapA | View the SEO / GEO content roadmap — suggested blog topics, keywords, and completion status. detail='short' returns stats only; detail='medium' adds slim item list (id+title+status+keyword); detail='full' (default) returns raw response. |
| seo_add_seedsA | Step 1 of the SEO / GEO flow. Add 3–10 seed keywords that describe what the brand wants to rank for. After this, call seo_generate_keywords to expand them into the full keyword universe. |
| seo_generate_keywordsA | Step 2 of the SEO / GEO flow. Async — expands seed keywords into the full keyword universe. Typically takes ~1–3 min. Uses credits. Returns |
| seo_list_keywordsA | List generated keywords for the brand. Useful for auditing between steps. Returns short detail by default: {id, keyword, intent} per keyword. Use detail="medium" for the full compact summary (priority, searchVolume, difficulty, relevance, clusterId, excludedFromClustering, userTags) or detail="full" for raw keyword objects. Supports server-side filtering: source, intent, clusterId, q (substring search), hasTag, volumeMin/volumeMax, kdMin/kdMax, relevanceMin/relevanceMax, priorityMin/priorityMax, includeDeleted, excludedFromClustering. hasTag filters on userTags (OR match) — use it to find geo-tagged keywords after seo_tag_geography, e.g. hasTag="geo:us-mn" or hasTag="geo:us-mn,geo:us-tx" for multiple regions. Use cursor (from a previous call's response) to page through results beyond limit. |
| seo_edit_keywordA | Edit a single SeoScoredKeyword. Housekeeping op — not part of the main flow. At least one of |
| seo_delete_keywordA | Soft-delete a single SeoScoredKeyword (sets deletedAt; the row stays in the DB but is filtered out of all queries). Housekeeping op — not part of the main flow. Pass |
| seo_bulk_delete_keywordsA | Soft-delete N SeoScoredKeyword rows in one call (sets deletedAt; rows stay in the DB but are filtered out of all queries). Housekeeping op — not part of the main flow. Pass |
| seo_restore_keywordA | Undo a soft-delete: clears deletedAt on the given SeoScoredKeyword ids so they reappear in seo_list_keywords / seo_list_keyword_ids. Housekeeping op — not part of the main flow. Use after seo_delete_keyword or seo_bulk_delete_keywords removed something that shouldn't have been removed. IDs that are not currently soft-deleted are silently no-ops (the response's |
| seo_bulk_edit_keywordsA | Edit userTags, intent, priority, and/or excludedFromClustering across N SeoScoredKeyword rows in one call — the same values are applied to every id in |
| seo_list_keyword_idsA | Return just the ids of every SeoScoredKeyword matching a filter — unpaginated, no keyword data attached. Housekeeping op — not part of the main flow. Accepts the same filter set as seo_list_keywords: source, intent, clusterId, q, hasTag, volumeMin/volumeMax, kdMin/kdMax, relevanceMin/relevanceMax, priorityMin/priorityMax, includeDeleted, excludedFromClustering. Use to select "all keywords matching filter X" in one call, then feed the returned ids into seo_bulk_delete_keywords or seo_bulk_edit_keywords. Example: filter relevanceMax=0.2 to find low-relevance keywords, then bulk-delete or bulk-edit them. Or hasTag="geo:us-mn" to select every Minnesota-tagged keyword after seo_tag_geography. |
| seo_tag_geographyA | Geo pivot Stage 1. Async — classifies every keyword's geographic intent and writes a |
| seo_categorizeA | Step 3 of the SEO / GEO flow. Tag keywords by search intent and/or user tags. Pass |
| seo_generate_clustersA | Step 4 of the SEO / GEO flow — async cluster-generation step. Groups related keywords into topic clusters that become candidate pillar topics. Typically takes ~1–2 min. Returns |
| seo_create_clusterA | Create a real, named SEO cluster by hand — bypasses the auto-clustering pipeline entirely (no LLM call). The cluster starts empty; use seo_create_custom_brief with the returned |
| seo_edit_clusterA | Edit a cluster's name, pillarKeyword, description, keywordsMeta, contentMix, and/or briefAssignments. Housekeeping op — not part of the main flow. At least one field must be supplied. MEMBERSHIP: there is no separate add/remove-member endpoint. Cluster membership is entirely controlled by |
| seo_merge_clustersA | Merge one cluster into another: reassigns the source cluster's keywords, roadmap items (and their briefs, which follow transitively), and any linked blog articles to the target cluster, then deletes the source cluster. Not undoable. Housekeeping op — not part of the main flow. Use when seo_list_clusters or a rescan report shows near-duplicate clusters that should be consolidated. The target cluster's own name/description/keywordsMeta/contentMix are NOT changed by the merge — only the FK relations (keyword.clusterId, roadmap.clusterId, blogArticle.clusterId) move over. Use seo_edit_cluster afterward if the target's keywordsMeta needs updating to include the newly reassigned keywords. |
| seo_delete_clusterA | Hard-delete a cluster. This CASCADES: every SeoRoadmap item under this cluster is deleted, along with its brief. Blog articles and keywords that pointed at this cluster are NOT deleted but have their cluster link cleared. This is NOT UNDOABLE — there is no soft-delete for clusters (unlike keywords). Housekeeping op — not part of the main flow. Pass |
| seo_list_clustersA | Step 5. List clusters so the agent can pick one (or several) to approve before brief and roadmap generation. Returns short detail by default: {id, name, status} per cluster. Use detail="medium" for the full compact summary (pillarKeyword, briefGenerationStatus, briefCount, keywordCount, topKeywords, firstBriefId, description, productFit, relevanceScore) or detail="full" for raw cluster objects. Full keyword detail (keywordsMeta, contentMix, briefAssignments) is intentionally omitted at short/medium to keep context small — use cluster IDs with approve/reject tools directly. Supports server-side filtering: status (CSV of pending_review/approved/rejected), productFit (core/adjacent/out_of_scope), archetype (competitor), origin (CSV of pipeline/manual), q (text search over name/description/pillarKeyword). |
| seo_bulk_approve_clustersA | Step 5b — bulk-approve N clusters in one call. Recommended path when an agent wants to move multiple clusters forward. Approving a cluster fires an async seo_brief_generate Operation per cluster; brief generation only runs on approved clusters. Typically takes ~2–5 min per cluster. Response includes |
| seo_approve_clusterA | Approve a single cluster. Gates brief generation — only approved clusters get briefs drafted. Position in flow: after seo_generate_clusters + seo_list_clusters, before seo_generate_roadmap / brief review. Typically takes ~2–5 min per cluster. Returns |
| seo_reject_clusterA | Reject a single cluster — marks it rejected and detaches its scored keywords. Use when a generated cluster isn't relevant. |
| seo_bulk_reject_clustersA | Bulk-reject N clusters in one call. Symmetric to seo_bulk_approve_clusters. |
| seo_unapprove_clusterA | Revert an approved cluster back to pending_review. Fails if briefs have already been generated for this cluster (cannot be reverted once briefs exist). |
| seo_restore_clusterA | Restore a rejected cluster back to pending_review so it can be approved again. |
| seo_generate_roadmapA | Step 6. Turn one or more clusters into a prioritized content roadmap of blog articles to write. Pass |
| seo_list_roadmapA | List roadmap items (blog topics queued for writing). Returns short detail by default: {id, title, status} per item. Use detail="medium" for the compact summary (priority, primaryKeywords, clusterId) or detail="full" for raw objects. Call seo_roadmap_get with detail="full" for a single item's complete detail. |
| seo_roadmap_getA | View a single roadmap item by ID. Returns full detail by default (raw object). Use detail="medium" for {id, title, status, primaryKeywords, clusterId} or detail="short" for {id, title, status}. |
| seo_roadmap_editA | Edit a roadmap item — update its title, status (suggested|in_progress|completed|ignored), or priority. |
| seo_roadmap_deleteA | Permanently delete a roadmap item. Pass confirm: true to proceed — this is irreversible. |
| seo_roadmap_statsB | Progress stats for the content roadmap (completed, in-progress, suggested counts). |
| seo_list_briefsA | Returns ALL briefs across EVERY status by default — do NOT add a status filter unless the user explicitly asks. |
| seo_get_briefA | Fetch a single SeoBrief by id, including its briefData outline, status, roadmap item, and cluster. Returns full detail by default (complete brief incl briefData). Use detail="medium" for {id, type, status, title, clusterName, briefSummary, sidePageUrl} or detail="short" for {id, type, status}. Use to inspect a brief before refining it with seo_edit_brief or approving it with seo_approve_briefs. |
| seo_create_custom_briefA | Create a single custom SEO brief on demand — the MCP entry point for the 'generate-one' custom-brief flow (previously only reachable via raw agent-v1 REST). Pass |
| seo_edit_briefA | Edit an SeoBrief before approval. The inner route does NOT accept free-text 'instructions' — refinement is structured. Pass |
| seo_approve_briefsA | Approves one or more SeoBriefs and AUTO-fires L4 article/comparison generation immediately — do NOT call seo_write_article after this. Typically takes ~3–8 min per article. After approval, poll each returned operationId with get_job until state is |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| getting_started | Step-by-step guide for first-time PostKing setup |
| connect_social_accounts | Guide for connecting or checking social media accounts |
| repurpose_and_schedule | Turn a URL or text into scheduled social posts |
| manage_posts | View, reschedule, or delete scheduled and draft posts |
| manage_themes | View, edit, or generate content themes for your brand |
| blog_publishing | Generate, edit, and publish blog posts to WordPress, Medium, Substack and more |
| use_voice_profiles | Apply a voice profile to rewrite or generate content in a specific style |
| seo_end_to_end | Run SEO / GEO from seed keywords to published articles using PostKing's agentic SEO / GEO pipeline |
| content_week_planner | Plan and approve a full week of social posts using smart-week + batch generation |
| blog_publishing_pipeline | Generate a blog article, iterate via MCP resources, then publish to internal or external platforms |
| landing_page_builder | Generate a landing page, iterate with AI edits, connect a domain, then publish |
| reddit_repurpose | Repurpose brand content into Reddit-native posts: pool subreddits → suggest subreddits for content → rewrite → review |
| plan_storyline_campaign | Plan and execute a full marketing storyline: clarify → brief → strategy → curate → execute |
| competitor_intelligence | Build a competitive intelligence picture: probe → add → analyze → comparison → overview |
| manage_knowledge_base | Browse, create, update, and delete brand knowledge base items |
| trends_to_post | Browse trending posts, extract or pick a content template, then generate a post |
| repurpose_and_schedule_v2 | Updated repurpose flow for /api/agent/v1/* endpoints with per-platform voice profiles |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bitsandtea/postking-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server