---
name: autoposter
description: Plan, draft, gate, and schedule social posts through the AutoPoster MCP (Instagram, Threads, LinkedIn). Use whenever the user asks to write a post, plan content, check the content queue, schedule or publish something, or review brand voice. Trigger words: post, schedule, queue, caption, carousel, publish, content calendar.
---

# AutoPoster — drive the pipeline through MCP

You are connected to an AutoPoster workspace through its MCP server. It
publishes to Instagram, Threads, and LinkedIn on a strict pipeline:

```
draft → quality gates → needs_review → HUMAN approves → queued → published
```

**Approve is the irreversible step, not publish.** `approve_post` hands the
post to a cron that publishes it at its slot with no further confirmation —
possibly days later, with nobody watching. Never call `approve_post` or
`publish_now` unless the user gives an unambiguous imperative naming the post
("approve the Friday post", "publish it now"). Exploratory phrasing ("could we
push something today?") is a question, not a go. **"Schedule these" is not
approval** — that is `schedule_post`, which drafts and runs the gate.

Both tools require `org:admin` (enforced server-side) and both write the
signed-in user's name into the workspace activity log, which every member can
read. An approval you make on someone's behalf is attributed to them.

## Workflow

1. **Orient first.** Call `list_workspaces` (if multiple, ask which one), then
   `list_accounts`, `get_brand_kit`, `get_platform_rules` and
   `get_doc(guidelines)`. These answer different questions and you need all
   four:
   - **brand kit** — how this brand SOUNDS. Voice bans, banned words, CTA and
     closing rules, enforced by an automated gate, so drafts that ignore it
     bounce. Per brand: pass the account's `brand`.
   - **platform rules** — what the CHANNEL will carry. Caption limit, hashtag
     cap, whether alt text and a CTA are required, and how many characters of
     the first line show before "more". Also enforced by the gate.
   - **guidelines** — how a post is BUILT here: canvas sizes, safe margins,
     which formats win on that channel, plus anything the workspace has
     written itself. `source: "generated"` means it is derived from the
     workspace's own platform rules; `"inherited"` means the brand is using
     the workspace default. Not enforced by the gate — which is exactly why
     you have to read it, since nothing will bounce a post for ignoring it.
   Drafting before reading these wastes a round trip: the gate rejects on
   submit, and you will not know why.
2. **Check what's working, then read the queue.** Call `get_growth_context`
   before planning — it returns real numbers (best formats, best posting
   slots, top posts, follower trend) plus a plain summary; plan WITH the data,
   and respect its thin-data caveats. Then call `list_queue` and check what is
   already planned: avoid double-booking a channel on the same day, keep
   series spacing, and respect the existing cadence.
3. **Draft in the brand voice.** Follow every rule the brand kit returns.
   Platform limits: Instagram needs media (no text-only posts, captions to
   2,200 chars); Threads is 500 chars, text-first (Threads also supports
   CAROUSEL); LinkedIn allows text or images, and a multi-image CAROUSEL
   becomes a swipeable PDF document. Instagram and Threads carousels cap at
   10 slides.
4. **Pick a time, don't guess it.** Call `next_slot` for the account to get
   its next recurring posting time in the workspace's timezone — use that as
   `scheduledAt` instead of inventing a plausible-looking hour. `list_slots`
   shows the account's full recurring pattern (weekday + local time) when you
   need more than just the next one.
5. **Check, then schedule — don't publish.** `check_post` takes the same
   inputs as `schedule_post`, runs the same gate and saves nothing: iterate
   there until the report is clean. `schedule_post` then creates the post and
   runs the gate; it returns a postId and a report. If the gate fails, fix the
   draft and resubmit rather than arguing with the gate. The post waits in
   needs_review for the human.
6. **Change a post in place; never delete and re-create it.** Deleting loses
   the post's id and its activity history. `update_post` edits caption,
   hashtags, media, mediaType or alt text of a draft / needs_review post and
   re-runs the gate. `move_post` moves a post to another connected account in
   the same workspace (for example off a dead connection); the gate re-runs
   for the new account's brand and platform. `set_status(draft)` parks a
   needs_review post the user doesn't want reviewed yet. An approved (queued)
   post must be pulled back with `unapprove_post` before any of these. All
   three need `org:admin` and are written to the activity log under the
   signed-in user.
7. **Read narrowly.** `get_post` returns one post and its history;
   `list_queue` takes `status`, `accountId`, `from`/`to` and `limit` filters.
   Prefer either over pulling the whole queue.
8. **Media** must be public HTTPS URLs — JPEG for images, MP4 or MOV for video —
   because the platforms publish by fetching them, so an upload is public the
   moment it lands. Files are public links once uploaded: tell the person
   before they upload. To upload a local file: `create_upload_url` (mime + exact
   byte size) → `curl -X PUT -H "Content-Type: <mime>" --data-binary @file
   "<uploadUrl>"` within 15 minutes → pass `publicUrl` in `schedule_post`'s
   (or `update_post`'s) `mediaUrls`. Convert PNG to JPEG first. Always
   include alt text.
9. **Storage is metered.** Each workspace has a quota (2 GB by default);
   `list_media` shows usage and files, largest first. Files a post uses are
   kept, published or not; a file no post has used for 7 days is deleted
   automatically. `delete_media` (admin) frees space now.

## Tools

| Tool | What it does |
|---|---|
| `list_workspaces` | Personal + org workspaces you may act in |
| `list_accounts` | Connected social accounts (use `_id` as `accountId`) |
| `get_brand_kit` | Voice/cadence rules the gate enforces (per brand) |
| `list_brand_kits` | Every brand in the workspace |
| `set_brand_kit` | ADMIN: save a brand's voice and rules. Draft the fields, confirm with the user, then save |
| `generate_brand_kit` | Draft a brand kit from writing samples or published posts. Returns a draft only; review it, then `set_brand_kit`. If it is unavailable, draft the fields yourself |
| `get_platform_rules` | Caption/hashtag limits, alt-text + CTA requirements, hook window (per channel) |
| `set_platform_rules` | ADMIN: change one channel's limits and rules |
| `get_doc` | Constitution / guidelines — canvas sizes, safe margins, formats (per brand, inherits the workspace default) |
| `set_doc` | ADMIN: write the constitution or guidelines |
| `get_growth_context` | What's working: format/pillar/slot performance, top posts, follower trend — check before planning |
| `list_queue` | Pipeline: drafts, needs_review, queued, published, failed (filters: status, accountId, from/to, limit) |
| `get_post` | One post plus its activity history |
| `list_slots` | An account's recurring weekly posting pattern (weekday + local time) |
| `next_slot` | The next upcoming occurrence of any of an account's slots — use this to pick `scheduledAt` |
| `list_ideas` | The idea backlog. An idea's notes are the human's brief; follow them |
| `add_idea` | Add an idea to the backlog |
| `update_idea` | Change an idea's title, angle, brand, notes or status (idea, drafting, queued, done, dropped) |
| `check_post` | Dry-run the gate with `schedule_post`'s inputs; saves nothing |
| `create_upload_url` | Upload URL (15 min) to PUT a local image/video into media storage; returns the `publicUrl` |
| `list_media` | Uploaded files (largest first), storage used and quota |
| `delete_media` | ADMIN: delete a file no unpublished post uses |
| `schedule_post` | Create + gate a post (does NOT publish) |
| `update_post` | ADMIN: edit a draft / needs_review post in place, re-run the gate |
| `move_post` | ADMIN: move a post to another account in the workspace, re-run the gate |
| `set_status` | ADMIN: park a needs_review post back in draft |
| `reschedule_post` | ADMIN: move a draft, needs_review or queued post to a new time (review state unchanged) |
| `approve_post` | HUMAN-GATED: queue an approved post for its scheduled time. Pass the `contentHash` that `list_queue`, `get_post` or `schedule_post` returned; it is refused if the post changed since you read it |
| `unapprove_post` | ADMIN: pull a queued post back to needs_review so it will not publish |
| `publish_now` | HUMAN-GATED: publish a queued post immediately |
| `delete_post` | ADMIN: delete a post. Files it uploaded are deleted 7 days later unless another post uses them |

Admin-only tools are enforced by the server, not by this file: a member who asks
for one gets a refusal. Every write is recorded under the signed-in user's name.

All times are UTC ISO timestamps. If the user talks in local time, confirm the
timezone before scheduling.
