# Sync Socials Agent

> 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.

- Skill: `damianotobasco/sync-socials-agent` (Agent Skill)
- Install (CLI): `npx skillmds@latest add damianotobasco/sync-socials-agent`
- Raw SKILL.md: https://api.skillmd.com/api/skills/damianotobasco/sync-socials-agent/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: DamianoTobasco (https://skillmd.com/u/damianotobasco)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/damianotobasco/sync-socials-agent

---


# 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:

```bash
npx skills add DamianoTobasco/sync-socials-agent -g
```

The Sync Socials MCP server is:

```text
https://app.sync-socials.com/api/mcp
```

It requires:

```text
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:

```json
{
  "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:

```bash
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:

1. Read workspace and limits with `syncsocials_get_workspace`.
2. Read connected accounts with `syncsocials_list_connections`.
3. Read existing media with `syncsocials_list_media`.
4. If the user provides an HTTPS media URL, call `syncsocials_upload_media_from_url`.
5. 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`.
6. Create a post with `syncsocials_create_post`.
7. Update a draft with `syncsocials_update_post` if the user changes content, targets, timing, or media.
8. Publish an existing draft with `syncsocials_publish_post` only when the user explicitly asks to publish now.
9. 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:

1. Read the website or use the business description the user supplied.
2. Confirm or infer the target platforms, piece count, goal, and tone. Ask only for missing details that materially change the output.
3. 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.
4. 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`.
5. 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.
6. 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.
7. 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:

```json
{
  "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:

```json
{
  "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:

```text
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.

