PlanPost MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLANPOST_API_KEY | Yes | PlanPost API key from Settings → API Keys (`pk_live_…`). Required when running over stdio; not needed with `--http`, where each request supplies its own credentials. | |
| PLANPOST_API_URL | No | PlanPost API base URL. | https://api.planpo.st |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_postsA | List your scheduled and published social media posts. Filter by status, platform, campaign, label, post type, or free text. |
| get_postB | Get details of a specific post by ID. |
| create_postA | Create a new social media post. Saves as draft or schedules it for a specific time. X (Twitter): nothing sent to X may contain a link (URL, bare domain or t.co) — not the post, any thread segment, or a first comment (posted to X as a reply). The X API bills each link post at $0.20 vs $0.015, so the API rejects them; put a link-free version in platformContent.twitter. |
| preview_postA | Show exactly what each platform will receive for a post: the body after platformContent overrides, the attachments after platformMedia overrides, character count vs the platform limit, whether links are clickable, and the warnings for that platform. Use this to check a post (especially carousels, videos and multi-platform posts) BEFORE scheduling or publishing. Returns structured data plus a dashboard link for the visual preview — it does not return screenshots. |
| bulk_create_postsA | Create a whole campaign of posts from one manifest. Each entry accepts the same fields as create_post; |
| list_campaignsA | List campaign bundles — every campaign tag in use, with post counts by status, the platforms involved and the next scheduled time. Use this to see what a campaign contains before editing or deleting it. |
| delete_postsA | Bulk-delete posts matching a filter — e.g. every draft in a campaign. SAFETY: a filter is required (it will never delete everything), published and processing posts are always excluded, and it runs as a DRY RUN unless confirm:true. Always call once without confirm to see what matches, show the user, then confirm. |
| list_mediaA | List media you already uploaded, so you can reuse an asset instead of uploading it again. Each item comes back already shaped for create_post's |
| update_postA | Update a draft or scheduled post. X (Twitter): nothing sent to X may contain a link (URL, bare domain or t.co) — not the post, any thread segment, or a first comment (posted to X as a reply). The X API bills each link post at $0.20 vs $0.015, so the API rejects them; put a link-free version in platformContent.twitter. |
| delete_postC | Delete a post. |
| retry_failedA | Retry the platforms that failed on a failed or partially_published post. Only failures classified transient (platform outage, rate limit, network) are re-queued; failures that need the user — reconnect an account, top up X API credits, choose TikTok visibility — or that the payload caused are refused and returned with their fix. Platforms that already went out are never re-posted. Check get_post → platformResults[].errorClass / .fix first. |
| get_delivery_reportA | The morning check: everything that needs the user's attention about delivery. Posts that failed or partially failed in the last |
| publish_postA | Publish a draft or scheduled post immediately to all connected platforms. X (Twitter): nothing sent to X may contain a link (URL, bare domain or t.co) — not the post, any thread segment, or a first comment (posted to X as a reply). The X API bills each link post at $0.20 vs $0.015, so the API rejects them; put a link-free version in platformContent.twitter. |
| list_connectionsA | List all connected social media accounts (Instagram, Twitter, LinkedIn, etc.). |
| list_account_groupsA | List account groups the user has set up in PlanPost (e.g. 'Polish Pages', 'English Pages'). Each group bundles social connections so you can target multiple accounts in one create_post call. Returns id, name, connectionCount, isDefault, and the underlying connections. |
| get_account_groupA | Fetch one account group by id, name, or default flag. Returns the group's connectionIds[] so they can be passed straight to create_post. Name matching is case-insensitive (exact match preferred, substring fallback). If the name is ambiguous the server returns 300 with the candidates. |
| create_account_groupA | Create a named account group (e.g. 'Polish Pages') bundling social connections, so future posts can target the whole set at once. |
| update_account_groupA | Update an account group's name, description, color, default flag, or replace its full connection list. |
| delete_account_groupA | Delete an account group (does not disconnect the underlying social accounts). |
| add_connections_to_groupC | Add social connections to an existing account group. |
| remove_connections_from_groupC | Remove social connections from an account group. |
| get_connection_linkA | Generate a link the user can open in their browser to connect a new social account (OAuth needs a human — send them this link). |
| submit_for_approvalA | Submit a post for human approval. Use this when your API key requires approval (or whenever you want a human to sign off before publishing). Returns an approve link and an approval ID to poll. On approval the post auto-schedules if it has a scheduledFor time. |
| list_pending_approvalsB | List posts waiting for approval (and their outcomes). Filter by status to build a review queue. |
| get_approval_statusA | Check whether a human has decided on a submitted approval yet (pending / approved / rejected / changes_requested). Poll this after submit_for_approval. |
| get_analyticsB | Get post performance analytics — impressions, likes, comments, shares. |
| upload_mediaB | Get a presigned URL to upload an image or video for use in posts. |
| repurpose_contentB | Save AI-repurposed content as draft posts. Provide an array of posts with content and target connections. |
| list_video_templatesA | List available video templates (quotes, hooks, listicles, stories, product showcases, testimonials, promos). Each template describes its editable fields — use them with create_video. |
| create_videoA | Submit a video render job from a template. Returns a render ID — poll get_video_status until status is 'completed', then use the returned video URL as post media. |
| get_video_statusA | Check the status of a video render job. Completed renders include presigned download URLs for the video and thumbnail (valid ~1 hour). |
| generate_carouselA | Generate carousel slide TEXT (title/content/quote/CTA) from long-form content. Then call render_carousel to turn the slides into branded PNG images in the media library. |
| list_carousel_stylesA | List the carousel design system: template families (with content-variant layouts), the 40-palette library (with resolved colors), output formats, font pairings, and slide caps. Use the ids with render_carousel. |
| render_carouselA | Render carousel slides into branded PNG images (server-side, pixel-perfect) saved to the media library. Returns a render ID — poll get_carousel_render until 'completed'. Slide 1 uses the family's cover layout, the last slide its CTA layout, middle slides cycle content variants. |
| get_carousel_renderA | Check a carousel render job. When completed, |
| list_brand_kitsA | List saved brand kits (palette, font pairing, logo, handle). Use a kit's id as render_carousel's brandKitId for one-call branded output. |
| list_content_sourcesA | List connected content sources (WordPress sites, RSS feeds) used to import content for repurposing. |
| add_content_sourceA | Connect a WordPress site or RSS feed as a content source. Imported posts can then be repurposed into social content. |
| delete_content_sourceC | Remove a content source. |
| fetch_source_contentA | Import the latest content from a source (e.g. new WordPress posts) right now, then list it with list_imported_content. |
| list_imported_contentB | List content already imported from a source — useful as input for repurpose_content or create_post. |
| get_revenue_overviewA | Get revenue analytics: totals and trend vs the previous period, recent transactions, and MRR metrics from connected providers (Stripe / RevenueCat / Shopify). Read-only. |
| generate_imageA | Generate an image with AI (DALL-E) for use in posts. Costs 1 AI credit. Returns the image URL — pass it through upload_media/create_post media flow. |
| get_brand_voicesA | List the user's brand voices (tone-of-voice profiles analyzed from their content). |
| get_brand_voice_promptA | Get the ready-to-use system prompt for a brand voice — apply it when writing posts so the content matches the user's tone. |
| get_best_timesA | Get the best times to post per platform, based on the user's engagement history. Use before picking scheduledFor in create_post. |
| suggest_scheduleA | Ask the smart scheduler to spread N posts across a date range at optimal times. Returns concrete timestamps for create_post. |
| get_posting_scheduleA | Read the weekly posting queue schedule: the global schedule plus any per-group overrides. Slots are {day: 1-7 (Mon=1..Sun=7), time: 'HH:MM' 24h} in the user's timezone. Groups without an override inherit the global schedule. Needs the schedule:read permission. |
| set_posting_scheduleA | Replace the weekly posting queue slots for the global schedule or one account group (Pro feature; needs the schedule:write permission). Pass the FULL desired slot list — it replaces the existing one. An empty array on a group removes its override so it inherits the global schedule again. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 49 tools
Most tools target a clearly distinct resource+action, and the carousel/video/approval sub-flows are well separated. A few boundaries blur: delete_post vs delete_posts (single vs filter-based bulk), and create_post vs bulk_create_posts vs repurpose_content all produce posts from different inputs. Preview vs get_post is also subtle, though descriptions clarify.
Nearly everything follows verb_noun snake_case (list_posts, create_post, get_approval_status, render_carousel). Minor deviations like retry_failed (no noun) and generate_image vs generate_carousel are trivial. Style is predictable enough for an agent to infer new tool names.
49 tools is heavy for a single server; the surface spans posts, media, approvals, account groups, carousels, video, content sources, revenue, brand and scheduling, which would be better split into scoped sub-servers. Individual tools earn their place, but the flat list is hard to navigate.
Coverage is broad: full post lifecycle, bulk create/delete, media upload/reuse, approvals, delivery diagnostics, analytics, account groups, connections, carousels, video, content sources and scheduling. Minor gaps remain, e.g. no campaign update/delete or approval cancellation tool, but agents can work around these.