# Dalea MCP server

Canonical: https://usedalea.ai/docs/mcp

## Introduction

The Dalea MCP server lets any Model Context Protocol client, such as Claude, ChatGPT, Claude Code or Cursor, work with your Dalea account: brands, content calendar, scripts, brainstorm, references, brand knowledge and Instagram and TikTok performance.

Every tool runs as the signed-in user and requires an active Dalea subscription. Without one, tools return an error that says so.

Server URL: `https://app.usedalea.ai/api/mcp/mcp` (Streamable HTTP; protocol versions 2025-11-25, 2025-06-18, 2025-03-26).

## Connect

### Claude

1. Open Claude (web or desktop) and go to Settings, then Connectors.
2. Choose Add custom connector and paste the server URL.
3. Click Connect, log in to Dalea and approve the access.

### ChatGPT

1. Enable developer mode in ChatGPT settings.
2. Go to Connectors, create a new connector and paste the server URL.
3. Choose OAuth, save, then log in to Dalea and approve the access.

### Claude Code

1. Add the server, then run /mcp inside Claude Code and choose Authenticate.

```bash
claude mcp add --transport http dalea https://app.usedalea.ai/api/mcp/mcp
```

### Cursor and other clients

1. Create an API key in Dalea under Settings, MCP.
2. Add the server to your client's MCP configuration with the key as a Bearer token.

```json
{
  "mcpServers": {
    "dalea": {
      "url": "https://app.usedalea.ai/api/mcp/mcp",
      "headers": {
        "Authorization": "Bearer dalea_mcp_..."
      }
    }
  }
}
```

### Any MCP client

1. Any client that supports Streamable HTTP and OAuth 2.1 can connect with the server URL alone; it discovers the authorization server by itself.

## Authentication

The server uses OAuth 2.1 with PKCE (S256) and dynamic client registration, so clients register themselves on first use.

Discovery follows the MCP authorization spec: an unauthenticated request gets a 401 with a WWW-Authenticate header pointing at the protected resource metadata, which points at the authorization server metadata.

Authorization server: https://app.usedalea.ai. Protected resource metadata: https://app.usedalea.ai/.well-known/oauth-protected-resource/api/mcp/mcp.

| Scope | Grants |
| --- | --- |
| `dalea:read` | Read brands, content, calendar, metrics, references and brand knowledge. |
| `dalea:write` | Create and edit content, brand knowledge and references, and run AI actions that consume daily quota. |
| `offline_access` | Keep the connection alive with a refresh token so the client does not ask you to log in again. |

If a connection was authorized with dalea:read only, write tools answer with a message asking you to reconnect with write access.

API keys start with `dalea_mcp_` and are sent as `Authorization: Bearer <key>`. Each account can have up to 10 active keys.

Revoke OAuth connections and API keys at any time in Dalea under Settings, MCP.

## Rate limits & quotas

Every account can make up to 60 requests per minute. Tools that run AI or scraping also have a daily quota:

| Tool | Calls per day |
| --- | --- |
| `sync_metrics` | 6 |
| `generate_title` | 50 |
| `regenerate_brainstorm` | 5 |
| `generate_insights` | 5 |
| `save_reference_by_url` | 30 |
| `run_creator_deep_analysis` | 10 |
| `generate_scripts` | 10 |
| `generate_hook_options` | 30 |
| `generate_body_options` | 30 |
| `generate_cta_options` | 30 |
| `generate_caption_options` | 30 |

## Errors

Tool errors come back as a normal MCP result with `isError: true` and a message the assistant can show you:

| Message | Meaning |
| --- | --- |
| `An active Dalea subscription is required to use this tool.` | The account has no active subscription. |
| `This connection was authorized read-only. Reconnect Dalea with write access to use this tool.` | A write tool was called on a dalea:read connection. |
| `Rate limit exceeded. Try again in a minute.` | More than the per-minute limit of calls. |
| `Daily limit reached for <tool> (<n> per day). Try again tomorrow.` | A metered tool used up its daily quota. |
| `Dalea hit an unexpected error while running this tool. Try again in a moment.` | Server-side failure; it is logged on our side. |

A request without valid credentials gets HTTP 401 with a `WWW-Authenticate` header; MCP clients use it to start the OAuth flow.

## Prompts

- `weekly-review` (Weekly review): Review last week's performance and what to change next week.

- `plan-next-week` (Plan next week): Fill next week's calendar with ideas grounded in trends, brainstorm and past performance.

## Tools reference

### Brands

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_brands`](#list_brands) | read | List the user's brands with niche and connected platforms, and which one is active. |
| [`get_brand_profile`](#get_brand_profile) | read | Get a brand's full profile: basics (name, language, strategy summary), the onboarding brief (niche, audience, pain, promise, tone, pillars, taboo topics), connected social accounts with follower counts, business segment and subscription status. |
| [`get_brand_kit`](#get_brand_kit) | read | Get the brand's visual identity kit (colors, fonts, logo, palette, voice description) used by the video editor and carousels. |

#### `list_brands`

`read` `idempotent`

List the user's brands with niche and connected platforms, and which one is active. Use the returned id as brandId for other tools.

No parameters.

#### `get_brand_profile`

`read` `idempotent`

Get a brand's full profile: basics (name, language, strategy summary), the onboarding brief (niche, audience, pain, promise, tone, pillars, taboo topics), connected social accounts with follower counts, business segment and subscription status. Call this first to understand who the creator is before generating or reviewing content.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `get_brand_kit`

`read` `idempotent`

Get the brand's visual identity kit (colors, fonts, logo, palette, voice description) used by the video editor and carousels. Returns kit: null when none was generated yet.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

### Performance

| Tool | Scope | Summary |
| --- | --- | --- |
| [`get_account_overview`](#get_account_overview) | read | Get the brand's connected accounts with followers, followersGained30d (null when there is no metric snapshot at least 30 days old), total videos, reach, and lastSyncedAt. |
| [`list_videos`](#list_videos) | read | List the brand's published videos with metrics and classification (funnelStage, format, communicationStyle, mediaType). |
| [`get_video`](#get_video) | read | Get one of the brand's videos by platformVideoId: full metrics (incl. |
| [`get_performance_summary`](#get_performance_summary) | read | Totals for videos published in the last N days (7\|30\|90, default 30): videoCount, views, likes, comments, shares, saves, averageEngagementPct; the same for the previous window; deltaPct per metric (null when the previous value is 0); and the topVideo by views. |
| [`get_top_performers`](#get_top_performers) | read | Rank the brand's videos published in the last N days (default 30) by metric: views \| engagement \| saves \| shares \| likes. |
| [`get_metrics_daily`](#get_metrics_daily) | read | Daily aggregated metrics per connected account between from and to (YYYY-MM-DD, inclusive; range capped to the last 180 days before `to`). |
| [`get_niche_benchmarks`](#get_niche_benchmarks) | read | Get median/p75/p90 view and engagement benchmarks for the brand's niche. |
| [`get_voice_profile`](#get_voice_profile) | read | Get the brand's AI-derived voice profile (status, confidence, profile, exemplars) and form profile (status, profile, stats). |
| [`set_video_classification`](#set_video_classification) | write | Manually classify one of the brand's published videos (by platformVideoId): funnel (tofu \| mofu \| bofu), format (taxonomy slug, e.g. |

#### `get_account_overview`

`read` `idempotent`

Get the brand's connected accounts with followers, followersGained30d (null when there is no metric snapshot at least 30 days old), total videos, reach, and lastSyncedAt.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `list_videos`

`read` `idempotent`

List the brand's published videos with metrics and classification (funnelStage, format, communicationStyle, mediaType). Filters: platform, since/until (ISO), funnelStage, format, minViews, mediaType (video|image|carousel). sortBy: views | engagement | published_at (desc). limit default 20 max 100, offset for paging. Captions are truncated to 300 chars; use get_video for full detail.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `platform` | `"tiktok" \| "instagram"` | no |  |
| `since` | `string` | no |  |
| `until` | `string` | no |  |
| `funnelStage` | `string` | no |  |
| `format` | `string` | no |  |
| `minViews` | `integer` | no |  |
| `mediaType` | `"video" \| "image" \| "carousel"` | no |  |
| `sortBy` | `"views" \| "engagement" \| "published_at"` | no |  |
| `limit` | `integer` | no |  |
| `offset` | `integer` | no |  |

#### `get_video`

`read` `idempotent`

Get one of the brand's videos by platformVideoId: full metrics (incl. averageWatchTime, reach, saves), plus the AI analysis and transcript when they exist (null otherwise).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `platformVideoId` | `string` | yes |  |

#### `get_performance_summary`

`read` `idempotent`

Totals for videos published in the last N days (7|30|90, default 30): videoCount, views, likes, comments, shares, saves, averageEngagementPct; the same for the previous window; deltaPct per metric (null when the previous value is 0); and the topVideo by views.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `days` | `7 \| 30 \| 90` | no |  |

#### `get_top_performers`

`read` `idempotent`

Rank the brand's videos published in the last N days (default 30) by metric: views | engagement | saves | shares | likes. direction top (default) or bottom. limit default 10 max 100.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `metric` | `"views" \| "engagement" \| "saves" \| "shares" \| "likes"` | no |  |
| `days` | `integer` | no |  |
| `direction` | `"top" \| "bottom"` | no |  |
| `limit` | `integer` | no |  |

#### `get_metrics_daily`

`read` `idempotent`

Daily aggregated metrics per connected account between from and to (YYYY-MM-DD, inclusive; range capped to the last 180 days before `to`). One row per account per day: date, platform, totals and averageEngagementPct. Optional platform filter.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `platform` | `"tiktok" \| "instagram"` | no |  |
| `from` | `string` | yes |  |
| `to` | `string` | yes |  |

#### `get_niche_benchmarks`

`read` `idempotent`

Get median/p75/p90 view and engagement benchmarks for the brand's niche. With compare=true also returns `brand` (medianViews, p75Views, medianEngagementPct, sampleSize) computed from the brand's own videos of the last 90 days, or null when it has none.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `compare` | `boolean` | no |  |

#### `get_voice_profile`

`read` `idempotent`

Get the brand's AI-derived voice profile (status, confidence, profile, exemplars) and form profile (status, profile, stats). Each is null when it has not been generated yet.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `set_video_classification`

`write` `idempotent`

Manually classify one of the brand's published videos (by platformVideoId): funnel (tofu | mofu | bofu), format (taxonomy slug, e.g. talking_head, tutorial, listicle) and/or communicationStyle (style slug). Provide at least one; pass null to clear an axis back to unclassified. Only the classification columns change (marked as manual so auto-classification will not overwrite them); metrics, analysis and the video itself are NOT touched, and nothing is published. Returns the video's resulting classification.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `platformVideoId` | `string` | yes |  |
| `funnel` | `"tofu" \| "mofu" \| "bofu" \| null` | no |  |
| `format` | `string \| null` | no |  |
| `communicationStyle` | `string \| null` | no |  |

### Content

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_contents`](#list_contents) | read | List the brand's content cards (board + calendar) as summaries: id, title, idea, status, platforms, postedAt, mediaType, category, funnelStage, format, updatedAt. |
| [`get_content`](#get_content) | read | Get one content card's full detail by id: the script (hook, body, cta, caption), planning fields (status, platforms, postedAt, mediaType, category, funnelStage, format, communicationStyle, targetDurationSeconds) and how many references and AI generations it has. |
| [`list_content_generations`](#list_content_generations) | read | List the AI script generations saved for a content card (newest first): title, hook, cta and the alternative body/caption options each run produced. |
| [`list_content_references`](#list_content_references) | read | List the references (videos, links, files) attached to a content card, in order: id, referenceType, referenceUrl, position, title. |
| [`get_refine_chat`](#get_refine_chat) | read | Get the last N messages (default 20, max 100) of the refine chat attached to a content card, as { role, content } pairs, plus the total message count. |
| [`create_content`](#create_content) | write | Create a new content card on the board/calendar (no AI). |
| [`update_content`](#update_content) | write | Edit a content card's editorial fields (no AI). |
| [`move_content`](#move_content) | write | Move a content card on the kanban board: change its column (status) and/or its order within a column. |
| [`schedule_content`](#schedule_content) | write | Set the planned calendar date for a content card (the day it should be posted). |
| [`unschedule_content`](#unschedule_content) | write | Clear a content card's planned calendar date (sets posted_at to null). |
| [`delete_content`](#delete_content) | write | Delete a content card from the board/calendar by id. |
| [`reorder_contents`](#reorder_contents) | write | Set the order of cards inside one kanban column (status: idea \| draft \| edited \| posted). |
| [`duplicate_content`](#duplicate_content) | write | Create a copy of a content card (same title, idea, script, caption, platforms, mediaType, format, category, funnelStage, communicationStyle, targetDurationSeconds) at the bottom of the idea column, with no planned date. |
| [`bulk_create_contents`](#bulk_create_contents) | write | Create 1-20 content cards in one call (no AI). |

#### `list_contents`

`read` `idempotent`

List the brand's content cards (board + calendar) as summaries: id, title, idea, status, platforms, postedAt, mediaType, category, funnelStage, format, updatedAt. Filters: status (idea | draft | edited | posted), platform (tiktok | instagram), mediaType (short_video | carousel | short_text), from/to (planned date range, YYYY-MM-DD or ISO), search (matches title or idea). Paginate with limit (default 50, max 100) and offset. Use get_content for the full script.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `status` | `string` | no |  |
| `platform` | `"tiktok" \| "instagram"` | no |  |
| `mediaType` | `"short_video" \| "carousel" \| "short_text"` | no |  |
| `from` | `string` | no |  |
| `to` | `string` | no |  |
| `search` | `string` | no |  |
| `limit` | `integer` | no |  |
| `offset` | `integer` | no |  |

#### `get_content`

`read` `idempotent`

Get one content card's full detail by id: the script (hook, body, cta, caption), planning fields (status, platforms, postedAt, mediaType, category, funnelStage, format, communicationStyle, targetDurationSeconds) and how many references and AI generations it has. Use list_content_references / list_content_generations / get_refine_chat to drill into those. The card's url opens it in Dalea: share it so the user can review and edit it there.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |

#### `list_content_generations`

`read` `idempotent`

List the AI script generations saved for a content card (newest first): title, hook, cta and the alternative body/caption options each run produced. Use it to see what was already tried before regenerating.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `limit` | `integer` | no |  |

#### `list_content_references`

`read` `idempotent`

List the references (videos, links, files) attached to a content card, in order: id, referenceType, referenceUrl, position, title.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |

#### `get_refine_chat`

`read` `idempotent`

Get the last N messages (default 20, max 100) of the refine chat attached to a content card, as { role, content } pairs, plus the total message count. Use it to recover what the creator asked for before editing the script.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `last` | `integer` | no |  |

#### `create_content`

`write`

Create a new content card on the board/calendar (no AI). Requires a title or idea. status: idea | draft | edited | posted (default idea). scheduledDate (YYYY-MM-DD or ISO timestamp) sets the calendar date. The card's url opens it in Dalea: share it so the user can review and edit it there.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `title` | `string` | no |  |
| `idea` | `string` | no |  |
| `hook` | `string` | no |  |
| `body` | `string` | no |  |
| `cta` | `string` | no |  |
| `caption` | `string` | no |  |
| `platforms` | `array<"tiktok" \| "instagram">` | no |  |
| `mediaType` | `"short_video" \| "carousel" \| "short_text"` | no |  |
| `category` | `string` | no |  |
| `funnelStage` | `string` | no |  |
| `status` | `"idea" \| "draft" \| "edited" \| "posted"` | no |  |
| `scheduledDate` | `string` | no |  |

#### `update_content`

`write` `idempotent`

Edit a content card's editorial fields (no AI). Provide at least one of title, idea, hook, body, cta, caption, platforms, mediaType, category, funnelStage. Does NOT change the board column, order, or date, use move_content / schedule_content for those. The card's url opens it in Dalea: share it so the user can review and edit it there.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `title` | `string` | no |  |
| `idea` | `string` | no |  |
| `hook` | `string` | no |  |
| `body` | `string` | no |  |
| `cta` | `string` | no |  |
| `caption` | `string` | no |  |
| `platforms` | `array<"tiktok" \| "instagram">` | no |  |
| `mediaType` | `"short_video" \| "carousel" \| "short_text"` | no |  |
| `category` | `string` | no |  |
| `funnelStage` | `string` | no |  |

#### `move_content`

`write` `idempotent`

Move a content card on the kanban board: change its column (status) and/or its order within a column. Provide at least one of status or placement. placement top|bottom positions within the target column (default bottom); the exact order index is managed automatically. status: idea | draft | edited | posted. Note: the 'posted' column does not publish anything.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `status` | `"idea" \| "draft" \| "edited" \| "posted"` | no |  |
| `placement` | `"top" \| "bottom"` | no |  |

#### `schedule_content`

`write` `idempotent`

Set the planned calendar date for a content card (the day it should be posted). Pass YYYY-MM-DD for a day (stored at noon UTC so the day is stable in every timezone) or a full ISO timestamp when the exact time matters. This only plans the date; it does not publish.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `date` | `string` | yes |  |

#### `unschedule_content`

`write` `idempotent`

Clear a content card's planned calendar date (sets posted_at to null).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |

#### `delete_content`

`write` `destructive` `idempotent`

Delete a content card from the board/calendar by id. The card disappears from the app (soft delete).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |

#### `reorder_contents`

`write` `idempotent`

Set the order of cards inside one kanban column (status: idea | draft | edited | posted). orderedIds (1-200, all must belong to that column) become positions 0..n-1 in the given order; cards of the column not listed keep their relative order after them. Does NOT change any card's status, date or fields, and does not publish anything. Returns the full column order as { id, position }.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `status` | `"idea" \| "draft" \| "edited" \| "posted"` | yes |  |
| `orderedIds` | `array<string>` | yes |  |

#### `duplicate_content`

`write`

Create a copy of a content card (same title, idea, script, caption, platforms, mediaType, format, category, funnelStage, communicationStyle, targetDurationSeconds) at the bottom of the idea column, with no planned date. The original is NOT changed; references, generations and refine chat are NOT copied; nothing is published. Returns the new card and duplicatedFromId. The card's url opens it in Dalea: share it so the user can review and edit it there.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |

#### `bulk_create_contents`

`write`

Create 1-20 content cards in one call (no AI). Each item has the create_content shape (title or idea required; optional status, scheduledDate, platforms, mediaType, category, funnelStage, hook, body, cta, caption). Cards are created in order at the bottom of their column; nothing is published. Not idempotent: calling twice creates the cards twice. Returns { contents, created }. The card's url opens it in Dalea: share it so the user can review and edit it there.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `items` | `array<object>` | yes |  |

### Brainstorm

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_brainstorm_suggestions`](#list_brainstorm_suggestions) | read | List the brand's active brainstorm suggestions with reasons. |
| [`accept_brainstorm_suggestion`](#accept_brainstorm_suggestion) | write | Accept a brainstorm suggestion: creates a content card in the idea column from its title, idea and funnel stage (no AI), then marks the suggestion as added with contentId. |
| [`dismiss_brainstorm_suggestion`](#dismiss_brainstorm_suggestion) | write | Mark a brainstorm suggestion as dismissed so it leaves the pending list. |

#### `list_brainstorm_suggestions`

`read` `idempotent`

List the brand's active brainstorm suggestions with reasons. Optional status filter: pending | added (contentId points to the created content) | dismissed.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `status` | `"pending" \| "added" \| "dismissed"` | no |  |

#### `accept_brainstorm_suggestion`

`write`

Accept a brainstorm suggestion: creates a content card in the idea column from its title, idea and funnel stage (no AI), then marks the suggestion as added with contentId. scheduledDate (YYYY-MM-DD or ISO) overrides the suggestion's suggested date as the planned date. The suggestion's text is NOT changed; nothing is published. Fails if the suggestion was already added. Returns { suggestion, content }.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `suggestionId` | `string` | yes |  |
| `scheduledDate` | `string` | no |  |

#### `dismiss_brainstorm_suggestion`

`write` `idempotent`

Mark a brainstorm suggestion as dismissed so it leaves the pending list. Does NOT delete it, does NOT touch any content card already created from it, and publishes nothing. Returns { suggestion }.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `suggestionId` | `string` | yes |  |

### References

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_insights`](#list_insights) | read | List the brand's AI-generated insight tiles. |
| [`get_homepage_insights`](#get_homepage_insights) | read | Get the latest homepage insight cards generated for the brand (insights array, how many videos they were based on, language). |
| [`list_saved_references`](#list_saved_references) | read | List the brand's saved reference videos (with catalog videoId, note and whether an analysis exists, use get_catalog_video for the transcript) and creator inspirations (creatorId for get_creator / get_creator_analysis). |
| [`get_creator_analysis`](#get_creator_analysis) | read | Get the stored deep analysis for a saved creator by creatorId. |

#### `list_insights`

`read` `idempotent`

List the brand's AI-generated insight tiles.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `get_homepage_insights`

`read` `idempotent`

Get the latest homepage insight cards generated for the brand (insights array, how many videos they were based on, language).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `list_saved_references`

`read` `idempotent`

List the brand's saved reference videos (with catalog videoId, note and whether an analysis exists, use get_catalog_video for the transcript) and creator inspirations (creatorId for get_creator / get_creator_analysis).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `get_creator_analysis`

`read` `idempotent`

Get the stored deep analysis for a saved creator by creatorId.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `creatorId` | `string` | yes |  |

### Calendar

| Tool | Scope | Summary |
| --- | --- | --- |
| [`get_calendar`](#get_calendar) | read | Get the brand's content calendar for a date range as one entry per day (empty days included), each with the cards planned for that day (id, title, status, platforms, mediaType, postedAt). |

#### `get_calendar`

`read` `idempotent`

Get the brand's content calendar for a date range as one entry per day (empty days included), each with the cards planned for that day (id, title, status, platforms, mediaType, postedAt). from/to are YYYY-MM-DD (UTC); default is today through the next 7 days. Use it to see what is scheduled and find free days before schedule_content.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `from` | `string` | no |  |
| `to` | `string` | no |  |

### Viral catalog

| Tool | Scope | Summary |
| --- | --- | --- |
| [`search_catalog_videos`](#search_catalog_videos) | read | Search the shared reference catalog of top-performing creator videos. |
| [`get_catalog_video`](#get_catalog_video) | read | Get one catalog video by id with its stored analysis (transcript and virality score) when one exists. |
| [`search_creators`](#search_creators) | read | Search catalog creators by name or handle (min 2 chars). |
| [`get_creator`](#get_creator) | read | Get a catalog creator by id: profile, AI summary, platform accounts and their 5 most-viewed catalog videos. |
| [`list_niche_patterns`](#list_niche_patterns) | read | List the recurring script patterns detected in a niche's viral videos (name, description, structure, average virality, usage count). |

#### `search_catalog_videos`

`read` `idempotent`

Search the shared reference catalog of top-performing creator videos. Defaults to the brand's niche and content language (language 'all' disables the language filter). query understands format names, funnel phrases (tofu/mofu/bofu) and presentation modes (text on screen / spoken), and matches the rest against captions and handles. format is a taxonomy slug. sortBy: views (default) | virality (engagement rate) | recent. Creators the brand hid are excluded. Paginate with limit (max 100) and offset.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `query` | `string` | no |  |
| `niche` | `string` | no |  |
| `platform` | `"tiktok" \| "instagram"` | no |  |
| `format` | `"talking_head" \| "voiceover_broll" \| "listicle" \| "tutorial" \| "storytelling" \| "reaction" \| "pov" \| "street_interview" \| "day_in_life" \| "podcast_clip" \| "green_screen"` | no |  |
| `funnelStage` | `"tofu" \| "mofu" \| "bofu"` | no |  |
| `language` | `string` | no |  |
| `minViews` | `integer` | no |  |
| `sortBy` | `"virality" \| "views" \| "recent"` | no |  |
| `limit` | `integer` | no |  |
| `offset` | `integer` | no |  |

#### `get_catalog_video`

`read` `idempotent`

Get one catalog video by id with its stored analysis (transcript and virality score) when one exists.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `videoId` | `string` | yes |  |

#### `search_creators`

`read` `idempotent`

Search catalog creators by name or handle (min 2 chars). Optional niche tag and platform filters. Returns each creator with their platform accounts and follower counts.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `query` | `string` | yes |  |
| `niche` | `string` | no |  |
| `platform` | `"tiktok" \| "instagram"` | no |  |
| `limit` | `integer` | no |  |

#### `get_creator`

`read` `idempotent`

Get a catalog creator by id: profile, AI summary, platform accounts and their 5 most-viewed catalog videos.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `creatorId` | `string` | yes |  |

#### `list_niche_patterns`

`read` `idempotent`

List the recurring script patterns detected in a niche's viral videos (name, description, structure, average virality, usage count). Defaults to the brand's niche.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `niche` | `string` | no |  |
| `limit` | `integer` | no |  |

### Brand knowledge

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_creator_facts`](#list_creator_facts) | read | List facts the app has learned about the creator (story, pillars, arguments, restrictions, preferences, products, milestones, voice, audience, goals). |
| [`get_script_preferences`](#get_script_preferences) | read | Get the brand's script preferences: content pillars with weights, preferred formats, default duration, approved and banned hooks, standing instructions. |
| [`list_restrictions`](#list_restrictions) | read | List things the brand never wants in its content (restrictions), with where each one came from. |
| [`get_creator_memory`](#get_creator_memory) | read | Get the AI-maintained memory of who this creator is (free text plus structured fields). |
| [`get_creator_context`](#get_creator_context) | read | Get the creator interview outcome: phase, origin story, 90-day goals, what content already works, struggles, themes and voice. |
| [`list_macro_topics`](#list_macro_topics) | read | List the brand's macro content topics grouped from its creator facts, with usage counts and the fact ids behind each one. |
| [`add_restriction`](#add_restriction) | write | Add a restriction: something the brand never wants in its content. |
| [`remove_restriction`](#remove_restriction) | write | Permanently delete one restriction by id (from list_restrictions). |
| [`update_script_preferences`](#update_script_preferences) | write | Update the brand's script preferences. |
| [`add_creator_fact`](#add_creator_fact) | write | Record a fact about the creator in the learning ledger (source manual, status active). |
| [`archive_creator_fact`](#archive_creator_fact) | write | Archive a creator fact by id so it stops feeding generation. |
| [`delete_saved_reference`](#delete_saved_reference) | write | Permanently remove a saved reference video (id from list_saved_references). |
| [`hide_creator`](#hide_creator) | write | Hide a creator (by handle, with or without @) from this brand's reference catalog searches. |
| [`unhide_creator`](#unhide_creator) | write | Show a previously hidden creator (by handle) in this brand's reference catalog again. |
| [`update_brand_kit`](#update_brand_kit) | write | Update the brand's visual identity kit: colors (primary, accent, background, foreground, palette), fonts (fontFamily, headingFont), logoUrl, voiceDescription. |
| [`update_strategy_brief`](#update_strategy_brief) | write | Update the brand's strategy brief (onboarding brief). |

#### `list_creator_facts`

`read` `idempotent`

List facts the app has learned about the creator (story, pillars, arguments, restrictions, preferences, products, milestones, voice, audience, goals). status defaults to active. limit max 100.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `category` | `"historia" \| "pilar" \| "argumento" \| "restricao" \| "preferencia" \| "produto_parceria" \| "marco" \| "voz" \| "publico" \| "objetivo"` | no |  |
| `status` | `"active" \| "archived" \| "contradicted" \| "duplicate" \| "merged" \| "expired"` | no |  |
| `limit` | `integer` | no |  |

#### `get_script_preferences`

`read` `idempotent`

Get the brand's script preferences: content pillars with weights, preferred formats, default duration, approved and banned hooks, standing instructions.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `list_restrictions`

`read` `idempotent`

List things the brand never wants in its content (restrictions), with where each one came from.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `get_creator_memory`

`read` `idempotent`

Get the AI-maintained memory of who this creator is (free text plus structured fields). Fields are null when no memory was generated yet.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `get_creator_context`

`read` `idempotent`

Get the creator interview outcome: phase, origin story, 90-day goals, what content already works, struggles, themes and voice. Never includes the interview transcript.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `list_macro_topics`

`read` `idempotent`

List the brand's macro content topics grouped from its creator facts, with usage counts and the fact ids behind each one.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `limit` | `integer` | no |  |

#### `add_restriction`

`write`

Add a restriction: something the brand never wants in its content. Text is whitespace-normalized and capped at 280 characters; an identical existing restriction is not duplicated. Returns the full restriction list. Does not touch creator facts or script preferences.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `text` | `string` | yes |  |

#### `remove_restriction`

`write` `destructive` `idempotent`

Permanently delete one restriction by id (from list_restrictions). Returns the remaining restriction list.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `restrictionId` | `string` | yes |  |

#### `update_script_preferences`

`write` `idempotent`

Update the brand's script preferences. Only the keys present in patch are replaced (a list key replaces the whole list); everything else is kept. formats must be taxonomy slugs (talking_head, voiceover_broll, listicle, tutorial, storytelling, reaction, pov, street_interview, day_in_life, podcast_clip, green_screen). defaultDurationSeconds 5-600 or null. Restrictions live elsewhere (add_restriction). Returns the full preferences document.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `patch` | `object` | yes |  |

#### `add_creator_fact`

`write`

Record a fact about the creator in the learning ledger (source manual, status active). category defaults to preferencia. If an active fact with the same text already exists it is returned instead of duplicated (created: false). Does not regenerate the creator memory.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `fact` | `string` | yes |  |
| `category` | `"historia" \| "pilar" \| "argumento" \| "restricao" \| "preferencia" \| "produto_parceria" \| "marco" \| "voz" \| "publico" \| "objetivo"` | no |  |

#### `archive_creator_fact`

`write` `idempotent`

Archive a creator fact by id so it stops feeding generation. The row is kept (status archived), not deleted. Returns the updated fact.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `factId` | `string` | yes |  |

#### `delete_saved_reference`

`write` `destructive` `idempotent`

Permanently remove a saved reference video (id from list_saved_references). The catalog video itself and any inspirations are untouched.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `savedVideoId` | `string` | yes |  |

#### `hide_creator`

`write` `idempotent`

Hide a creator (by handle, with or without @) from this brand's reference catalog searches. Already-hidden creators are left as is. Does not delete saved references from that creator.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `creatorHandle` | `string` | yes |  |

#### `unhide_creator`

`write` `idempotent`

Show a previously hidden creator (by handle) in this brand's reference catalog again. No-op when the creator was not hidden.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `creatorHandle` | `string` | yes |  |

#### `update_brand_kit`

`write` `idempotent`

Update the brand's visual identity kit: colors (primary, accent, background, foreground, palette), fonts (fontFamily, headingFont), logoUrl, voiceDescription. Only the keys in patch change; source becomes manual and sourceUrl is preserved. Fails when the brand has no kit yet unless the patch carries every required field.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `patch` | `object` | yes |  |

#### `update_strategy_brief`

`write` `idempotent`

Update the brand's strategy brief (onboarding brief). Only these keys can change: niche, niches, topics, profileType, contentGoal, icpWho, icpWants, mainPain, promiseLine, toneStyle, contentPillars, tabooTopics, mediaTypes. Keys not in patch are kept; offer, site and connected-platform data are never touched. Returns the brief's editable keys.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `patch` | `object` | yes |  |

### Trends

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_trend_feed`](#list_trend_feed) | read | List trending topic clusters matched to the brand, best fit first: fit score and reasons, a suggested angle, and the cluster's title, description, category, platforms, momentum, tags, post count and average virality. |
| [`get_trend_cluster`](#get_trend_cluster) | read | Get one trend cluster by clusterId, plus the brand's fit (score, reasons, suggested angle, content guide) when the cluster is in the brand's feed. |

#### `list_trend_feed`

`read` `idempotent`

List trending topic clusters matched to the brand, best fit first: fit score and reasons, a suggested angle, and the cluster's title, description, category, platforms, momentum, tags, post count and average virality. limit max 100.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `limit` | `integer` | no |  |

#### `get_trend_cluster`

`read` `idempotent`

Get one trend cluster by clusterId, plus the brand's fit (score, reasons, suggested angle, content guide) when the cluster is in the brand's feed.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `clusterId` | `string` | yes |  |

### Studio

| Tool | Scope | Summary |
| --- | --- | --- |
| [`list_carousel_drafts`](#list_carousel_drafts) | read | List the brand's carousel drafts from the Carousel Studio (title, slide count, last edit). |
| [`get_carousel_draft`](#get_carousel_draft) | read | Get one carousel draft with its slides (role, image prompt, headline/body/CTA texts). |
| [`list_carousel_posts`](#list_carousel_posts) | read | List carousel/video publish jobs sent to Instagram or TikTok: status, scheduled time, per-platform result (permalink or error). |
| [`list_video_projects`](#list_video_projects) | read | List the brand's video editor projects (name, status queued\|processing\|preview_ready\|ready\|failed, language, enabled edits, durations). |
| [`get_video_job_status`](#get_video_job_status) | read | Get the latest render job of a video editor project: status, stage, progress percent, error code, plus the url of the project in the Dalea video editor. |

#### `list_carousel_drafts`

`read` `idempotent`

List the brand's carousel drafts from the Carousel Studio (title, slide count, last edit). Use get_carousel_draft for the slide texts. Each draft has a url that opens it in the Dalea Carousel Studio: share it when the user wants to see or edit a carousel.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `limit` | `integer` | no |  |
| `offset` | `integer` | no |  |

#### `get_carousel_draft`

`read` `idempotent`

Get one carousel draft with its slides (role, image prompt, headline/body/CTA texts). No image files are returned; share the url so the user can see and edit the carousel in the Dalea Carousel Studio.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `draftId` | `string` | yes |  |

#### `list_carousel_posts`

`read` `idempotent`

List carousel/video publish jobs sent to Instagram or TikTok: status, scheduled time, per-platform result (permalink or error). Optional status filter.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `status` | `string` | no |  |
| `limit` | `integer` | no |  |

#### `list_video_projects`

`read` `idempotent`

List the brand's video editor projects (name, status queued|processing|preview_ready|ready|failed, language, enabled edits, durations). Each project has a url that opens it in the Dalea video editor: share it when the user wants to watch or adjust a video.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `limit` | `integer` | no |  |

#### `get_video_job_status`

`read` `idempotent`

Get the latest render job of a video editor project: status, stage, progress percent, error code, plus the url of the project in the Dalea video editor.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `projectId` | `string` | yes |  |

### Search & fetch

| Tool | Scope | Summary |
| --- | --- | --- |
| [`search`](#search) | read | Search the user's Dalea workspace: planned/written contents, the reference video catalog, and creators. |
| [`fetch`](#fetch) | read | Fetch the full text of a search result by id (content:<id> = script with hook/body/cta/caption; catalog:<id> = reference video caption + transcript; creator:<id> = creator bio and summary). |

#### `search`

`read` `idempotent`

Search the user's Dalea workspace: planned/written contents, the reference video catalog, and creators. Returns ids to pass to fetch. Use for open-ended questions when you do not know which specific tool applies.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `query` | `string` | yes |  |

#### `fetch`

`read` `idempotent`

Fetch the full text of a search result by id (content:<id> = script with hook/body/cta/caption; catalog:<id> = reference video caption + transcript; creator:<id> = creator bio and summary).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `id` | `string` | yes |  |

### AI actions

| Tool | Scope | Summary |
| --- | --- | --- |
| [`sync_metrics`](#sync_metrics) | write | Fetch fresh metrics from every connected TikTok/Instagram account (platform APIs + scrape). |
| [`generate_title`](#generate_title) | write | AI-generate a working title. |
| [`regenerate_brainstorm`](#regenerate_brainstorm) | write | Replace the brand's active brainstorm set with freshly generated suggestions (optional manualContext steers them). |
| [`generate_insights`](#generate_insights) | write | Regenerate the brand's homepage insights from its synced videos (needs 10+ videos). |
| [`save_reference_by_url`](#save_reference_by_url) | write | Save a TikTok/Instagram video or creator profile URL as a brand reference (scrapes it if unknown; video analysis runs in the background). |
| [`run_creator_deep_analysis`](#run_creator_deep_analysis) | write | Run (or return the cached) AI deep analysis of a saved creator by creatorId. |

#### `sync_metrics`

`write` `6/day`

Fetch fresh metrics from every connected TikTok/Instagram account (platform APIs + scrape). Consumes the daily quota (6/day). Returns per-account counts.

No parameters.

#### `generate_title`

`write` `50/day`

AI-generate a working title. Pass contentId to title an existing content (saves it and returns { content }) or idea for a free-form idea (returns { title }). Consumes the daily quota (50/day, one short AI call).

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | no |  |
| `idea` | `string` | no |  |

#### `regenerate_brainstorm`

`write` `5/day`

Replace the brand's active brainstorm set with freshly generated suggestions (optional manualContext steers them). Consumes the daily quota (5/day, several AI calls). Returns { suggestions } like list_brainstorm_suggestions.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `manualContext` | `string` | no |  |

#### `generate_insights`

`write` `5/day`

Regenerate the brand's homepage insights from its synced videos (needs 10+ videos). Consumes the daily quota (5/day, three AI calls). Returns { insights } like get_homepage_insights.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |

#### `save_reference_by_url`

`write` `30/day`

Save a TikTok/Instagram video or creator profile URL as a brand reference (scrapes it if unknown; video analysis runs in the background). Consumes the daily quota (30/day). Poll with list_saved_references.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `url` | `string` | yes |  |
| `note` | `string` | no |  |

#### `run_creator_deep_analysis`

`write` `10/day`

Run (or return the cached) AI deep analysis of a saved creator by creatorId. Consumes the daily quota (10/day, one long AI call). Returns { analysis } as JSON text; read it later with get_creator_analysis.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `creatorId` | `string` | yes |  |

### Scripts

| Tool | Scope | Summary |
| --- | --- | --- |
| [`generate_scripts`](#generate_scripts) | write | Generate a full AI script (hook, CTA, body and caption options; carousel slides for carousels) for 1-5 content cards and save it to each card. |
| [`generate_hook_options`](#generate_hook_options) | write | Generate up to 3 AI hook (opening line) suggestions for a content card, using the brand's context, memory and references. |
| [`generate_body_options`](#generate_body_options) | write | Generate up to 3 AI body (script development) suggestions for a content card, using the brand's context, memory and references. |
| [`generate_cta_options`](#generate_cta_options) | write | Generate up to 3 AI call-to-action suggestions for a content card, using the brand's context, memory and references. |
| [`generate_caption_options`](#generate_caption_options) | write | Generate up to 3 AI caption suggestions for a content card, using the brand's context, memory and references. |

#### `generate_scripts`

`write` `10/day`

Generate a full AI script (hook, CTA, body and caption options; carousel slides for carousels) for 1-5 content cards and save it to each card. Uses the brand's memory, references, sources and web search when relevant. A card generated in the last 60 seconds is returned as-is (status skipped). Consumes daily quota (10/day). durationSeconds sets the target spoken length. bodyOptions/captionOptions are suggestions to apply with update_content. Each result has a url to the card in Dalea: always share it so the user can open, review and edit the script there.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentIds` | `array<string>` | yes |  |
| `durationSeconds` | `integer` | no |  |
| `objective` | `"followers" \| "reach" \| "engagement" \| "sales" \| "leads" \| "authority"` | no |  |

#### `generate_hook_options`

`write` `30/day`

Generate up to 3 AI hook (opening line) suggestions for a content card, using the brand's context, memory and references. Returns options only, nothing is saved; apply one with update_content. Consumes daily quota (30/day). objective defaults to engagement.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `count` | `integer` | no |  |
| `objective` | `"followers" \| "reach" \| "engagement" \| "sales" \| "leads" \| "authority"` | no |  |

#### `generate_body_options`

`write` `30/day`

Generate up to 3 AI body (script development) suggestions for a content card, using the brand's context, memory and references. Returns options only, nothing is saved; apply one with update_content. Consumes daily quota (30/day). objective defaults to engagement.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `count` | `integer` | no |  |
| `objective` | `"followers" \| "reach" \| "engagement" \| "sales" \| "leads" \| "authority"` | no |  |

#### `generate_cta_options`

`write` `30/day`

Generate up to 3 AI call-to-action suggestions for a content card, using the brand's context, memory and references. Returns options only, nothing is saved; apply one with update_content. Consumes daily quota (30/day). objective defaults to engagement.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `count` | `integer` | no |  |
| `objective` | `"followers" \| "reach" \| "engagement" \| "sales" \| "leads" \| "authority"` | no |  |

#### `generate_caption_options`

`write` `30/day`

Generate up to 3 AI caption suggestions for a content card, using the brand's context, memory and references. Returns options only, nothing is saved; apply one with update_content. Consumes daily quota (30/day). objective defaults to engagement.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `brandId` | `string` | no |  |
| `contentId` | `string` | yes |  |
| `count` | `integer` | no |  |
| `objective` | `"followers" \| "reach" \| "engagement" \| "sales" \| "leads" \| "authority"` | no |  |
