Skip to main content
Glama
@posteahora/mcp

@posteahora/mcp

Official
by posteahora

@posteahora/mcp

MCP server for PosteAhora — let AI agents add ideas, create, schedule, and publish social posts across Instagram, X/Twitter, LinkedIn, Threads, Facebook, Google Business (and more) straight from a chat.

It's a thin wrapper over the PosteAhora public REST API: every call is authenticated with your API key and goes through the same quota, ownership, and publishing pipeline as the web app.

Get an API key

  1. Open PosteAhora → Settings → API & integrations.

  2. Create a key and copy it (it's shown once). It looks like pah_live_….

Related MCP server: @posteverywhere/mcp

Workspaces

A key (and a hosted connector) is bound to one workspace — the one that was active when you created it. So list_accounts, list_posts, list_ideas and get_analytics return that workspace's data, not everything you own. To work in another workspace, create a separate key/connector there. Writes are role-gated: a viewer key can read but not create_post, schedule_post, update_post, delete_post or publish_post_now (those return 403).

Install (Claude Code / Cursor / Windsurf)

Add to your MCP client config:

{
  "mcpServers": {
    "posteahora": {
      "command": "npx",
      "args": ["-y", "@posteahora/mcp"],
      "env": {
        "POSTEAHORA_API_KEY": "pah_live_xxxxxxxx",
        "POSTEAHORA_API_URL": "https://api.posteahora.com/functions/v1/api"
      }
    }
  }
}
  • Claude Code: claude mcp add posteahora -e POSTEAHORA_API_KEY=pah_live_… -e POSTEAHORA_API_URL=https://api.posteahora.com/functions/v1/api -- npx -y @posteahora/mcp

  • Cursor / Windsurf: add the JSON above to the MCP settings file.

Tools

Tool

What it does

list_accounts

List connected social accounts. Call first — you need each accountId to post.

list_boards

List the boards of a connected Pinterest account. Every Pin needs a boardId from here.

list_ideas / create_idea

Read / add backlog ideas (no publishing).

create_post

Create a draft, or publish now (status: "published").

schedule_post

Publish at a future time (scheduledAt, ISO 8601).

list_posts / get_post_status

Inspect posts and per-platform results.

upload_media

Upload a local image/video from the machine running this server, returns a public URL for mediaUrls. Use in local mode.

create_upload_url

Return a short-lived presigned URL so the client uploads a file directly to storage. Use in remote/hosted mode, where the server can't read your local files.

Typical flow

  1. list_accounts → grab the id for each platform you want to post to.

  2. (optional) get a publicUrl for your media:

    • Local mode: upload_media with an absolute filePath → publicUrl.

    • Remote/hosted mode: create_upload_url with filename/sizeBytes → uploadUrl + publicUrl; then HTTP PUT the raw bytes to uploadUrl with the matching Content-Type header (e.g. curl -T ./slide.jpg "<uploadUrl>" -H 'Content-Type: image/jpeg'). This works for any size, including video, and is required for TikTok photos (they must be served from our verified cdn.posteahora.com domain).

  3. Pinterest only: list_boards with the Pinterest accountId → pick a board and pass its id as platformOptions: { pinterest: { boardId } }.

  4. create_post with accountMappings: [{ platform, accountId }], mediaUrls, and status: "published" (or schedule_post with scheduledAt).

Remote / hosted mode (experimental)

npm run start:http starts a stateless Streamable HTTP server on /mcp (PORT, default 8787). The caller's Authorization: Bearer pah_… header is used as the API key (falls back to POSTEAHORA_API_KEY). Put OAuth in front for a production multi-tenant connector.

Development

npm install
npm run build
POSTEAHORA_API_KEY=pah_live_… POSTEAHORA_API_URL=https://api.posteahora.com/functions/v1/api npm start

Available Tools

15 tools
create_ideaCreate a post ideaA

Add a lightweight idea to the backlog. Use this for brainstorming — it does NOT publish anything. Promote to a real post later with create_post.

Inputs: tags, title, status, caption, +1 more. Returns: idea

create_postCreate or publish a postA

Create a post. With status 'draft' it's saved only. With status 'published' it is published immediately to every channel in accountMappings. ALWAYS call list_accounts first to get accountId for each platform. Upload media via upload_media and pass the returned public URL in mediaUrls.

Inputs: accountMappings (required), title, status, caption, +6 more. Returns: status, postIds

create_upload_urlCreate a direct media upload URLA

Get a short-lived presigned URL to upload a local media file directly to storage from THIS client. Use this instead of upload_media when the MCP server runs remotely and cannot read your local files. Steps: (1) call this with filename, sizeBytes (exact byte length of the file) and optionally contentType; (2) HTTP PUT the raw file bytes to the returned uploadUrl with header 'Content-Type' set to the same contentType (e.g. curl -T ./slide.jpg "" -H 'Content-Type: image/jpeg') and expect HTTP 200; (3) put the returned publicUrl into mediaUrls of create_post / create_idea. Do NOT pass a filePath here — you upload the bytes yourself. The uploadUrl expires quickly, so upload right after calling this.

Inputs: filename (required), sizeBytes (required), contentType. Returns: method, publicUrl, uploadUrl, expiresInSeconds

delete_ideaDelete a post ideaA
DestructiveIdempotent

Permanently delete an idea from the backlog. Get ids from list_ideas.

Inputs: id (required). Returns: id, deleted

delete_postDelete a postA
DestructiveIdempotent

Delete a post (soft delete — it stops appearing in listings). Get ids from list_posts.

Inputs: id (required). Returns: id, deleted

get_analyticsGet post analyticsA
Read-only

Read performance metrics (views, likes, comments, shares, reach, saves, impressions, reposts, interactions) for the user's published posts, with aggregated totals and a per-platform breakdown. Data is synced from each platform hourly. Use it to analyze what performed well and to generate new ideas with create_idea.

Inputs: limit, period, platform. Returns: posts, period, summary

get_post_statusGet a post's statusA
Read-only

Fetch one post by id, including its per-platform publish results (platform_results).

Inputs: id (required). Returns: post

list_accountsList connected social accountsA
Read-only

List the connected social accounts in this key/connector's workspace (a key or connector is bound to one workspace, so this returns that workspace's accounts, not every account you own). ALWAYS call this first before create_post or schedule_post: you need each account's id to target the right channel (the API refuses to publish without an explicit accountId).

Inputs: no named parameters. Returns: accounts

list_ideasList post ideasA
Read-only

List your workspace's post ideas (the kanban backlog of drafts to iterate on).

Inputs: no named parameters. Returns: ideas

list_postsList postsA
Read-only

List your workspace's posts, newest first. Optionally filter by status.

Inputs: limit, status. Returns: posts

publish_post_nowPublish an existing post nowA

Publish a saved draft or scheduled post immediately to its channels. A multi-channel draft is fanned out into one post per platform (each returned in postIds); the original draft id is retired. The post must already have a connected account selected per channel (set it with update_post if needed). Use get_post_status on the returned ids to check the per-platform result.

Inputs: id (required). Returns: status, postIds

schedule_postSchedule a post for laterA

Schedule a post to publish at a future time. Same as create_post but requires scheduledAt (ISO 8601). Call list_accounts first.

Inputs: scheduledAt (required), accountMappings (required), title, caption, +6 more. Returns: status, postIds

update_ideaUpdate a post ideaA
Idempotent

Edit an existing idea in the backlog. Only the fields you pass are changed. Use status to move it between kanban columns. Get ids from list_ideas.

Inputs: id (required), tags, title, status, +3 more. Returns: idea

update_postUpdate an existing postA
Idempotent

Edit a draft or scheduled post. Only the fields you pass are changed. Status can be 'draft' or 'scheduled' (with scheduledAt) — to publish an existing post immediately use publish_post_now instead. Get ids from list_posts.

Inputs: id (required), title, status, caption, +8 more. Returns: post

upload_mediaUpload a media fileA

Upload a local image or video file to media storage and get back a public URL to use in mediaUrls of create_post / create_idea. Provide an absolute filePath on the machine running this MCP server.

Inputs: filePath (required), contentType. Returns: publicUrl

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.4/5.0

    Scored across 15 tools

    Disambiguation5/5

    Each tool targets a distinct resource and action. Even the three publishing-related tools (create_post, schedule_post, publish_post_now) are clearly separated by their purpose: create, schedule, and publish existing. No two tools are likely to be confused.

    Naming Consistency5/5

    All tool names use lowercase snake_case with a verb_noun pattern (list_ideas, create_post, upload_media). Exceptions like publish_post_now and get_post_status still adhere to the verb-first structure, making the namespace predictable.

    Tool Count5/5

    With 15 tools, the server covers the full social media management workflow without redundancy or bloat. Each tool has a clear role, and the count is within the ideal range.

    Completeness5/5

    The server provides complete CRUD for ideas and posts, multiple publishing options, media upload, account listing, and analytics. It covers the entire lifecycle from brainstorming to performance review, with no obvious dead ends.

    Maintenance

    ActivityMaintained
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to publish, schedule, and manage social media posts across X (Twitter), Instagram, and Threads through the Sociona API. Supports immediate posting, scheduling, analytics, and account management with natural language commands.
      6
      12 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Official MCP server for PostEverywhere (posteverywhere.ai/social-media-scheduler). Let Claude, ChatGPT, Cursor or any MCP client schedule and publish posts to 13 platforms: Instagram, TikTok, YouTube, LinkedIn, Facebook, X, Threads, Pinterest, Bluesky, Telegram, Discord, WordPress and Google Business Profile. 40 tools: best-time scheduling, threads, cross-posting, campaigns, analytics.
      33
      289 npm
      7
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to manage social media publishing across platforms like LinkedIn, Twitter, Facebook, Instagram, Threads, and Bluesky.
      7
      54 npm
      MIT