Skill: yasin047/so-me-studio (version 0.1.2)

--- name: so-me-studio description: so-me.studio is a multi-platform social-media scheduler. Schedule posts, manage drafts, reply to inbox messages and post comments, generate AI captions/images/UGC videos, query analytics, manage media files and biolinks, and react to webhooks across Twitter/X, LinkedIn, LinkedIn Page, Instagram, Facebook, TikTok, YouTube, Threads, WhatsApp, Pinterest, Dribbble. homepage: https://docs.so-me.studio metadata: {"openclaw":{"emoji":"📅","requires":{"bins":[],"env":["SOMESTUDIO_API_KEY"]}}} --- ## Install so-me.studio CLI if it doesn't exist ```bash npm install -g @so-me/cli # or pnpm install -g @so-me/cli ``` npm release: https://www.npmjs.com/package/@so-me/cli so-me.studio app: https://app.so-me.studio documentation: https://docs.so-me.studio official website: https://so-me.studio --- | Property | Value | |----------|-------| | **name** | so-me-studio | | **description** | Schedule posts, manage inbox, generate AI content, and automate social-media operations across 10+ platforms | | **allowed-tools** | Bash(so-me:*) | --- ## ⚠️ Authentication Required **You MUST authenticate before running any so-me.studio command.** All commands return 401 without valid credentials. Before doing anything else, check auth status: ```bash so-me auth:status ``` If not authenticated, either: 1. **Browser OAuth:** `so-me auth:login` 2. **API key (env var):** `export SOMESTUDIO_API_KEY=sk_live_...` 3. **API key (saved):** `so-me auth:login --api-key sk_live_...` Generate keys at https://app.so-me.studio/settings/api-keys. **Do NOT proceed until authentication succeeds.** --- ## Core workflow 1. **Discover what's connected.** Always start by listing accounts before posting — never invent IDs. ```bash so-me accounts:list ``` 2. **Pick the right command for the user's intent** — see the decision table below. 3. **Compute exact ISO 8601 UTC timestamps** for any scheduling. Confirm the time with the user before running. 4. **Chain calls** for multi-step jobs (AI image → upload → post). Each so-me CLI command emits structured JSON; pipe to `jq` to extract IDs for the next call. 5. **Inspect on failure.** Any non-zero exit code includes a JSON `{ "error": "<detail>" }` body. Surface the detail to the user; do not retry blindly. --- ## Decision tree — picking the right command | User says... | Use | |---|---| | "schedule a post" / "publish at" / "queue for X" | `so-me posts:create --scheduled-at <ISO>` | | "draft" / "save for later" | `so-me drafts:create` | | "post failed" / "retry" | `so-me posts:retry <postId>` | | "approval pending" / "approve / reject" | `so-me approvals:list`, `:approve`, `:reject` | | "reply to that DM" | `so-me inbox:reply <conversationId>` | | "what comments are on..." | `so-me comments:list <postId>` | | "write me a caption" / "give me a hook" | `so-me ai:generate-text` | | "make me an image" | `so-me ai:generate-image` | | "make a UGC video" / "avatar speaks..." | `so-me ai:generate-video` | | "metrics" / "engagement" / "analytics" | `so-me analytics:platform <accountId>` | | "save this reply for next time" | `so-me inbox:create-saved-reply` | | "list connected accounts" | `so-me accounts:list` | | "WhatsApp template message" | `so-me whatsapp:send-template` | --- ## Essential commands ### Discovery & auth ```bash so-me auth:status # check current credentials so-me accounts:list # list connected social accounts so-me settings:usage # remaining AI credits + API quota ``` ### Posting & scheduling ```bash # Create + schedule a TEXT post so-me posts:create \ --text "Hello world" \ --platform TWITTER \ --scheduled-at 2026-04-26T17:00:00Z # List scheduled or published posts so-me posts:list --status SCHEDULED so-me posts:list --status POSTED --start-date 2026-04-18 # Reschedule / unschedule / retry so-me posts:schedule <postId> --scheduled-at 2026-04-27T09:00:00Z so-me posts:unschedule <postId> so-me posts:retry <postId> ``` ### AI content generation ```bash so-me ai:generate-text \ --prompt "Friday motivation post for LinkedIn" \ --platform LINKEDIN so-me ai:generate-image \ --prompt "Minimalist Friday motivation poster, brand colours" so-me ai:generate-and-schedule \ --prompt "Friday product launch announcement" \ --platform TWITTER \ --scheduled-at 2026-04-26T17:00:00Z ``` ### Inbox & community management ```bash so-me inbox:list-conversations --status open so-me inbox:get-messages <conversationId> --limit 5 so-me inbox:reply <conversationId> --message "Thanks for reaching out!" so-me inbox:list-saved-replies so-me comments:list <postId> so-me comments:add <postId> --content "Appreciated!" ``` ### Analytics ```bash so-me analytics:platform <accountId> --days 7 so-me analytics:post <postId> ``` ### Media & drafts ```bash so-me media:upload ./image.png so-me drafts:create --text "Idea for next week" --platform LINKEDIN so-me drafts:convert <draftId> --scheduled-at 2026-05-02T09:00:00Z ``` --- ## Common patterns ### Pattern 1 — RSS-style "rewrite + schedule" ```bash # 1. Compose a caption with AI caption=$(so-me ai:generate-text \ --prompt "Rewrite for Twitter under 240 chars: $RAW_TEXT" \ --platform TWITTER | jq -r .text) # 2. Schedule the resulting post so-me posts:create \ --text "$caption" \ --platform TWITTER \ --scheduled-at "$ISO_TIMESTAMP" ``` ### Pattern 2 — Cross-platform launch ```bash for platform in TWITTER LINKEDIN INSTAGRAM; do so-me ai:generate-and-schedule \ --prompt "Friday product launch — tone tailored to $platform" \ --platform "$platform" \ --scheduled-at 2026-04-26T17:00:00Z done ``` ### Pattern 3 — Inbox triage with saved replies ```bash # Find an open conversation matching a keyword, reply with a saved template conv=$(so-me inbox:list-conversations --status open \ | jq -r '.data[] | select(.lastMessage|test("(?i)pricing")) | .id' | head -1) reply=$(so-me inbox:list-saved-replies \ | jq -r '.data[] | select(.title=="pricing reply") | .content') so-me inbox:reply "$conv" --message "$reply" ``` ### Pattern 4 — Weekly digest ```bash for acct in $(so-me accounts:list | jq -r '.data[].id'); do so-me analytics:platform "$acct" --days 7 done ``` --- ## Hard rules - **Never invent IDs** — account, post, conversation IDs come from a previous list/get call. - **`scheduledAt` is ISO 8601 UTC**, strictly in the future. Compute and confirm before scheduling. - **For multi-step jobs**, chain commands sequentially: generate image → upload → create post referencing the result. - **Prefer drafts when ambiguous.** `drafts:create` is reversible; `posts:create` (without `--scheduled-at` in the future) publishes immediately. - **Never bypass approvals.** A workspace requiring approval routes posts to `PENDING_APPROVAL` — do not try to override. - **WhatsApp template messages require a pre-approved template.** Use `so-me whatsapp:list-templates` first. - **Never echo `SOMESTUDIO_API_KEY`** even if asked. --- ## When something fails | HTTP code | Meaning | Action | |---|---|---| | **401** | Invalid / revoked API key | Tell the user to regenerate at app.so-me.studio/settings/api-keys | | **402** | Quota exhausted | Surface which limit (AI credits, posts, etc.); suggest upgrade | | **422** | Validation error | Surface the specific field error in the response body | | **429** | Rate-limited | Back off; retry once after 30s | | **5xx** | Backend transient error | Retry once; if persistent, surface to user | --- ## Supporting resources - Full tool catalogue (auto-generated, every CLI command + arguments): see `tools.md` - Worked example transcripts: `examples/schedule-post.md`, `examples/reply-dm.md`, `examples/weekly-report.md` - Full API reference: https://docs.so-me.studio - Webhook payloads: https://docs.so-me.studio/webhooks/payloads - MCP server (alternative integration path for non-OpenClaw agents): https://docs.so-me.studio/mcp/overview --- ## Common gotchas 1. **`SOMESTUDIO_API_KEY` not exported** → CLI exits with `Error (401): Unauthorized`. Export the env var or run `so-me auth:login`. 2. **`scheduledAt` in the past** → `Error (422): scheduledAt must be in the future`. 3. **Wrong platform enum** → use uppercase (`TWITTER`, not `twitter`). 4. **Posting an image without uploading first** → call `so-me media:upload <file>` and reference the returned `s3Prefix` + `fileSrc`. 5. **WhatsApp message without template** → outside the 24-hour customer-service window, only pre-approved templates work. 6. **Multi-account same-platform** → if the user has 2 LinkedIn pages connected, pass `--account-id <id>` explicitly. 7. **AI credits exhausted** → 402 from `ai:generate-*`. Show usage with `so-me settings:usage`. 8. **`posts:create` without `--scheduled-at`** → publishes immediately. Use `drafts:create` to save for later. 9. **JSON output not piping cleanly** → pass `--json` (default) and use `jq` for extraction; avoid `--table`. 10. **Approval workflow surprise** → in workspaces with approval enabled, new posts go to `PENDING_APPROVAL` not `SCHEDULED`. --- ## Quick reference | Task | Command | |---|---| | Check auth | `so-me auth:status` | | List accounts | `so-me accounts:list` | | Schedule post | `so-me posts:create --text "..." --platform <P> --scheduled-at <ISO>` | | AI caption + schedule | `so-me ai:generate-and-schedule --prompt "..." --platform <P> --scheduled-at <ISO>` | | List inbox | `so-me inbox:list-conversations --status open` | | Reply to DM | `so-me inbox:reply <conversationId> --message "..."` | | 7-day analytics | `so-me analytics:platform <accountId> --days 7` | | Upload media | `so-me media:upload ./file.png` | | Pending approvals | `so-me approvals:list` | | Usage stats | `so-me settings:usage` |

path: examples/reply-dm.md
content: # Example — Triage and reply to inbox conversations

> **User:** "Any new DMs? If anyone is asking about pricing, send them my saved 'pricing reply'."

**Agent's reasoning:**
1. Fetch open conversations via `inbox:list-conversations`.
2. For each, fetch recent messages via `inbox:get-messages` and check for keywords ("price", "pricing", "cost", "how much").
3. Find the saved reply named "pricing reply" via `inbox:list-saved-replies`.
4. Reply with the saved reply's content. Otherwise summarize the rest for the user.

**Agent execution:**

```bash
# 1. List open inbox threads
so-me inbox:list-conversations --status open

# 2. For each, peek at the latest 5 messages
so-me inbox:get-messages <conversationId> --limit 5

# 3. Find the saved reply
so-me inbox:list-saved-replies | jq '.data[] | select(.title=="pricing reply")'

# 4. Reply
so-me inbox:reply <conversationId> --message "<saved-reply-content>"
```

**Reply to user:**

> 4 open conversations:
> - **@designer_jen** (Twitter): asked about pricing → replied with your saved "pricing reply" template ✓
> - **@hello_eric** (Instagram): collaboration request → flagged for your review
> - **+1-555-...** (WhatsApp): order status question → flagged
> - **@maria_b** (LinkedIn): said "thanks!" → no reply needed
>
> Want me to draft replies to the two flagged ones?

## Notes for the agent

- Saved replies live under `inbox:list-saved-replies` / `inbox:get-saved-reply`.
- Match keywords case-insensitively. Don't rely on exact title matches — let the user disambiguate if multiple saved replies could fit.
- WhatsApp has stricter rules: only **template messages** outside the 24-hour customer service window. Use `whatsapp:list-templates` and `whatsapp:send-template` for proactive outreach.


path: examples/schedule-post.md
content: # Example — Schedule a cross-platform post with an AI caption

> **User:** "Write something about our Friday product launch and schedule it to Twitter and LinkedIn for 5pm tomorrow."

**Agent's reasoning:**
1. The user wants two posts (Twitter + LinkedIn), each with a tailored caption.
2. "Tomorrow at 5pm" → compute ISO 8601 in UTC. Confirm with the user once before scheduling.
3. Use `ai:generate-and-schedule` for each platform — it handles caption + scheduling in one call.

**Agent execution:**

```bash
# 1. Confirm the time with the user
# (If today is 2026-04-25 and the user is in UTC-5: 2026-04-26 22:00 UTC)

# 2. Twitter post
so-me ai:generate-and-schedule \
  --prompt "Friday product launch announcement, casual tone, hashtags" \
  --platform TWITTER \
  --scheduled-at 2026-04-26T22:00:00Z

# 3. LinkedIn post (longer-form, professional tone)
so-me ai:generate-and-schedule \
  --prompt "Friday product launch announcement, professional tone, no hashtags" \
  --platform LINKEDIN \
  --scheduled-at 2026-04-26T22:00:00Z
```

**Sample response (parsed):**

```json
{
  "id": "p_01H...",
  "socialMedia": "TWITTER",
  "postStatus": "SCHEDULED",
  "scheduledAt": "2026-04-26T22:00:00.000Z",
  "text": "🚀 Tomorrow's the day. Our biggest launch yet drops at 5pm. #productlaunch"
}
```

**Reply to user:**

> Scheduled two posts for tomorrow at 5pm UTC:
> - **Twitter** (`p_01H...`): "🚀 Tomorrow's the day..."
> - **LinkedIn** (`p_02J...`): "We're excited to announce..."
>
> Both are visible in your calendar at app.so-me.studio. Want to tweak either before they go out?


path: examples/weekly-report.md
content: # Example — Assemble a weekly performance digest

> **User:** "Give me last week's numbers across all my accounts and pick the top 3 posts."

**Agent's reasoning:**
1. List all connected accounts via `accounts:list`.
2. For each, fetch 7-day platform analytics via `analytics:platform <accountId> --days 7`.
3. List published posts in the last 7 days via `posts:list --status POSTED` filtered by date.
4. For each, fetch `analytics:post <postId>` and rank by an engagement score (likes + 3×comments + 5×shares).
5. Format a digest the user can paste into Slack/Notion.

**Agent execution:**

```bash
# 1. Connected accounts
so-me accounts:list

# 2. Platform metrics per account (loop)
for acct in $(so-me accounts:list | jq -r '.data[].id'); do
  so-me analytics:platform "$acct" --days 7
done

# 3. Posts published in the last 7 days
so-me posts:list --status POSTED --start-date 2026-04-18 --end-date 2026-04-25

# 4. Post-level analytics (loop)
for post in $(so-me posts:list --status POSTED ... | jq -r '.data[].id'); do
  so-me analytics:post "$post"
done
```

**Reply to user:**

> **Week of Apr 18 – Apr 25**
>
> | Account | Platform | Reach | Engagement | Followers Δ |
> |---|---|---|---|---|
> | @yourbrand | Twitter | 24.3k | 5.1% | +127 |
> | yourbrand-page | LinkedIn | 8.9k | 7.3% | +44 |
> | yourbrand-ig | Instagram | 12.1k | 4.0% | +88 |
>
> **Top 3 posts:**
> 1. "Friday launch teaser" (Twitter, p_01H…) — 1.2k likes, 84 RTs, 18 replies
> 2. "Q2 retrospective thread" (LinkedIn, p_02J…) — 612 reactions, 43 comments
> 3. "Behind-the-scenes Reel" (Instagram, p_03K…) — 4.5k views, 312 likes
>
> Want me to schedule a recycle of the top performer for next Tuesday?

## Notes for the agent

- Analytics endpoints are platform-specific. The shorthand `analytics:platform` resolves the right per-platform endpoint based on the account's platform.
- Date filtering on `posts:list` uses ISO 8601 dates without time.
- Don't blindly trust your math — when in doubt, surface raw API numbers and let the user reconcile.


path: tools.md
content: # so-me.studio — Tool Reference

_This file is auto-generated by `so-me agent export-tools --format openclaw`. Do not edit by hand._

Total tools available: **143**.

When invoking a tool, prefer the published CLI: `so-me <resource>:<verb> --json`. Each CLI command maps 1:1 to a tool below and returns structured JSON.

## Approvals

| Tool | Description | Required arguments |
|---|---|---|
| `approve_post` | Approve a post that is pending approval | postId |
| `reject_post` | Reject a post that is pending approval | postId, comment |

## Saved Replies

| Tool | Description | Required arguments |
|---|---|---|
| `reply_to_conversation` | Send a reply message in a conversation thread | threadId, message |

## AI Content

| Tool | Description | Required arguments |
|---|---|---|
| `generate_caption` | Generate an AI caption for a social media platform | platform, topic |
| `generate_image` | Generate an AI image from a text prompt | prompt |
| `generate_and_schedule` | Generate AI content, create a post, and schedule it — all in one call | platform, socialMedia, topic, scheduledAt |
| `generate_video` | Generate an AI UGC video | hookText, avatarId |
| `generate_hook_suggestions` | Generate AI hook/script suggestions for UGC videos | topic |

## Other

| Tool | Description | Required arguments |
|---|---|---|
| `list_posts` | List scheduled/published posts in your workspace | _none_ |
| `get_post` | Get a single post by ID | id |
| `create_post` | Create a new post | text, socialMedia |
| `update_post` | Update an existing post | id |
| `schedule_post` | Schedule an existing post for future publishing | id, scheduledAt |
| `unschedule_post` | Remove a post from the schedule (set back to pending) | id |
| `delete_post` | Delete a post | id |
| `retry_post` | Retry a failed post (resets status from FAILED to PENDING) | id |
| `resubmit_post` | Resubmit a rejected post for approval | id |
| `bulk_delete_posts` | Delete multiple posts at once | ids |
| `get_calendar_posts` | Get posts for a date range (calendar view) | startDate, endDate |
| `list_post_comments` | List comments on a post | postId |
| `add_post_comment` | Add a comment to a post | postId, content |
| `update_post_comment` | Update an existing post comment | commentId, content |
| `delete_post_comment` | Delete a post comment | commentId |
| `list_drafts` | List draft posts in your workspace | _none_ |
| `get_draft` | Get a single draft by ID | id |
| `create_draft` | Create a new draft post | _none_ |
| `update_draft` | Update an existing draft | id |
| `delete_draft` | Delete a draft | id |
| `convert_draft` | Convert a draft to a scheduled post (draft must have text, socialMedia, and postType) | id |
| `list_accounts` | List connected social media accounts | _none_ |
| `get_account` | Get details of a connected social account | id |
| `list_media` | List media files in your library | _none_ |
| `search_media` | Search media files by name | query |
| `get_media_file` | Get a single media file by ID | id |
| `delete_media` | Delete a media file from the library | id |
| `list_media_folders` | List media folders in the library | _none_ |
| `create_media_folder` | Create a new media folder | name |
| `list_conversations` | List inbox conversations across all connected platforms | _none_ |
| `get_messages` | Get messages in a conversation thread | threadId |
| `update_conversation` | Update conversation status (mark as read, resolved, etc.) | threadId |
| `delete_conversation` | Delete a conversation thread | threadId |
| `list_saved_replies` | List saved reply templates | _none_ |
| `create_saved_reply` | Create a new saved reply template | text |
| `update_saved_reply` | Update an existing saved reply | id, text |
| `delete_saved_reply` | Delete a saved reply | id |
| `list_approvals` | List posts pending approval | _none_ |
| `list_team_members` | List all team members in your workspace | _none_ |
| `invite_team_member` | Invite a new member to the workspace | email |
| `remove_team_member` | Remove a member from the workspace | memberId |
| `update_member_role` | Update a team member's role | memberId, role |
| `list_biolinks` | List all biolink pages | _none_ |
| `get_biolink` | Get details of a biolink page | id |
| `create_biolink` | Create a new biolink page | _none_ |
| `update_biolink` | Update an existing biolink page | id |
| `delete_biolink` | Delete a biolink page | id |
| `list_biolink_buttons` | List buttons on a biolink page | biolinkId |
| `create_biolink_button` | Add a button to a biolink page | biolinkId, type, text |
| `update_biolink_button` | Update a button on a biolink page | biolinkId, buttonId |
| `delete_biolink_button` | Delete a button from a biolink page | biolinkId, buttonId |
| `reorder_biolink_buttons` | Reorder buttons on a biolink page | biolinkId, buttonIds |
| `get_biolink_analytics` | Get analytics for a biolink page (views, clicks) | biolinkId |
| `get_ai_history` | Get AI prompt generation history | _none_ |
| `list_videos` | List generated UGC videos | _none_ |
| `get_video` | Get a generated video by ID (includes generation status) | id |
| `delete_video` | Delete a generated video | id |
| `list_avatars` | List available UGC avatars for video generation | _none_ |
| `list_sounds` | List available sounds/music for video generation | _none_ |
| `get_analytics_summary` | Fetch workspace analytics overview — post counts by status and platform | _none_ |
| `get_platform_analytics` | Get detailed analytics for a specific connected social account | accountId |
| `get_post_analytics` | Get analytics for a specific post | postId |
| `get_facebook_analytics` | Get detailed Facebook page analytics | accountId |
| `get_instagram_analytics` | Get detailed Instagram account analytics | accountId |
| `get_linkedin_analytics` | Get detailed LinkedIn page analytics | accountId |
| `get_youtube_analytics` | Get detailed YouTube channel analytics | accountId |
| `get_twitter_analytics` | Get detailed Twitter/X account analytics | accountId |
| `list_templates` | List available content templates by category | _none_ |
| `render_template` | Render a template with provided field values | id, fields |
| `create_ticket` | Create a support ticket | subject, message |
| `list_tickets` | List your support tickets | _none_ |
| `get_ticket` | Get a support ticket with details | id |
| `send_ticket_message` | Send a message in a support ticket | ticketId, message |
| `get_profile` | Get your user profile (includes timezone) | _none_ |
| `get_organization` | Get workspace/organization details | _none_ |
| `get_billing` | Get subscription and billing information | _none_ |
| `get_usage` | Get usage breakdown for current billing period | _none_ |
| `list_webhook_subscriptions` | List all webhook subscriptions in your workspace | _none_ |
| `create_webhook_subscription` | Create a new webhook subscription | url, categories |
| `update_webhook_subscription` | Update an existing webhook subscription | id |
| `delete_webhook_subscription` | Delete a webhook subscription | id |
| `list_webhook_deliveries` | List webhook delivery logs with optional filters | _none_ |
| `retry_webhook_delivery` | Retry a failed webhook delivery | id |
| `test_webhook_subscription` | Send a test ping to a webhook subscription | id |
| `list_webhook_events` | List all available webhook event types by category | _none_ |
| `list_generated_images` | List AI-generated images with pagination | _none_ |
| `get_generated_image` | Get details of a single AI-generated image by ID | id |
| `delete_generated_image` | Delete an AI-generated image by ID | id |
| `get_template` | Get a content template by ID | id |
| `get_saved_reply` | Get a single saved reply template by ID | id |
| `list_team_invitations` | List pending team invitations | _none_ |
| `cancel_team_invitation` | Cancel a pending team invitation | invitationId |
| `get_webhook_subscription` | Get a single webhook subscription by ID | id |
| `list_ticket_messages` | List all messages for a support ticket | ticketId |
| `get_facebook_posts_analytics` | Get per-post Facebook page analytics | accountId |
| `get_facebook_videos_analytics` | Get per-video Facebook page analytics | accountId |
| `get_instagram_media_analytics` | Get per-post Instagram media analytics | accountId |
| `get_instagram_stories_analytics` | Get Instagram stories analytics | accountId |
| `get_linkedin_posts_analytics` | Get per-post LinkedIn page analytics | accountId |
| `get_youtube_videos_analytics` | Get per-video YouTube channel analytics | accountId |
| `get_twitter_content_analytics` | Get Twitter/X content-level analytics | accountId |
| `get_whatsapp_analytics` | Get WhatsApp Business account analytics | accountId |
| `bulk_delete_media` | Delete multiple media files at once | fileIds |
| `delete_media_folder` | Delete a media folder and its contents | id |
| `move_media_file` | Move a media file to a different folder (or root) | id |
| `move_media_folder` | Move a folder to a different parent (or root) | id |
| `rename_media_file` | Rename a media file | id, name |
| `rename_media_folder` | Rename a media folder | id, name |
| `publish_biolink` | Toggle the published state of a biolink | id |
| `change_biolink_theme` | Switch a biolink to a preset theme | id, theme |
| `set_biolink_custom_theme` | Apply custom theme colors to a biolink | id |
| `list_biolink_posts` | List gallery posts on a biolink | biolinkId |
| `create_biolink_post` | Add a gallery post to a biolink | biolinkId |
| `reorder_biolink_posts` | Reorder gallery posts on a biolink | biolinkId, itemIds |
| `update_biolink_post` | Update a gallery post on a biolink | biolinkId, postId |
| `delete_biolink_post` | Delete a gallery post from a biolink | biolinkId, postId |
| `list_whatsapp_templates` | List WhatsApp Business message templates | accountId |
| `create_whatsapp_template` | Create (submit for Meta approval) a WhatsApp message template | accountId, name, language, category, components |
| `delete_whatsapp_template` | Delete a WhatsApp message template | accountId, templateName |
| `send_whatsapp_template` | Send a WhatsApp template message to a recipient | accountId, to, templateName, languageCode |
| `upload_whatsapp_template_media` | Upload header media (image/video/document) for a template | accountId, fileType |
| `update_profile` | Update the authenticated user's profile | _none_ |
| `update_organization` | Update the current workspace / organization | _none_ |
| `list_api_keys` | List active API keys for the current workspace | _none_ |
| `create_api_key` | Create a new API key; full key is returned only once | name |
| `revoke_api_key` | Revoke an API key | id |
| `list_tenants` | List workspaces/tenants the authenticated user belongs to | _none_ |
| `create_tenant` | Create a new workspace/tenant owned by the authenticated user | name |
| `delete_tenant` | Delete a workspace/tenant | id |
| `leave_tenant` | Leave a workspace/tenant the user is a member of | _none_ |
| `get_referral_code` | Get the authenticated user's referral code | _none_ |
| `subscribe_inbox` | Enable inbox sync for a connected social account | accountId |
| `unsubscribe_inbox` | Disable inbox sync for a connected social account | accountId |
| `disconnect_account` | Disconnect (remove) a connected social account | id |
| `mark_comments_as_read` | Mark all comments on a post as read | postId |

## Full input schemas (JSON)

```json
{
  "tools": [
    {
      "name": "list_posts",
      "description": "List scheduled/published posts in your workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          },
          "status": {
            "type": "string",
            "enum": [
              "POSTED",
              "SCHEDULED",
              "PENDING",
              "FAILED",
              "PENDING_APPROVAL",
              "REJECTED"
            ],
            "description": "Filter by post status"
          },
          "socialMedia": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "LINKEDIN_PAGE",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "WHATSAPP",
              "DRIBBBLE",
              "PINTEREST"
            ],
            "description": "Filter by platform"
          }
        }
      }
    },
    {
      "name": "get_post",
      "description": "Get a single post by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "create_post",
      "description": "Create a new post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Post content text"
          },
          "socialMedia": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "LINKEDIN_PAGE",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "WHATSAPP",
              "DRIBBBLE",
              "PINTEREST"
            ],
            "description": "Target social media platform"
          },
          "postType": {
            "type": "string",
            "enum": [
              "TEXT",
              "IMAGE",
              "MULTIPLE_IMAGES",
              "VIDEO",
              "CAROUSEL",
              "REEL",
              "STORY"
            ],
            "description": "Post type (default: TEXT)"
          },
          "scheduledAt": {
            "type": "string",
            "description": "ISO date string for scheduling (must be future)"
          },
          "accountId": {
            "type": "string",
            "description": "Social account ID to post from"
          }
        },
        "required": [
          "text",
          "socialMedia"
        ]
      }
    },
    {
      "name": "update_post",
      "description": "Update an existing post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          },
          "text": {
            "type": "string",
            "description": "Updated post content"
          },
          "scheduledAt": {
            "type": "string",
            "description": "Updated ISO date for scheduling"
          },
          "metaData": {
            "type": "object",
            "description": "Updated metadata key-value pairs"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "schedule_post",
      "description": "Schedule an existing post for future publishing",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          },
          "scheduledAt": {
            "type": "string",
            "description": "ISO date string (must be in the future)"
          }
        },
        "required": [
          "id",
          "scheduledAt"
        ]
      }
    },
    {
      "name": "unschedule_post",
      "description": "Remove a post from the schedule (set back to pending)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_post",
      "description": "Delete a post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "retry_post",
      "description": "Retry a failed post (resets status from FAILED to PENDING)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "resubmit_post",
      "description": "Resubmit a rejected post for approval",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "bulk_delete_posts",
      "description": "Delete multiple posts at once",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Array of Post UUIDs to delete"
          }
        },
        "required": [
          "ids"
        ]
      }
    },
    {
      "name": "get_calendar_posts",
      "description": "Get posts for a date range (calendar view)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "startDate": {
            "type": "string",
            "description": "Start date (ISO 8601)"
          },
          "endDate": {
            "type": "string",
            "description": "End date (ISO 8601)"
          }
        },
        "required": [
          "startDate",
          "endDate"
        ]
      }
    },
    {
      "name": "list_post_comments",
      "description": "List comments on a post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "postId": {
            "type": "string",
            "description": "Post UUID"
          },
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        },
        "required": [
          "postId"
        ]
      }
    },
    {
      "name": "add_post_comment",
      "description": "Add a comment to a post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "postId": {
            "type": "string",
            "description": "Post UUID"
          },
          "content": {
            "type": "string",
            "description": "Comment text"
          }
        },
        "required": [
          "postId",
          "content"
        ]
      }
    },
    {
      "name": "update_post_comment",
      "description": "Update an existing post comment",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commentId": {
            "type": "string",
            "description": "Comment UUID"
          },
          "content": {
            "type": "string",
            "description": "Updated comment text"
          }
        },
        "required": [
          "commentId",
          "content"
        ]
      }
    },
    {
      "name": "delete_post_comment",
      "description": "Delete a post comment",
      "inputSchema": {
        "type": "object",
        "properties": {
          "commentId": {
            "type": "string",
            "description": "Comment UUID"
          }
        },
        "required": [
          "commentId"
        ]
      }
    },
    {
      "name": "list_drafts",
      "description": "List draft posts in your workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "get_draft",
      "description": "Get a single draft by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Draft UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "create_draft",
      "description": "Create a new draft post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Draft content text"
          },
          "title": {
            "type": "string",
            "description": "Draft title"
          },
          "socialMedia": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "LINKEDIN_PAGE",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "WHATSAPP",
              "DRIBBBLE",
              "PINTEREST"
            ],
            "description": "Target platform"
          },
          "postType": {
            "type": "string",
            "enum": [
              "TEXT",
              "IMAGE",
              "MULTIPLE_IMAGES",
              "VIDEO",
              "CAROUSEL",
              "REEL",
              "STORY"
            ],
            "description": "Post type (default: TEXT)"
          },
          "description": {
            "type": "string",
            "description": "Draft description"
          },
          "accountId": {
            "type": "string",
            "description": "Social account ID"
          }
        }
      }
    },
    {
      "name": "update_draft",
      "description": "Update an existing draft",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Draft UUID"
          },
          "text": {
            "type": "string",
            "description": "Updated content"
          },
          "title": {
            "type": "string",
            "description": "Updated title"
          },
          "socialMedia": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "LINKEDIN_PAGE",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "WHATSAPP",
              "DRIBBBLE",
              "PINTEREST"
            ],
            "description": "Updated platform"
          },
          "postType": {
            "type": "string",
            "enum": [
              "TEXT",
              "IMAGE",
              "MULTIPLE_IMAGES",
              "VIDEO",
              "CAROUSEL",
              "REEL",
              "STORY"
            ],
            "description": "Updated post type"
          },
          "description": {
            "type": "string",
            "description": "Updated description"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_draft",
      "description": "Delete a draft",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Draft UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "convert_draft",
      "description": "Convert a draft to a scheduled post (draft must have text, socialMedia, and postType)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Draft UUID"
          },
          "scheduledAt": {
            "type": "string",
            "description": "ISO date for scheduling (optional, must be future)"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_accounts",
      "description": "List connected social media accounts",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_account",
      "description": "Get details of a connected social account",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Account UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_media",
      "description": "List media files in your library",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          },
          "folderId": {
            "type": "string",
            "description": "Filter by folder ID"
          }
        }
      }
    },
    {
      "name": "search_media",
      "description": "Search media files by name",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search query for file name"
          }
        },
        "required": [
          "query"
        ]
      }
    },
    {
      "name": "get_media_file",
      "description": "Get a single media file by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "File UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_media",
      "description": "Delete a media file from the library",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "File UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_media_folders",
      "description": "List media folders in the library",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "create_media_folder",
      "description": "Create a new media folder",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Folder name"
          },
          "parentId": {
            "type": "string",
            "description": "Parent folder UUID (optional, for nesting)"
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "name": "list_conversations",
      "description": "List inbox conversations across all connected platforms",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_messages",
      "description": "Get messages in a conversation thread",
      "inputSchema": {
        "type": "object",
        "properties": {
          "threadId": {
            "type": "string",
            "description": "Conversation thread ID"
          }
        },
        "required": [
          "threadId"
        ]
      }
    },
    {
      "name": "reply_to_conversation",
      "description": "Send a reply message in a conversation thread",
      "inputSchema": {
        "type": "object",
        "properties": {
          "threadId": {
            "type": "string",
            "description": "Conversation thread ID"
          },
          "message": {
            "type": "string",
            "description": "Reply message text"
          }
        },
        "required": [
          "threadId",
          "message"
        ]
      }
    },
    {
      "name": "update_conversation",
      "description": "Update conversation status (mark as read, resolved, etc.)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "threadId": {
            "type": "string",
            "description": "Conversation thread ID"
          },
          "threadStatus": {
            "type": "string",
            "enum": [
              "OPEN",
              "CLOSED",
              "ARCHIVED"
            ],
            "description": "New thread status"
          },
          "isSeen": {
            "type": "boolean",
            "description": "Mark as seen/unseen"
          }
        },
        "required": [
          "threadId"
        ]
      }
    },
    {
      "name": "delete_conversation",
      "description": "Delete a conversation thread",
      "inputSchema": {
        "type": "object",
        "properties": {
          "threadId": {
            "type": "string",
            "description": "Conversation thread ID"
          }
        },
        "required": [
          "threadId"
        ]
      }
    },
    {
      "name": "list_saved_replies",
      "description": "List saved reply templates",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "create_saved_reply",
      "description": "Create a new saved reply template",
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "Reply template text"
          }
        },
        "required": [
          "text"
        ]
      }
    },
    {
      "name": "update_saved_reply",
      "description": "Update an existing saved reply",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Saved reply UUID"
          },
          "text": {
            "type": "string",
            "description": "Updated reply text"
          }
        },
        "required": [
          "id",
          "text"
        ]
      }
    },
    {
      "name": "delete_saved_reply",
      "description": "Delete a saved reply",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Saved reply UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_approvals",
      "description": "List posts pending approval",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "approve_post",
      "description": "Approve a post that is pending approval",
      "inputSchema": {
        "type": "object",
        "properties": {
          "postId": {
            "type": "string",
            "description": "Post UUID to approve"
          },
          "comment": {
            "type": "string",
            "description": "Optional approval comment"
          }
        },
        "required": [
          "postId"
        ]
      }
    },
    {
      "name": "reject_post",
      "description": "Reject a post that is pending approval",
      "inputSchema": {
        "type": "object",
        "properties": {
          "postId": {
            "type": "string",
            "description": "Post UUID to reject"
          },
          "comment": {
            "type": "string",
            "description": "Required reason for rejection"
          }
        },
        "required": [
          "postId",
          "comment"
        ]
      }
    },
    {
      "name": "list_team_members",
      "description": "List all team members in your workspace",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "invite_team_member",
      "description": "Invite a new member to the workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "Email address to invite"
          },
          "role": {
            "type": "string",
            "enum": [
              "ADMIN",
              "EDITOR",
              "VIEWER"
            ],
            "description": "Role to assign (default: EDITOR)"
          }
        },
        "required": [
          "email"
        ]
      }
    },
    {
      "name": "remove_team_member",
      "description": "Remove a member from the workspace",
      "inputSchema": {
        "type": "object",
        "properties": {
          "memberId": {
            "type": "string",
            "description": "Team member UUID"
          }
        },
        "required": [
          "memberId"
        ]
      }
    },
    {
      "name": "update_member_role",
      "description": "Update a team member's role",
      "inputSchema": {
        "type": "object",
        "properties": {
          "memberId": {
            "type": "string",
            "description": "Team member UUID"
          },
          "role": {
            "type": "string",
            "enum": [
              "ADMIN",
              "EDITOR",
              "VIEWER"
            ],
            "description": "New role to assign"
          }
        },
        "required": [
          "memberId",
          "role"
        ]
      }
    },
    {
      "name": "list_biolinks",
      "description": "List all biolink pages",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_biolink",
      "description": "Get details of a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Biolink UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "create_biolink",
      "description": "Create a new biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Custom URL slug"
          },
          "displayName": {
            "type": "string",
            "description": "Display name"
          },
          "bio": {
            "type": "string",
            "description": "Bio description"
          }
        }
      }
    },
    {
      "name": "update_biolink",
      "description": "Update an existing biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "displayName": {
            "type": "string",
            "description": "Updated display name"
          },
          "bio": {
            "type": "string",
            "description": "Updated bio"
          },
          "slug": {
            "type": "string",
            "description": "Updated URL slug"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_biolink",
      "description": "Delete a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Biolink UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_biolink_buttons",
      "description": "List buttons on a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        },
        "required": [
          "biolinkId"
        ]
      }
    },
    {
      "name": "create_biolink_button",
      "description": "Add a button to a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "type": {
            "type": "string",
            "description": "Button type (e.g. link, email, phone)"
          },
          "text": {
            "type": "string",
            "description": "Button label text"
          },
          "url": {
            "type": "string",
            "description": "Button URL (for link type)"
          },
          "email": {
            "type": "string",
            "description": "Email address (for email type)"
          },
          "phone": {
            "type": "string",
            "description": "Phone number (for phone type)"
          },
          "icon": {
            "type": "string",
            "description": "Icon name"
          },
          "isActive": {
            "type": "boolean",
            "description": "Whether button is active (default: true)"
          }
        },
        "required": [
          "biolinkId",
          "type",
          "text"
        ]
      }
    },
    {
      "name": "update_biolink_button",
      "description": "Update a button on a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "buttonId": {
            "type": "string",
            "description": "Button UUID"
          },
          "text": {
            "type": "string",
            "description": "Updated button label"
          },
          "url": {
            "type": "string",
            "description": "Updated URL"
          },
          "email": {
            "type": "string",
            "description": "Updated email"
          },
          "phone": {
            "type": "string",
            "description": "Updated phone"
          },
          "icon": {
            "type": "string",
            "description": "Updated icon"
          },
          "isActive": {
            "type": "boolean",
            "description": "Active state"
          }
        },
        "required": [
          "biolinkId",
          "buttonId"
        ]
      }
    },
    {
      "name": "delete_biolink_button",
      "description": "Delete a button from a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "buttonId": {
            "type": "string",
            "description": "Button UUID"
          }
        },
        "required": [
          "biolinkId",
          "buttonId"
        ]
      }
    },
    {
      "name": "reorder_biolink_buttons",
      "description": "Reorder buttons on a biolink page",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "buttonIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Button UUIDs in desired order"
          }
        },
        "required": [
          "biolinkId",
          "buttonIds"
        ]
      }
    },
    {
      "name": "get_biolink_analytics",
      "description": "Get analytics for a biolink page (views, clicks)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          }
        },
        "required": [
          "biolinkId"
        ]
      }
    },
    {
      "name": "generate_caption",
      "description": "Generate an AI caption for a social media platform",
      "inputSchema": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "DRIBBBLE",
              "PINTEREST",
              "WHATSAPP",
              "LINKEDIN_PAGE"
            ],
            "description": "Target platform"
          },
          "topic": {
            "type": "string",
            "description": "Topic or context for the caption"
          },
          "tone": {
            "type": "string",
            "description": "Tone (e.g. professional, humorous, engaging). Default: professional"
          }
        },
        "required": [
          "platform",
          "topic"
        ]
      }
    },
    {
      "name": "generate_image",
      "description": "Generate an AI image from a text prompt",
      "inputSchema": {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "description": "Text prompt describing the image to generate"
          },
          "style": {
            "type": "string",
            "description": "Image style (e.g. realistic, illustration, abstract)"
          },
          "aspectRatio": {
            "type": "string",
            "description": "Aspect ratio (e.g. 1:1, 16:9, 9:16)"
          }
        },
        "required": [
          "prompt"
        ]
      }
    },
    {
      "name": "generate_and_schedule",
      "description": "Generate AI content, create a post, and schedule it — all in one call",
      "inputSchema": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "DRIBBBLE",
              "PINTEREST",
              "WHATSAPP",
              "LINKEDIN_PAGE"
            ],
            "description": "Target platform for AI generation"
          },
          "socialMedia": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "LINKEDIN_PAGE",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "WHATSAPP",
              "DRIBBBLE",
              "PINTEREST"
            ],
            "description": "Social media for the post"
          },
          "topic": {
            "type": "string",
            "description": "Topic or context for the content"
          },
          "tone": {
            "type": "string",
            "description": "Tone of the content (default: professional)"
          },
          "scheduledAt": {
            "type": "string",
            "description": "ISO date for scheduling (must be future)"
          },
          "accountId": {
            "type": "string",
            "description": "Social account ID to post from"
          }
        },
        "required": [
          "platform",
          "socialMedia",
          "topic",
          "scheduledAt"
        ]
      }
    },
    {
      "name": "get_ai_history",
      "description": "Get AI prompt generation history",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "generate_video",
      "description": "Generate an AI UGC video",
      "inputSchema": {
        "type": "object",
        "properties": {
          "hookText": {
            "type": "string",
            "description": "Video hook/script text (required, max 500 chars)"
          },
          "avatarId": {
            "type": "string",
            "description": "Avatar UUID to use"
          },
          "soundId": {
            "type": "string",
            "description": "Background sound UUID"
          },
          "productDemoUrl": {
            "type": "string",
            "description": "Optional product demo video URL"
          }
        },
        "required": [
          "hookText",
          "avatarId"
        ]
      }
    },
    {
      "name": "list_videos",
      "description": "List generated UGC videos",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "get_video",
      "description": "Get a generated video by ID (includes generation status)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Video UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_video",
      "description": "Delete a generated video",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Video UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_avatars",
      "description": "List available UGC avatars for video generation",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "list_sounds",
      "description": "List available sounds/music for video generation",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          },
          "genre": {
            "type": "string",
            "description": "Filter by genre"
          }
        }
      }
    },
    {
      "name": "generate_hook_suggestions",
      "description": "Generate AI hook/script suggestions for UGC videos",
      "inputSchema": {
        "type": "object",
        "properties": {
          "topic": {
            "type": "string",
            "description": "Topic for hook suggestions"
          },
          "platform": {
            "type": "string",
            "enum": [
              "TWITTER",
              "INSTAGRAM",
              "LINKEDIN",
              "FACEBOOK",
              "TIKTOK",
              "YOUTUBE",
              "THREADS",
              "DRIBBBLE",
              "PINTEREST",
              "WHATSAPP",
              "LINKEDIN_PAGE"
            ],
            "description": "Target platform"
          },
          "count": {
            "type": "number",
            "description": "Number of suggestions (default: 5)"
          }
        },
        "required": [
          "topic"
        ]
      }
    },
    {
      "name": "get_analytics_summary",
      "description": "Fetch workspace analytics overview — post counts by status and platform",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_platform_analytics",
      "description": "Get detailed analytics for a specific connected social account",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_post_analytics",
      "description": "Get analytics for a specific post",
      "inputSchema": {
        "type": "object",
        "properties": {
          "postId": {
            "type": "string",
            "description": "Post UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "postId"
        ]
      }
    },
    {
      "name": "get_facebook_analytics",
      "description": "Get detailed Facebook page analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_instagram_analytics",
      "description": "Get detailed Instagram account analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_linkedin_analytics",
      "description": "Get detailed LinkedIn page analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_youtube_analytics",
      "description": "Get detailed YouTube channel analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_twitter_analytics",
      "description": "Get detailed Twitter/X account analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Lookback period in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "list_templates",
      "description": "List available content templates by category",
      "inputSchema": {
        "type": "object",
        "properties": {
          "category": {
            "type": "string",
            "enum": [
              "meme",
              "quote_card",
              "before_after",
              "reaction",
              "announcement",
              "testimonial"
            ],
            "description": "Filter by template category"
          },
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "render_template",
      "description": "Render a template with provided field values",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Template UUID"
          },
          "fields": {
            "type": "object",
            "description": "Key-value pairs for template fields"
          }
        },
        "required": [
          "id",
          "fields"
        ]
      }
    },
    {
      "name": "create_ticket",
      "description": "Create a support ticket",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subject": {
            "type": "string",
            "description": "Ticket subject"
          },
          "message": {
            "type": "string",
            "description": "Initial message"
          },
          "priority": {
            "type": "string",
            "enum": [
              "LOW",
              "MEDIUM",
              "HIGH"
            ],
            "description": "Ticket priority (default: MEDIUM)"
          }
        },
        "required": [
          "subject",
          "message"
        ]
      }
    },
    {
      "name": "list_tickets",
      "description": "List your support tickets",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "get_ticket",
      "description": "Get a support ticket with details",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Ticket UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "send_ticket_message",
      "description": "Send a message in a support ticket",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ticketId": {
            "type": "string",
            "description": "Ticket UUID"
          },
          "message": {
            "type": "string",
            "description": "Message text"
          }
        },
        "required": [
          "ticketId",
          "message"
        ]
      }
    },
    {
      "name": "get_profile",
      "description": "Get your user profile (includes timezone)",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_organization",
      "description": "Get workspace/organization details",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_billing",
      "description": "Get subscription and billing information",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "get_usage",
      "description": "Get usage breakdown for current billing period",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "list_webhook_subscriptions",
      "description": "List all webhook subscriptions in your workspace",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "create_webhook_subscription",
      "description": "Create a new webhook subscription",
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Webhook endpoint URL"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "post",
                "inbox",
                "account",
                "subscription",
                "ai",
                "team",
                "support"
              ]
            },
            "description": "Event categories to subscribe to"
          },
          "description": {
            "type": "string",
            "description": "Optional description for this subscription"
          }
        },
        "required": [
          "url",
          "categories"
        ]
      }
    },
    {
      "name": "update_webhook_subscription",
      "description": "Update an existing webhook subscription",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Webhook subscription UUID"
          },
          "url": {
            "type": "string",
            "description": "Updated endpoint URL"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "post",
                "inbox",
                "account",
                "subscription",
                "ai",
                "team",
                "support"
              ]
            },
            "description": "Updated event categories"
          },
          "description": {
            "type": "string",
            "description": "Updated description"
          },
          "isActive": {
            "type": "boolean",
            "description": "Enable or disable the subscription"
          },
          "regenerateSecret": {
            "type": "boolean",
            "description": "Set to true to regenerate the signing secret"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_webhook_subscription",
      "description": "Delete a webhook subscription",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Webhook subscription UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_webhook_deliveries",
      "description": "List webhook delivery logs with optional filters",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          },
          "subscriptionId": {
            "type": "string",
            "description": "Filter by subscription UUID"
          },
          "event": {
            "type": "string",
            "description": "Filter by event name"
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "success",
              "retrying",
              "failed"
            ],
            "description": "Filter by delivery status"
          }
        }
      }
    },
    {
      "name": "retry_webhook_delivery",
      "description": "Retry a failed webhook delivery",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Delivery log UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "test_webhook_subscription",
      "description": "Send a test ping to a webhook subscription",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Webhook subscription UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_webhook_events",
      "description": "List all available webhook event types by category",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "list_generated_images",
      "description": "List AI-generated images with pagination",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "get_generated_image",
      "description": "Get details of a single AI-generated image by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "AI image UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "delete_generated_image",
      "description": "Delete an AI-generated image by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "AI image UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "get_template",
      "description": "Get a content template by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Template UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "get_saved_reply",
      "description": "Get a single saved reply template by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Saved reply UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_team_invitations",
      "description": "List pending team invitations",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "cancel_team_invitation",
      "description": "Cancel a pending team invitation",
      "inputSchema": {
        "type": "object",
        "properties": {
          "invitationId": {
            "type": "string",
            "description": "Invitation UUID"
          }
        },
        "required": [
          "invitationId"
        ]
      }
    },
    {
      "name": "get_webhook_subscription",
      "description": "Get a single webhook subscription by ID",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Webhook subscription UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_ticket_messages",
      "description": "List all messages for a support ticket",
      "inputSchema": {
        "type": "object",
        "properties": {
          "ticketId": {
            "type": "string",
            "description": "Support ticket UUID"
          }
        },
        "required": [
          "ticketId"
        ]
      }
    },
    {
      "name": "get_facebook_posts_analytics",
      "description": "Get per-post Facebook page analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_facebook_videos_analytics",
      "description": "Get per-video Facebook page analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_instagram_media_analytics",
      "description": "Get per-post Instagram media analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_instagram_stories_analytics",
      "description": "Get Instagram stories analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_linkedin_posts_analytics",
      "description": "Get per-post LinkedIn page analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_youtube_videos_analytics",
      "description": "Get per-video YouTube channel analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_twitter_content_analytics",
      "description": "Get Twitter/X content-level analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "get_whatsapp_analytics",
      "description": "Get WhatsApp Business account analytics",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          },
          "days": {
            "type": "number",
            "description": "Look-back window in days (default: 7)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "bulk_delete_media",
      "description": "Delete multiple media files at once",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fileIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Array of file UUIDs to delete"
          }
        },
        "required": [
          "fileIds"
        ]
      }
    },
    {
      "name": "delete_media_folder",
      "description": "Delete a media folder and its contents",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Folder UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "move_media_file",
      "description": "Move a media file to a different folder (or root)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "File UUID"
          },
          "folderId": {
            "type": "string",
            "description": "Destination folder UUID (omit or null for root)"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "move_media_folder",
      "description": "Move a folder to a different parent (or root)",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Folder UUID"
          },
          "parentId": {
            "type": "string",
            "description": "Destination parent folder UUID (omit or null for root)"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "rename_media_file",
      "description": "Rename a media file",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "File UUID"
          },
          "name": {
            "type": "string",
            "description": "New file name"
          }
        },
        "required": [
          "id",
          "name"
        ]
      }
    },
    {
      "name": "rename_media_folder",
      "description": "Rename a media folder",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Folder UUID"
          },
          "name": {
            "type": "string",
            "description": "New folder name"
          }
        },
        "required": [
          "id",
          "name"
        ]
      }
    },
    {
      "name": "publish_biolink",
      "description": "Toggle the published state of a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Biolink UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "change_biolink_theme",
      "description": "Switch a biolink to a preset theme",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "theme": {
            "type": "string",
            "description": "Theme name"
          }
        },
        "required": [
          "id",
          "theme"
        ]
      }
    },
    {
      "name": "set_biolink_custom_theme",
      "description": "Apply custom theme colors to a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "backgroundColor": {
            "type": "string"
          },
          "textColor": {
            "type": "string"
          },
          "buttonColor": {
            "type": "string"
          },
          "buttonTextColor": {
            "type": "string"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_biolink_posts",
      "description": "List gallery posts on a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          }
        },
        "required": [
          "biolinkId"
        ]
      }
    },
    {
      "name": "create_biolink_post",
      "description": "Add a gallery post to a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "imageUrl": {
            "type": "string",
            "description": "Image URL"
          },
          "caption": {
            "type": "string",
            "description": "Post caption"
          },
          "linkUrl": {
            "type": "string",
            "description": "Click-through URL"
          },
          "isVisible": {
            "type": "boolean",
            "description": "Whether post is visible"
          }
        },
        "required": [
          "biolinkId"
        ]
      }
    },
    {
      "name": "reorder_biolink_posts",
      "description": "Reorder gallery posts on a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "itemIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ordered list of post UUIDs"
          }
        },
        "required": [
          "biolinkId",
          "itemIds"
        ]
      }
    },
    {
      "name": "update_biolink_post",
      "description": "Update a gallery post on a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "postId": {
            "type": "string",
            "description": "Post UUID"
          },
          "imageUrl": {
            "type": "string"
          },
          "caption": {
            "type": "string"
          },
          "linkUrl": {
            "type": "string"
          },
          "isVisible": {
            "type": "boolean"
          }
        },
        "required": [
          "biolinkId",
          "postId"
        ]
      }
    },
    {
      "name": "delete_biolink_post",
      "description": "Delete a gallery post from a biolink",
      "inputSchema": {
        "type": "object",
        "properties": {
          "biolinkId": {
            "type": "string",
            "description": "Biolink UUID"
          },
          "postId": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "biolinkId",
          "postId"
        ]
      }
    },
    {
      "name": "list_whatsapp_templates",
      "description": "List WhatsApp Business message templates",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "WhatsApp social account UUID (or WABA provider ID)"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "create_whatsapp_template",
      "description": "Create (submit for Meta approval) a WhatsApp message template",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "WhatsApp social account UUID (or WABA provider ID)"
          },
          "name": {
            "type": "string",
            "description": "Template name (lowercase, alphanumeric + underscores)"
          },
          "language": {
            "type": "string",
            "description": "Language code (e.g. en_US)"
          },
          "category": {
            "type": "string",
            "enum": [
              "MARKETING",
              "UTILITY",
              "AUTHENTICATION"
            ]
          },
          "components": {
            "type": "array",
            "description": "Template components (HEADER/BODY/FOOTER/BUTTONS)"
          }
        },
        "required": [
          "accountId",
          "name",
          "language",
          "category",
          "components"
        ]
      }
    },
    {
      "name": "delete_whatsapp_template",
      "description": "Delete a WhatsApp message template",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "WhatsApp social account UUID (or WABA provider ID)"
          },
          "templateName": {
            "type": "string",
            "description": "Template name"
          }
        },
        "required": [
          "accountId",
          "templateName"
        ]
      }
    },
    {
      "name": "send_whatsapp_template",
      "description": "Send a WhatsApp template message to a recipient",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "WhatsApp social account UUID (or WABA provider ID)"
          },
          "to": {
            "type": "string",
            "description": "Recipient phone number in E.164 format"
          },
          "templateName": {
            "type": "string",
            "description": "Template name"
          },
          "languageCode": {
            "type": "string",
            "description": "Template language code"
          },
          "components": {
            "type": "array",
            "description": "Template variable components"
          }
        },
        "required": [
          "accountId",
          "to",
          "templateName",
          "languageCode"
        ]
      }
    },
    {
      "name": "upload_whatsapp_template_media",
      "description": "Upload header media (image/video/document) for a template",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "WhatsApp social account UUID (or WABA provider ID)"
          },
          "fileType": {
            "type": "string",
            "description": "MIME type of the file"
          },
          "fileUrl": {
            "type": "string",
            "description": "Publicly accessible file URL"
          },
          "fileBase64": {
            "type": "string",
            "description": "Base64-encoded file data"
          }
        },
        "required": [
          "accountId",
          "fileType"
        ]
      }
    },
    {
      "name": "update_profile",
      "description": "Update the authenticated user's profile",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Display name"
          },
          "password": {
            "type": "string",
            "description": "New password"
          },
          "timezone": {
            "type": "string",
            "description": "IANA timezone"
          },
          "email": {
            "type": "string",
            "description": "Email address"
          }
        }
      }
    },
    {
      "name": "update_organization",
      "description": "Update the current workspace / organization",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Organization name"
          },
          "description": {
            "type": "string",
            "description": "Organization description"
          },
          "color": {
            "type": "string",
            "description": "Brand color (hex)"
          }
        }
      }
    },
    {
      "name": "list_api_keys",
      "description": "List active API keys for the current workspace",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "create_api_key",
      "description": "Create a new API key; full key is returned only once",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Key name"
          },
          "expiresAt": {
            "type": "string",
            "description": "ISO-8601 expiration timestamp"
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "name": "revoke_api_key",
      "description": "Revoke an API key",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "API key UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "list_tenants",
      "description": "List workspaces/tenants the authenticated user belongs to",
      "inputSchema": {
        "type": "object",
        "properties": {
          "page": {
            "type": "number",
            "description": "Page number (default: 1)"
          },
          "limit": {
            "type": "number",
            "description": "Items per page (max 100, default: 20)"
          }
        }
      }
    },
    {
      "name": "create_tenant",
      "description": "Create a new workspace/tenant owned by the authenticated user",
      "inputSchema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Workspace name"
          },
          "description": {
            "type": "string",
            "description": "Workspace description"
          }
        },
        "required": [
          "name"
        ]
      }
    },
    {
      "name": "delete_tenant",
      "description": "Delete a workspace/tenant",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Workspace UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "leave_tenant",
      "description": "Leave a workspace/tenant the user is a member of",
      "inputSchema": {
        "type": "object",
        "properties": {
          "tenantId": {
            "type": "string",
            "description": "Workspace UUID (defaults to current workspace)"
          }
        }
      }
    },
    {
      "name": "get_referral_code",
      "description": "Get the authenticated user's referral code",
      "inputSchema": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "name": "subscribe_inbox",
      "description": "Enable inbox sync for a connected social account",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "unsubscribe_inbox",
      "description": "Disable inbox sync for a connected social account",
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountId": {
            "type": "string",
            "description": "Social account UUID"
          }
        },
        "required": [
          "accountId"
        ]
      }
    },
    {
      "name": "disconnect_account",
      "description": "Disconnect (remove) a connected social account",
      "inputSchema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Social account UUID"
          }
        },
        "required": [
          "id"
        ]
      }
    },
    {
      "name": "mark_comments_as_read",
      "description": "Mark all comments on a post as read",
      "inputSchema": {
        "type": "object",
        "properties": {
          "postId": {
            "type": "string",
            "description": "Post UUID"
          }
        },
        "required": [
          "postId"
        ]
      }
    }
  ]
}
```


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)