Social
Space MCP tools in the Social scope (social). Reach these with a wks_live_ key over space-mcp or space-api.
Tools in the social scope, callable over space-mcp (tools/call) or space-api (REST) with a wks_live_* key that grants social.
check_social_accounts
Scope: social:read
Ask the network whether each of the space's social accounts is still connected — the Social Manager's health check. An account that is not ok has to be reconnected by its owner (Backstage → Connectors); say so rather than retrying what failed. checked_at is when the network last reported on it (it may have nothing new to say); a tool that fails with "reconnect" outranks an old ok.
check_social_post
Scope: social:read
Check a post against each network's rules BEFORE posting it — length, media count and kind, required fields — and get the errors and warnings per platform. Nothing is posted.
| Parameter | Type | Required | Description |
|---|---|---|---|
text | string | ||
platforms | string[] | yes | Platform names, e.g. ['instagram','x']. |
platform_texts | object | Own words for a platform: { x: "shorter text" }. | |
media_urls | string[] |
create_social_draft
Scope: social:write
Write a DRAFT social post in the Social Manager — nothing is posted, and no account needs to be connected. Write it for platforms (instagram, facebook, linkedin, x, tiktok, threads, youtube, pinterest, bluesky, reddit); optionally name the accounts it goes on (account_ids from list_social_accounts), a planned date (planned_at — shown on the calendar, NOT a schedule), and a group (a name; a new name makes the group, e.g. "Launch week"). The answer says which platforms still need an account. Schedule or post it later with publish_social_post {draft_ids}.
| Parameter | Type | Required | Description |
|---|---|---|---|
text | string | yes | |
platforms | string[] | Platform names, e.g. ['instagram','linkedin']. | |
account_ids | string[] | Accounts it goes out on (list_social_accounts). Optional — pick them later. | |
media_urls | string[] | ||
planned_at | string | ISO time it is planned for. Not a schedule: nothing goes out until it is scheduled. | |
group | string | Group name or id. A new name makes the group. | |
platform_options | object | Per-platform provider options keyed by platform name, as publish_social_post takes them. |
create_social_group
Scope: social:write
Make a group of social posts (a named set of drafts, like "Launch week"). The same name twice is one group. Groups never nest.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes |
delete_comment_auto_reply
Scope: social:write
Delete a comment auto-reply for good (to stop it for a while, save it with status paused).
| Parameter | Type | Required | Description |
|---|---|---|---|
auto_reply_id | string | yes |
delete_dm_welcome
Scope: social:write
Remove an account's welcome message (to stop it for a while, save it with on: false).
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | yes |
delete_social_draft
Scope: social:write
Delete a DRAFT social post (never a scheduled or published one — delete_social_post takes a scheduled one back).
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The draft's id from list_social_posts. |
delete_social_group
Scope: social:write
Delete a group of social posts. Its posts and drafts stay, in no group.
| Parameter | Type | Required | Description |
|---|---|---|---|
group | string | yes | Its name or id. |
delete_social_planner
Scope: social:write
Delete one of the space's posting schedules (planner_id from list_social_planners). Posts already scheduled stay scheduled.
| Parameter | Type | Required | Description |
|---|---|---|---|
planner_id | string | yes |
delete_social_post
Scope: social:run
Take a SCHEDULED social post back before it goes out (consequential): the provider's post_id from publish_social_post's answer. A post that already published cannot be deleted this way.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes | The post id publish_social_post returned (post._id). |
detach_social_account
Scope: social:write
Detach a social account from THIS space — the Social Manager's Detach. It stays connected to its owner and any other space; nothing on the network changes. Bring it back with request_connection.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | yes |
edit_published_social_post
Scope: social:run
Change the words of a post that ALREADY went out — X only (the one network that allows it; consequential, it changes a live post). post_id from list_social_posts. Anywhere else: unpublish_social_post, then publish a new one.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes | |
text | string | yes | The post's new words. |
get_google_business
Scope: social:read
The space's Google Business profile. part: locations (the profile's locations and which one is in use; search to filter), photos (its photos and videos), services (the services it lists), verification (its verification state and the ways Google offers to verify).
| Parameter | Type | Required | Description |
|---|---|---|---|
part | locations | photos | services | verification | yes | |
account_id | string | Only when there is more than one Google Business account. | |
location_id | string | ||
search | string |
get_social_analytics
Scope: social:read
Get social analytics. Omit post_id for account-level; pass post_id for a single post.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | ||
platform | string | ||
start_date | string | ||
end_date | string |
get_social_insights
Scope: social:read
The deeper social numbers the Analytics tab shows. kind: best_time (when posts do best, by day and hour), content_decay (how fast a post's reach fades), posting_frequency (how often vs how well), followers (follower growth over from_date–to_date), account (one account's reach, impressions, views… — Instagram, YouTube, TikTok, Facebook, LinkedIn), demographics (who follows — Instagram, YouTube), inbox (DM volume, heatmap, source-breakdown, response-time or top-accounts via inbox_view). Dates are YYYY-MM-DD; default the last 30 days. For a single post's numbers use get_social_analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
kind | best_time | content_decay | posting_frequency | followers | account | demographics | inbox | yes | |
account_id | string | Needed for account and demographics when there is more than one; narrows the others. | |
platform | string | ||
from_date | string | ||
to_date | string | ||
granularity | daily | weekly | monthly | followers only. | |
metrics | string | account only: comma-separated metric names; omit for the usual ones. | |
breakdown | string | demographics only, e.g. age, gender, country, city. | |
inbox_view | volume | heatmap | source-breakdown | response-time | top-accounts |
get_social_queue
Scope: social:read
The posting network's queue for the space's accounts: the weekly time slots a queued post takes, its timezone and the next free slots. (The space's own schedules are planners — list_social_planners.)
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | Only needed when the accounts sit in more than one profile. |
list_comment_auto_replies
Scope: social:read
The space's comment auto-replies (the Auto-Reply tab): per account, keyword rules that answer a comment publicly, DM the commenter, tag them as a contact or hand the comment to the agent — with how often each matched. auto_reply_id is what save/delete take.
list_comment_auto_reply_runs
Scope: social:read
What the comment auto-replies did lately: each comment, who wrote it, whether a rule matched, and what was sent or skipped (and why).
| Parameter | Type | Required | Description |
|---|---|---|---|
auto_reply_id | string | ||
limit | number |
list_dm_welcomes
Scope: social:read
The welcome messages the space's accounts send a person who writes to them for the FIRST time (Instagram, Facebook, X, Bluesky, Reddit, Telegram, WhatsApp), which accounts can have one, and the latest new conversations with whether each was welcomed.
| Parameter | Type | Required | Description |
|---|---|---|---|
recent | number | How many recent new conversations, default 10. |
list_social_accounts
Scope: social:read
List social accounts connected to this space (platform, name, username).
list_social_comments
Scope: social:read
Read the comments people left on one of this space's PUBLISHED social posts, live from the network (post_id from list_social_posts). Each comment carries the id reply_to_social_comment and private_reply_to_comment take.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes | The post's id from list_social_posts (a published one). |
limit | number | How many comments (default 25, max 100). | |
cursor | string | The cursor from the previous page, to read further. |
list_social_groups
Scope: social:read
List the space's groups of social posts (a named set of drafts like "Launch week"), each with how many drafts and posts it holds.
list_social_mentions
Scope: social:read
Posts where someone tagged or mentioned the space's accounts, live from the network, newest first.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | One account. Omit for all of them. | |
limit | number | ||
cursor | string | To read further (with account_id). |
list_social_planners
Scope: social:read
List the space's social posting planner templates and slots.
list_social_posts
Scope: social:read
List this space's social posts (drafts, scheduled, published, failed) from the Social Manager. Optional status filter ('draft'|'scheduled'|'published'|'failed'), group (a group's name or id), needs_account (only drafts that cannot go out yet for want of an account) and limit. A draft carries its planned_at, account_ids, group and needs_account (why a platform cannot go out yet). Use this to see the draft/post queue instead of guessing.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | Filter by status: draft | scheduled | published | failed. | |
group | string | Only this group's posts (name or id from list_social_groups). | |
needs_account | boolean | Only drafts still waiting for an account. | |
limit | number |
list_social_reviews
Scope: social:read
Read the reviews people left on the space's Facebook Page and Google Business profile (rating, words, who, whether it was answered and how), live from the network. unanswered_only for what still needs a reply; min_rating / max_rating to find the unhappy ones. Each review carries the review_id and account_id reply_to_social_review takes.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | One account (list_social_accounts). Omit for every Facebook and Google Business account here. | |
platform | facebook | googlebusiness | ||
unanswered_only | boolean | ||
min_rating | number | 1–5 | |
max_rating | number | 1–5 | |
limit | number | Default 25, max 50. | |
cursor | string | To read further (with account_id). |
manage_google_business
Scope: social:run
Change the space's Google Business profile (consequential — it is public on Google). action: select_location (location_id — which location the account posts and answers for), add_photo (url of an image or video, description, category e.g. COVER, EXTERIOR, INTERIOR, PRODUCT, TEAM), set_services (services: the WHOLE list as get_google_business part=services gives it — it replaces what is there), start_verification (method from part=verification, + phone_number or email), complete_verification (verification_id + pin — the code Google sent, which only the owner has).
| Parameter | Type | Required | Description |
|---|---|---|---|
action | select_location | add_photo | set_services | start_verification | complete_verification | yes | |
account_id | string | ||
location_id | string | ||
google_account_id | string | ||
url | string | ||
media_format | PHOTO | VIDEO | ||
description | string | ||
category | string | ||
services | object[] | ||
method | string | ||
phone_number | string | ||
email | string | ||
language | string | ||
verification_id | string | ||
pin | string |
private_reply_to_comment
Scope: social:run
Write to the person who left a comment PRIVATELY, as a direct message (Instagram and Facebook only; once per comment, within 7 days of it). Use it for anything that should not be public — a price, a link, a booking. post_id from list_social_posts, comment_id from list_social_comments.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes | The post's id from list_social_posts. |
comment_id | string | yes | The comment's id from list_social_comments. |
text | string | yes | The private message. |
publish_social_post
Scope: social:run
PUBLISH or schedule social posts live (consequential). Two ways: (1) FROM DRAFTS — draft_ids (from list_social_posts) or a group, with when = "planned" (at their planned dates; drafts with none go one after another from start_at), "one_after_another" (from start_at, every_minutes apart; default a day) or "now". Each draft becomes its post — nothing is copied; a platform with no account stays a draft and the answer says why. (2) A NEW post — text and platforms ([{platform, accountId}] from list_social_accounts), optional media_urls and schedule_time.
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_ids | string[] | Drafts to schedule or post (list_social_posts). | |
group | string | Every draft in this group (name or id). | |
when | planned | one_after_another | now | For drafts. Default planned. | |
start_at | string | For drafts: ISO time the first undated one goes. | |
every_minutes | number | For drafts placed one after another. Default 1440 (a day). | |
text | string | For a new post. | |
platforms | object[] | For a new post. | |
media_urls | string[] | ||
schedule_time | string | For a new post. | |
platform_options | object |
rename_social_group
Scope: social:write
Rename a group of social posts.
| Parameter | Type | Required | Description |
|---|---|---|---|
group | string | yes | Its name or id. |
name | string | yes | The new name. |
reply_to_social_comment
Scope: social:run
Answer a comment on one of this space's published posts PUBLICLY, under the comment, as the account the post went out on (consequential — everyone sees it). post_id from list_social_posts, comment_id from list_social_comments.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes | The post's id from list_social_posts. |
comment_id | string | yes | The comment's id from list_social_comments. |
text | string | yes | The reply, as it will appear under the comment. |
reply_to_social_review
Scope: social:run
Answer a review PUBLICLY, under it, as the business (Facebook or Google Business — consequential, everyone sees it). review_id and account_id from list_social_reviews.
| Parameter | Type | Required | Description |
|---|---|---|---|
review_id | string | yes | |
account_id | string | yes | |
text | string | yes | The reply, as it will appear under the review. |
retry_social_post
Scope: social:run
Send a post that FAILED to go out again, as it was (consequential — it goes live). post_id from list_social_posts (status failed).
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes |
save_comment_auto_reply
Scope: social:run
Create a comment auto-reply, or change one (auto_reply_id) — it then answers comments ON ITS OWN in the business's name (consequential). account_id: the account whose comments it watches; posts: ["all"] or post ids from list_social_posts; rules in order, first match wins, each {keywords: [...] or any_comment: true, match_mode: contains|word|exact, exclude_keywords, reply: public answer, dm: private message (Instagram/Facebook only), followers: any|follower|non_follower (Instagram), not_following_message, tags: tag names or ids (a new name makes the tag), hand_to_agent: true, reply_delay_seconds / dm_delay_seconds}. {{name}} and {{handle}} fill in. status active|paused pauses it without losing it. On a change, rules / posts you omit stay as they are.
| Parameter | Type | Required | Description |
|---|---|---|---|
auto_reply_id | string | Change this one instead of creating. | |
name | string | ||
account_id | string | ||
status | active | paused | ||
posts | string[] | ["all"] for every post on the account, or post ids from list_social_posts. | |
rules | object[] |
save_dm_welcome
Scope: social:run
Set (or change) the welcome message an account sends ON ITS OWN to anyone who DMs it for the first time (consequential). message with {{name}} / {{handle}}, delay_seconds (0–86400) so it reads human, on: false to pause it. One welcome per account.
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string | yes | |
message | string | ||
delay_seconds | number | ||
on | boolean |
set_social_draft_accounts
Scope: social:write
Pick the account drafts go out on, once accounts are connected: account_ids (list_social_accounts) apply to every chosen draft written for that account's platform, replacing what was picked there. Choose drafts by draft_ids, by group, or leave both out for every draft in the space. Nothing is posted. (A platform with exactly one connected account needs no pick — that one is used.)
| Parameter | Type | Required | Description |
|---|---|---|---|
account_ids | string[] | yes | |
draft_ids | string[] | ||
group | string | A group's name or id: its drafts. |
set_social_queue
Scope: social:write
Set the posting network's queue: the weekly time slots (replaces them) and its timezone. slots: [{day: 'mon'…'sun', time: 'HH:MM'}]. queue_id + name to change a named queue; active to switch it on or off.
| Parameter | Type | Required | Description |
|---|---|---|---|
timezone | string | yes | IANA name, e.g. Europe/Paris. |
slots | object[] | yes | |
active | boolean | ||
queue_id | string | ||
name | string | ||
account_id | string |
sync_social_posts
Scope: social:read
Pull in the posts the space's accounts made OUTSIDE Wakato (or before they were connected), so list_social_posts, comments and numbers include them.
| Parameter | Type | Required | Description |
|---|---|---|---|
limit | number | Per account, default 50. |
unpublish_social_post
Scope: social:run
Take a post that ALREADY went out down from one network (consequential): Threads, Facebook, X, LinkedIn, YouTube, Pinterest, Reddit, Bluesky, Google Business, Telegram — Instagram and TikTok do not allow it. post_id from list_social_posts; platform when it went out on several. A scheduled post is taken back with delete_social_post instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
post_id | string | yes | |
platform | string |
update_social_draft
Scope: social:write
Change a DRAFT social post: its text, platforms, accounts (account_ids), media, planned date (planned_at; "" clears it), group (name or id; "" takes it out of its group) or platform options. Only what you send changes. Nothing is posted.
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The draft's id from list_social_posts. |
text | string | ||
platforms | string[] | ||
account_ids | string[] | ||
media_urls | string[] | ||
planned_at | string | ISO time it is planned for; "" clears it. | |
group | string | Group name or id; "" = no group. A new name makes the group. | |
platform_options | object |
upsert_social_planner
Scope: social:write
Create a posting schedule in the space's Social Manager, or replace an existing one's slots (pass planner_id). Give times ([8, '12:30']) and optional days (0=Sun..6=Sat, default every day). account_ids names the accounts the schedule is FOR — anything unattended, including apps, then posts ONLY to those, which is how a schedule built for one brand stays on that brand. Omit account_ids to leave an existing scope untouched; [] opens it to any account. A planner is the space's own schedule, so anything else posting can ride the same rhythm.
| Parameter | Type | Required | Description |
|---|---|---|---|
planner_id | string | Replace this planner's slots instead of creating one. | |
name | string | Required when creating. | |
description | string | ||
timezone | string | IANA name. Slots are interpreted in it. | |
times | string[] | 8 or '08:00'. | |
days | number[] | 0=Sun..6=Sat. Default every day. | |
account_ids | string[] | Accounts the schedule is for (from list_social_accounts). |