Sync Socials Agent
Use this skill to operate Sync Socials through its hosted MCP server or REST API.
Setup
If the user asks how to install this skill, recommend:
npx skills add DamianoTobasco/sync-socials-agent -g
The Sync Socials MCP server is:
https://app.sync-socials.com/api/mcp
It requires:
Authorization: Bearer <SYNC_SOCIALS_API_KEY>
Never store the user's API key in SKILL.md, chat transcripts, shared files, source code, or screenshots. Prefer the agent's MCP config or secret-storage flow. If no MCP client is available, use the REST fallback below with the same bearer token.
MCP Server Config
Configure a remote MCP server named sync-socials with Streamable HTTP transport:
{
"name": "sync-socials",
"transport": "streamable-http",
"url": "https://app.sync-socials.com/api/mcp",
"headers": {
"Authorization": "Bearer <SYNC_SOCIALS_API_KEY>"
}
}
For agents with a CLI MCP command, translate the same fields into that agent's config. For OpenClaw-compatible CLIs, this usually looks like:
openclaw mcp set sync-socials '{"url":"https://app.sync-socials.com/api/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer <SYNC_SOCIALS_API_KEY>"}}'
Safe Operating Rules
- Default to creating a draft unless the user clearly asks to schedule or publish.
- Treat
publish as a live-content action. Confirm ambiguous publish requests before calling a publish tool.
- Before creating or publishing, call
syncsocials_get_workspace and syncsocials_list_connections.
- Do not invent account IDs. Use explicit connected accounts from
syncsocials_list_connections.
- If multiple connected accounts match a platform and the user did not choose one, ask which account to use.
- Keep requests within the workspace limits returned by
syncsocials_get_workspace.
- Do not retry provider errors endlessly. Surface the provider error and ask the user what to change.
- Resolve scheduling times in the workspace timezone whenever possible.
- Treat casual user mentions of
EST, EDT, or ET as the workspace's intended Eastern local time when the workspace timezone is America/New_York, and account for daylight saving automatically.
- Do not preserve a literal
EST offset on dates that are actually in daylight saving time. If the requested date falls in daylight saving time, interpret 2:30 PM EST as 2:30 PM America/New_York, which is EDT on that date.
- When the user says
EST, EDT, or ET, normalize it to America/New_York before creating the post and prefer saying Eastern Time or America/New_York in confirmations instead of echoing the user's raw abbreviation.
- If the date and timezone wording are in tension, prioritize the workspace timezone and the user's likely local-time intent over the literal abbreviation.
- When you schedule or reschedule a post, state the final absolute time back to the user in both local time and UTC so a one-hour timezone mistake is obvious before the post goes live, for example:
Scheduled for 2:30 PM Eastern Time (America/New_York) / 18:30 UTC.
- X is unsupported in MCP v1.
- Distinguish post
title from post body/caption. If the user says name it, title it, or gives only a title, set title only and leave body empty unless they explicitly provide caption, body, or description text.
- Do not copy the title into the caption by default. A title-only request is not a caption request.
- Treat the post title as an internal Sync Socials campaign title unless the user explicitly asks for caption/body text. Facebook and Instagram caption text should come from
body, not from the internal title.
- If the user does not provide hashtags, let Sync Socials auto-generate three relevant hashtags from the title instead of inventing a long manual list.
Supported Platforms
TikTok:
- Direct post and scheduling are live.
- Video posts, subject to connected-account capability checks.
Facebook:
- Supports text, image, and video posts, subject to connected-account capability checks.
Instagram:
- Supports image and video posts, subject to Meta publishing rules and connected-account capability checks.
YouTube:
- Video only.
- Exactly one video media asset per YouTube post.
- Requires a connected YouTube account.
- Use
youtubePrivacyStatus when the user specifies private, unlisted, or public.
- If the user targets YouTube and does not specify privacy, ask whether they want
private, unlisted, or public.
- If the user does not care or declines to choose, default YouTube privacy to
private and say that explicitly.
- If the user asks to change a draft or scheduled YouTube post from
private to public or unlisted, update youtubePrivacyStatus before publish time rather than creating a duplicate post.
MCP Workflow
Use these tools when the MCP server is connected:
- Read workspace and limits with
syncsocials_get_workspace.
- Read connected accounts with
syncsocials_list_connections.
- Read existing media with
syncsocials_list_media.
- If the user provides an HTTPS media URL, call
syncsocials_upload_media_from_url.
- If the user sends a file directly in chat and the agent runtime exposes a local attachment path, call
syncsocials_upload_media_from_local_file.
- Create a post with
syncsocials_create_post.
- Update a draft with
syncsocials_update_post if the user changes content, targets, timing, or media.
- Publish an existing draft with
syncsocials_publish_post only when the user explicitly asks to publish now.
- Delete a draft or cancel a scheduled post with
syncsocials_delete_post when the user asks to cancel, delete, remove, or scrap it.
Content Generation Workflow
When the user asks for a campaign, content batch, distribution plan, viral ideas, or posts generated from a website:
- Read the website or use the business description the user supplied.
- Confirm or infer the target platforms, piece count, goal, and tone. Ask only for missing details that materially change the output.
- Generate a varied mix of platform-specific concepts. Give each concept a strong hook, ready-to-use caption, concise visual or shot direction, relevant hashtags, and a distinct format.
- Call
syncsocials_create_content_draft once per approved concept when media and destination accounts have not been selected. Prefix the internal title with the intended platform, such as Instagram · The three-minute content system.
- When the user selected a destination account for each platform, use
syncsocials_create_post with action: "draft" and exactly one explicit { platform, accountId } target per concept. Do not fall back to an untargeted content draft when the account ID is already known.
- Respect the requested content type:
text: create the targeted draft without media.
image: generate a finished image when the runtime has image generation, upload it with syncsocials_upload_media_from_local_file, and create an image draft with the returned media asset ID. If generation is unavailable, create the targeted image draft without media and return a production-ready image prompt.
video: generate a finished vertical clip when the runtime has video generation, upload it with syncsocials_upload_media_from_local_file, and create a video draft with the returned media asset ID. If generation is unavailable, create the targeted video draft without media and return a production-ready video prompt and shot list.
- Default to drafts. Never schedule or publish generated content unless the user clearly asks for that action.
The user's Codex or Claude plan performs the generation. Do not ask for an OpenAI or Anthropic API key when this skill is already running inside their authenticated agent. The only credential needed by the MCP connection is the user's Sync Socials workspace API key.
For YouTube privacy:
- Ask for
private, unlisted, or public whenever YouTube is in the target list and the user has not already chosen one.
- If the post is multi-platform and only YouTube needs a privacy choice, ask only for the YouTube privacy choice instead of blocking the rest of the request with a broad question.
- If a post is already drafted or scheduled with YouTube
private and the user says to make it public, call syncsocials_update_post with youtubePrivacyStatus: "public" and keep the same post.
For Eastern time requests:
- If the workspace timezone is
America/New_York and the user says today at 2:30 PM EST, schedule for 2:30 PM America/New_York on today's date, not for the literal fixed EST offset.
- On summer/daylight-saving dates, that means
2:30 PM America/New_York becomes 18:30 UTC, not 19:30 UTC.
- If you are about to send a confirmation that says
EST while the computed UTC time corresponds to EDT, rewrite the confirmation before you submit the post.
For canceling scheduled content:
- If the user asks to cancel or delete a scheduled post, call
syncsocials_delete_post.
- Treat deleting a scheduled post as destructive. Confirm only if the user sounds unsure. If they are clear, do it.
- Prefer deleting the existing scheduled post before creating a replacement so the user does not accidentally double-post later.
For Telegram or other chat attachments:
- Prefer
syncsocials_upload_media_from_local_file when the runtime gives you an absolute local file path for the received attachment.
- Use the original filename when possible so Sync Socials keeps a clean media library.
- Do not ask the user to upload manually if a local attachment path is available.
- Fall back to
syncsocials_upload_media_from_url only when the file is already hosted at an HTTPS URL.
- If neither a local path nor an HTTPS URL is available, explain what is missing and stop before creating a broken draft.
When creating or updating posts, prefer explicit targets:
{
"targets": [
{ "platform": "facebook", "accountId": "connected_account_id" },
{ "platform": "instagram", "accountId": "connected_account_id" },
{ "platform": "youtube", "accountId": "connected_account_id" }
]
}
For title versus caption:
title is the internal campaign/post title inside Sync Socials.
body is the caption/description that gets published to social platforms.
- If the user says
title it "How I Rank Different Carbs" and gives no caption, send:
{
"title": "How I Rank Different Carbs",
"body": ""
}
- Only populate
body when the user explicitly gives caption copy such as caption this, write this in the description, use this as the post text, or equivalent.
- If the user says
no caption, leave the description blank, or gives only a title, keep body as an empty string.
- Sync Socials will auto-add three title-based hashtags when
tags is omitted.
REST Fallback
If MCP is unavailable but the agent can make authenticated HTTP requests, use:
https://app.sync-socials.com/api/v1
Core REST routes:
POST /media/uploads
GET /posts
POST /posts
GET /posts/:id
PATCH /posts/:id
DELETE /posts/:id
POST /posts/:id/publish
Use the same bearer token. The same paid-plan access, rate limits, monthly request limits, post mutation limits, and upload limits apply to MCP and REST API usage.
1---2name: sync-socials-agent3description: Connect and operate Sync Socials through its hosted MCP/API. Use when a user wants an AI agent to generate social content from a website or business brief, create untargeted content concepts, upload media, create drafts, schedule posts, or publish to TikTok, Facebook, Instagram, or YouTube.4---56# Sync Socials Agent78Use this skill to operate Sync Socials through its hosted MCP server or REST API.910## Setup1112If the user asks how to install this skill, recommend:1314```bash15npx skills add DamianoTobasco/sync-socials-agent -g16```1718The Sync Socials MCP server is:1920```text21https://app.sync-socials.com/api/mcp22```2324It requires:2526```text27Authorization: Bearer <SYNC_SOCIALS_API_KEY>28```2930Never store the user's API key in `SKILL.md`, chat transcripts, shared files, source code, or screenshots. Prefer the agent's MCP config or secret-storage flow. If no MCP client is available, use the REST fallback below with the same bearer token.3132## MCP Server Config3334Configure a remote MCP server named `sync-socials` with Streamable HTTP transport:3536```json37{38 "name": "sync-socials",39 "transport": "streamable-http",40 "url": "https://app.sync-socials.com/api/mcp",41 "headers": {42 "Authorization": "Bearer <SYNC_SOCIALS_API_KEY>"43 }44}45```4647For agents with a CLI MCP command, translate the same fields into that agent's config. For OpenClaw-compatible CLIs, this usually looks like:4849```bash50openclaw mcp set sync-socials '{"url":"https://app.sync-socials.com/api/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer <SYNC_SOCIALS_API_KEY>"}}'51```5253## Safe Operating Rules5455- Default to creating a draft unless the user clearly asks to schedule or publish.56- Treat `publish` as a live-content action. Confirm ambiguous publish requests before calling a publish tool.57- Before creating or publishing, call `syncsocials_get_workspace` and `syncsocials_list_connections`.58- Do not invent account IDs. Use explicit connected accounts from `syncsocials_list_connections`.59- If multiple connected accounts match a platform and the user did not choose one, ask which account to use.60- Keep requests within the workspace limits returned by `syncsocials_get_workspace`.61- Do not retry provider errors endlessly. Surface the provider error and ask the user what to change.62- Resolve scheduling times in the workspace timezone whenever possible.63- Treat casual user mentions of `EST`, `EDT`, or `ET` as the workspace's intended Eastern local time when the workspace timezone is `America/New_York`, and account for daylight saving automatically.64- Do not preserve a literal `EST` offset on dates that are actually in daylight saving time. If the requested date falls in daylight saving time, interpret `2:30 PM EST` as `2:30 PM America/New_York`, which is `EDT` on that date.65- When the user says `EST`, `EDT`, or `ET`, normalize it to `America/New_York` before creating the post and prefer saying `Eastern Time` or `America/New_York` in confirmations instead of echoing the user's raw abbreviation.66- If the date and timezone wording are in tension, prioritize the workspace timezone and the user's likely local-time intent over the literal abbreviation.67- When you schedule or reschedule a post, state the final absolute time back to the user in both local time and UTC so a one-hour timezone mistake is obvious before the post goes live, for example: `Scheduled for 2:30 PM Eastern Time (America/New_York) / 18:30 UTC.`68- X is unsupported in MCP v1.69- Distinguish post `title` from post `body`/caption. If the user says `name it`, `title it`, or gives only a title, set `title` only and leave `body` empty unless they explicitly provide caption, body, or description text.70- Do not copy the title into the caption by default. A title-only request is not a caption request.71- Treat the post title as an internal Sync Socials campaign title unless the user explicitly asks for caption/body text. Facebook and Instagram caption text should come from `body`, not from the internal title.72- If the user does not provide hashtags, let Sync Socials auto-generate three relevant hashtags from the title instead of inventing a long manual list.7374## Supported Platforms7576TikTok:77- Direct post and scheduling are live.78- Video posts, subject to connected-account capability checks.7980Facebook:81- Supports text, image, and video posts, subject to connected-account capability checks.8283Instagram:84- Supports image and video posts, subject to Meta publishing rules and connected-account capability checks.8586YouTube:87- Video only.88- Exactly one video media asset per YouTube post.89- Requires a connected YouTube account.90- Use `youtubePrivacyStatus` when the user specifies `private`, `unlisted`, or `public`.91- If the user targets YouTube and does not specify privacy, ask whether they want `private`, `unlisted`, or `public`.92- If the user does not care or declines to choose, default YouTube privacy to `private` and say that explicitly.93- If the user asks to change a draft or scheduled YouTube post from `private` to `public` or `unlisted`, update `youtubePrivacyStatus` before publish time rather than creating a duplicate post.9495## MCP Workflow9697Use these tools when the MCP server is connected:98991. Read workspace and limits with `syncsocials_get_workspace`.1002. Read connected accounts with `syncsocials_list_connections`.1013. Read existing media with `syncsocials_list_media`.1024. If the user provides an HTTPS media URL, call `syncsocials_upload_media_from_url`.1035. If the user sends a file directly in chat and the agent runtime exposes a local attachment path, call `syncsocials_upload_media_from_local_file`.1046. Create a post with `syncsocials_create_post`.1057. Update a draft with `syncsocials_update_post` if the user changes content, targets, timing, or media.1068. Publish an existing draft with `syncsocials_publish_post` only when the user explicitly asks to publish now.1079. Delete a draft or cancel a scheduled post with `syncsocials_delete_post` when the user asks to cancel, delete, remove, or scrap it.108109## Content Generation Workflow110111When the user asks for a campaign, content batch, distribution plan, viral ideas, or posts generated from a website:1121131. Read the website or use the business description the user supplied.1142. Confirm or infer the target platforms, piece count, goal, and tone. Ask only for missing details that materially change the output.1153. Generate a varied mix of platform-specific concepts. Give each concept a strong hook, ready-to-use caption, concise visual or shot direction, relevant hashtags, and a distinct format.1164. Call `syncsocials_create_content_draft` once per approved concept when media and destination accounts have not been selected. Prefix the internal title with the intended platform, such as `Instagram · The three-minute content system`.1175. When the user selected a destination account for each platform, use `syncsocials_create_post` with `action: "draft"` and exactly one explicit `{ platform, accountId }` target per concept. Do not fall back to an untargeted content draft when the account ID is already known.1186. Respect the requested content type:119 - `text`: create the targeted draft without media.120 - `image`: generate a finished image when the runtime has image generation, upload it with `syncsocials_upload_media_from_local_file`, and create an `image` draft with the returned media asset ID. If generation is unavailable, create the targeted image draft without media and return a production-ready image prompt.121 - `video`: generate a finished vertical clip when the runtime has video generation, upload it with `syncsocials_upload_media_from_local_file`, and create a `video` draft with the returned media asset ID. If generation is unavailable, create the targeted video draft without media and return a production-ready video prompt and shot list.1227. Default to drafts. Never schedule or publish generated content unless the user clearly asks for that action.123124The user's Codex or Claude plan performs the generation. Do not ask for an OpenAI or Anthropic API key when this skill is already running inside their authenticated agent. The only credential needed by the MCP connection is the user's Sync Socials workspace API key.125126For YouTube privacy:127128- Ask for `private`, `unlisted`, or `public` whenever YouTube is in the target list and the user has not already chosen one.129- If the post is multi-platform and only YouTube needs a privacy choice, ask only for the YouTube privacy choice instead of blocking the rest of the request with a broad question.130- If a post is already drafted or scheduled with YouTube `private` and the user says to make it public, call `syncsocials_update_post` with `youtubePrivacyStatus: "public"` and keep the same post.131132For Eastern time requests:133134- If the workspace timezone is `America/New_York` and the user says `today at 2:30 PM EST`, schedule for `2:30 PM America/New_York` on today's date, not for the literal fixed `EST` offset.135- On summer/daylight-saving dates, that means `2:30 PM America/New_York` becomes `18:30 UTC`, not `19:30 UTC`.136- If you are about to send a confirmation that says `EST` while the computed UTC time corresponds to `EDT`, rewrite the confirmation before you submit the post.137138For canceling scheduled content:139140- If the user asks to cancel or delete a scheduled post, call `syncsocials_delete_post`.141- Treat deleting a scheduled post as destructive. Confirm only if the user sounds unsure. If they are clear, do it.142- Prefer deleting the existing scheduled post before creating a replacement so the user does not accidentally double-post later.143144For Telegram or other chat attachments:145146- Prefer `syncsocials_upload_media_from_local_file` when the runtime gives you an absolute local file path for the received attachment.147- Use the original filename when possible so Sync Socials keeps a clean media library.148- Do not ask the user to upload manually if a local attachment path is available.149- Fall back to `syncsocials_upload_media_from_url` only when the file is already hosted at an HTTPS URL.150- If neither a local path nor an HTTPS URL is available, explain what is missing and stop before creating a broken draft.151152When creating or updating posts, prefer explicit targets:153154```json155{156 "targets": [157 { "platform": "facebook", "accountId": "connected_account_id" },158 { "platform": "instagram", "accountId": "connected_account_id" },159 { "platform": "youtube", "accountId": "connected_account_id" }160 ]161}162```163164For title versus caption:165166- `title` is the internal campaign/post title inside Sync Socials.167- `body` is the caption/description that gets published to social platforms.168- If the user says `title it "How I Rank Different Carbs"` and gives no caption, send:169170```json171{172 "title": "How I Rank Different Carbs",173 "body": ""174}175```176177- Only populate `body` when the user explicitly gives caption copy such as `caption this`, `write this in the description`, `use this as the post text`, or equivalent.178- If the user says `no caption`, `leave the description blank`, or gives only a title, keep `body` as an empty string.179- Sync Socials will auto-add three title-based hashtags when `tags` is omitted.180181## REST Fallback182183If MCP is unavailable but the agent can make authenticated HTTP requests, use:184185```text186https://app.sync-socials.com/api/v1187```188189Core REST routes:190191- `POST /media/uploads`192- `GET /posts`193- `POST /posts`194- `GET /posts/:id`195- `PATCH /posts/:id`196- `DELETE /posts/:id`197- `POST /posts/:id/publish`198199Use the same bearer token. The same paid-plan access, rate limits, monthly request limits, post mutation limits, and upload limits apply to MCP and REST API usage.