---
name: postclay
description: Schedule and publish social posts across platforms via the Postclay MCP server. Use when the user wants to draft, schedule, list, or cancel posts to Instagram, TikTok, LinkedIn, X, Facebook, YouTube or Pinterest.
homepage: https://postclay.com
---

# Postclay

Postclay is an MCP server for cross-posting and scheduling social content
(Arabic/English-first). Everything the dashboard does, these tools do.

## Connect

Add the server to your MCP config. Authenticate with a workspace API key
(create one in the Postclay dashboard under Settings → API keys):

```json
{
  "mcpServers": {
    "postclay": {
      "url": "https://postclay.com/api/mcp",
      "headers": { "Authorization": "Bearer pm_live_<your-key>" }
    }
  }
}
```

The endpoint is stateless Streamable-HTTP. The key is scoped to one workspace;
never ask the user for a platform password — Postclay connects via each
platform's official OAuth.

## Tools

- `list_platforms()` — the platforms this workspace can target.
- `list_accounts()` — connected social accounts (id, platform, handle, status).
  Get a `socialAccountId` here before creating a post.
- `create_post({ content, kind, targets, mediaIds?, timezone?, recurrence? })`
  — creates a DRAFT. `kind` is `"SINGLE"` or `"CAROUSEL"`. `targets` is required:
  one `{ socialAccountId, contentOverride?, mediaIds? }` per account. Returns the
  post `id`.
- `schedule_post({ postId, scheduledAt, timezone })` — enqueues a draft.
  `scheduledAt` is absolute with a `Z`/offset, else wall-clock in `timezone`
  (an IANA zone like `Asia/Riyadh`).
- `list_posts({ status?, from?, to?, page?, pageSize? })` — `status` is one of
  `scheduled | published | draft | failed`. Paginated (`pageSize` 1–100).
- `get_post({ postId })` — one post with its per-target status.
- `cancel_post({ postId })` — cancel a scheduled/draft post.
- `upload_media({ filename, mimeType, dataBase64 })` — upload an image; use the
  returned id in `create_post`'s `mediaIds`.

## Typical flow

1. `list_accounts()` → pick the `socialAccountId`(s) to post to.
2. (optional) `upload_media(...)` → collect media ids.
3. `create_post({ content, kind: "SINGLE", targets: [{ socialAccountId }], mediaIds })`
   → keep the returned `id`.
4. `schedule_post({ postId: id, scheduledAt: "2026-08-20T18:30:00Z", timezone: "Asia/Riyadh" })`.
5. `list_posts({ status: "scheduled" })` to confirm.

## Notes

- Character counts are validated per platform (per grapheme — emoji and
  non-Latin scripts count as the reader sees them).
- Right-to-left content and non-Latin hashtags are first-class.
- Webhooks (`POST_PUBLISHED`, `POST_FAILED`) are available via REST for
  delivery notifications; see https://postclay.com/en/docs#webhooks.

Full REST + MCP reference: https://postclay.com/en/docs
