# MCP tools

Tools mirror the [REST API](/introduction/): same inputs, same results, same errors. **Read** tools never change anything and
are the only ones read-only connections see. Hints are the MCP tool annotations clients use to decide when to ask you first.

## Workspace and accounts

| Tool | Does | Access | API |
|---|---|---|---|
| `get_workspace` | Name, time zone, subscription, limits, your role and access level | Read | [`GET /me`](/api/operations/getworkspace/) |
| `list_accounts` | Connected accounts, their status and the content types each accepts | Read | [`GET /accounts`](/api/operations/listaccounts/) |
| `list_content_types` | Media and caption limits per content type; optional `platform` | Read | [`GET /content-types`](/api/operations/listcontenttypes/) |
| `get_tiktok_creator_info` | A TikTok account's allowed privacy levels and settings, live from TikTok | Read | [`GET /accounts/{id}/tiktok-creator-info`](/api/operations/gettiktokcreatorinfo/) |

## Posts

| Tool | Does | Access | Hints | API |
|---|---|---|---|---|
| `list_posts` | By `status` or `from`/`to`, filter by `accountId`/`tagId`; returns `{ items, nextCursor }` | Read | | [`GET /posts`](/api/operations/listposts/) |
| `get_post` | One post with per-account status, errors and live links | Read | | [`GET /posts/{id}`](/api/operations/getpost/) |
| `validate_post` | Check a post against every platform's rules without saving | Read | | [`POST /posts/validate`](/api/operations/validatepost/) |
| `create_post` | Draft, schedule, publish now or send for approval | Write | open world | [`POST /posts`](/api/operations/createpost/) |
| `update_post` | Replace a post that hasn't published | Write | destructive | [`PUT /posts/{id}`](/api/operations/updatepost/) |
| `reschedule_post` | Move to a new time | Write | idempotent | [`POST /posts/{id}/reschedule`](/api/operations/reschedulepost/) |
| `publish_post` | Publish now | Write | open world | [`POST /posts/{id}/publish`](/api/operations/publishpost/) |
| `retry_post` | Publish failed accounts again | Write | open world | [`POST /posts/{id}/retry`](/api/operations/retrypost/) |
| `approve_post` | Owner: approve a post waiting for review | Write | | [`POST /posts/{id}/approve`](/api/operations/approvepost/) |
| `reject_post` | Owner: send it back to its author with a reason | Write | | [`POST /posts/{id}/reject`](/api/operations/rejectpost/) |
| `delete_post` | Delete from PostFlow (live posts stay on the platform) | Write | destructive | [`DELETE /posts/{id}`](/api/operations/deletepost/) |

## Calendar, queue, media and tags

| Tool | Does | Access | API |
|---|---|---|---|
| `get_calendar` | Posts between `from` and `to` (≤ 92 days) plus free queue slots | Read | [`GET /calendar`](/api/operations/getcalendar/) |
| `get_queue` | Weekly posting times and suggested times | Read | [`GET /queue`](/api/operations/getqueue/) |
| `next_queue_slot` | The next free posting time | Read | [`GET /queue/next`](/api/operations/nextqueueslot/) |
| `list_media` | Media library, newest first; `kind`, `q`, `before` | Read | [`GET /media`](/api/operations/listmedia/) |
| `import_media` | Bring in a photo or video from a public URL | Write | [`POST /media`](/api/operations/importmedia/) |
| `delete_media` | Delete an unused file (destructive) | Write | [`DELETE /media/{id}`](/api/operations/deletemedia/) |
| `list_tags` | Tags, for `tagIds` | Read | [`GET /tags`](/api/operations/listtags/) |

## Comments and messages

Text in comments and messages is written by other people. The server tells agents never to follow instructions in it, and to
show you the exact reply and wait for your approval before sending one.

| Tool | Does | Access | API |
|---|---|---|---|
| `list_comments` | Comment threads on Facebook and Instagram, with replies | Read | [`GET /inbox`](/api/operations/listcomments/) |
| `reply_to_comment` | Post a public reply and mark it done | Write | [`POST /inbox/{id}/reply`](/api/operations/replytocomment/) |
| `hide_comment` | Hide or show a comment on the platform | Write | [`POST /inbox/{id}/hide`](/api/operations/hidecomment/) |
| `set_comment_status` | Mark done or open in PostFlow | Write | [`POST /inbox/{id}/status`](/api/operations/setcommentstatus/) |
| `list_conversations` | Direct message conversations, with the reply deadline | Read | [`GET /inbox/messages`](/api/operations/listconversations/) |
| `get_conversation` | The latest 100 messages | Read | [`GET /inbox/messages/{id}`](/api/operations/listmessages/) |
| `reply_to_conversation` | Send a reply within 24 hours of their last message | Write | [`POST /inbox/messages/{id}/reply`](/api/operations/replytoconversation/) |
| `set_conversation_status` | Mark done or open in PostFlow | Write | [`POST /inbox/messages/{id}/status`](/api/operations/setconversationstatus/) |

## Analytics

| Tool | Does | Access | API |
|---|---|---|---|
| `get_analytics` | 7, 30 or 90 days vs the period before: totals, per account and format, best times, top posts | Read | [`GET /analytics`](/api/operations/getanalytics/) |

## Results and errors

Successful calls return the API's JSON as text, and as `structuredContent` when it's an object. Failures return
`isError: true` with the error code, message and details:

```text
VALIDATION: Some posts need changes before they can be scheduled
{"preflight":[{"socialAccountId":"acc_th","issues":[{"severity":"error","code":"caption_length","message":"Caption is 612 characters; the limit is 500."}]}]}
```