BrandGhost

BrandGhost MCP Server

Beta

Model Context Protocol server for BrandGhost topic stream and content management

Connect

BrandGhost MCP supports Claude and ChatGPT

Available Tools

brandghost_get_workspace_info

Read Only

View your BrandGhost workspace setup: connected social accounts, account groups, and AI personas. This is the starting point for most workflows — use it to discover available accounts before scheduling posts, creating streams, or viewing analytics. Args: - info_type ('all' | 'accounts' | 'groups' | 'personas'): What to retrieve (default: 'all') - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For 'accounts': Connected social accounts with names, platforms, and IDs. For 'groups': Account groups with member accounts. For 'personas': Personas you can mention in post copy via {{@<display handle>}}, with their per-platform handles. For 'all': All of the above. Examples: - "What accounts do I have connected?" -> info_type="accounts" - "Show my workspace setup" -> no params needed - Use before: brandghost_schedule_post, brandghost_manage_topic_stream, brandghost_get_analytics

brandghost_get_calendar

Read Only

View scheduled and posted content from the BrandGhost calendar for a date range. Returns posts with their status (Scheduled, Posted, Failed), content preview, target date/time, and connected social accounts. Defaults to the current week if no dates specified. Args: - start_date (string, optional): Start date in ISO format, UTC (e.g., "2024-01-15"). Defaults to start of current week. - end_date (string, optional): End date (inclusive) in ISO format, UTC (e.g., "2024-01-21"). To query a single day, use the same date for both start and end. Defaults to end of current week. - page (number, optional): Page number for pagination, 1-based (default: 1). - page_size (number, optional): Entries per page (default: 50, max: 100). - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Summary of posts in the date range with status counts and content details. Paginated — check the page/totalPages in the response to fetch further pages. Examples: - "Show me what's scheduled this week" -> no params needed - "What did I post last month?" -> start_date="2024-12-01", end_date="2024-12-31" - "Next page of results" -> add page=2 to the previous call - Don't use when: You want to create or schedule a new post (use brandghost_schedule_post instead) Error Handling: - Returns empty calendar if no posts found in the date range

brandghost_schedule_post

Create and schedule a new social media post to one or more connected accounts. Supports text posts and posts with media (images, videos). Accounts can be referenced by name, platform, or group — no need to look up IDs manually. Args: - body (string): The post text content - social_accounts (string[]): Target accounts by name, platform (e.g., "Twitter"), or group name - schedule_time (string, optional): ISO datetime in UTC (e.g., "2024-02-01T14:00:00Z"). Omit to post immediately. - title (string, optional): Post title (used by some platforms like LinkedIn articles) - media_urls (string[], optional): URLs to images or videos to include Returns: Confirmation with content ID and scheduled time. Examples: - "Post 'Hello world!' to Twitter now" -> body="Hello world!", social_accounts=["Twitter"] - "Schedule a LinkedIn post for tomorrow at 2pm" -> body="...", social_accounts=["LinkedIn"], schedule_time="2024-02-01T14:00:00Z" - Don't use when: You want to add content to a topic stream (use brandghost_add_topic_stream_content) Error Handling: - If account names can't be resolved, suggests using brandghost_get_workspace_info

brandghost_update_scheduled_post

Update a scheduled post that hasn't been published yet. Can change the content, schedule time, or target accounts. Args: - content_id (string): Post content ID (from brandghost_get_calendar) - body (string, optional): Updated post text - title (string, optional): Updated post title - schedule_time (string, optional): New ISO datetime in UTC - social_accounts (string[], optional): Updated target accounts Returns: Confirmation that the post was updated. Error Handling: - Cannot update posts that have already been published - Use brandghost_get_calendar to find content IDs

brandghost_delete_scheduled_post

Destructive

Permanently delete a scheduled post. This cannot be undone. Args: - content_id (string): Post content ID (from brandghost_get_calendar) Returns: Confirmation that the post was deleted. Error Handling: - Cannot delete posts that have already been published

brandghost_get_feed

Read Only

View mentions, comments, and interactions from your connected social media accounts. Returns feed items with content, username, platform, timestamp, source account, and original-post information. Supports filtering by platform. Args: - platform (string, optional): Filter by platform name (e.g., "Twitter", "LinkedIn") - limit (number, optional): Maximum items to return (1-100, default: 20) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Feed items sorted by newest first. Examples: - "Show my latest comments and mentions" -> no parameters - "What's in my Twitter feed?" -> platform="Twitter" - Don't use when: You want to post new content (use brandghost_schedule_post instead)

brandghost_reply_to_feed_item

Reply to a comment or mention in your social media feed. Can search for the item by username or content if you don't have the exact IDs. Args: - reply_text (string): The text content of your reply - feed_item_id (string, optional): Feed item ID from brandghost_get_feed. Provide this OR username/content_search. - social_account_id (string, optional): Social account ID. Auto-detected if feed_item_id provided. - username (string, optional): Search for a feed item by username (used if feed_item_id not provided) - content_search (string, optional): Search for a feed item by content text (used if feed_item_id not provided) - schedule_time (string, optional): ISO datetime in UTC to schedule the reply. Omit to send immediately. Returns: Confirmation that the reply was scheduled or sent. Examples: - "Reply to the latest comment from @john" -> username="john", reply_text="Thanks!" - "Reply to the feed item about product launch" -> content_search="product launch", reply_text="..." Error Handling: - If no matching feed item found, suggests using brandghost_get_feed to browse items

brandghost_get_topic_stream_info

Read Only

Get information about topic streams — automated content rotation queues that post on a schedule. Use info_type "list" to see all streams, or "details" for a specific stream's config. Args: - info_type ('list' | 'details'): What to retrieve (default: 'list') - stream_id (string, optional): Stream name or ID. Required for 'details'. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For 'list': All streams with enabled status, content count, posting frequency. For 'details': Stream config, schedule, connected accounts, fields. Examples: - "List my topic streams" -> info_type="list" - "Show the schedule for my Marketing stream" -> info_type="details", stream_id="Marketing" Error Handling: - If stream_id doesn't match, returns available streams with names and IDs

brandghost_get_topic_stream_content

Read Only

View content entries in a topic stream with full post bodies and MCP-side pagination. Returns complete post content — no field trimming or previews. All fields from the API are passed through untouched. Args: - stream_id (string): Stream name or ID - page (number, optional): Page number, 1-based (default: 1) - page_size (number, optional): Entries per page (default: 20, max: 100) - enabled_only (boolean, optional): Filter to enabled entries only (default: false) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Paginated content entries with complete post bodies, enabled status, timestamps, and all macro values. Examples: - "Show content in my Tips stream" -> stream_id="Tips" - "Page 2 of stream content" -> stream_id="Tips", page=2 - "Show only enabled posts" -> stream_id="Tips", enabled_only=true Error Handling: - If stream_id doesn't match, returns available streams with names and IDs

brandghost_manage_topic_stream

Create, update, or enable/disable a topic stream. Use action "create" for new streams, "update" to modify, "enable" or "disable" to toggle. Streams can be referenced by name. Args: - action ('create' | 'update' | 'enable' | 'disable'): The operation to perform - stream_id (string, optional): Stream name or ID. Required for update/enable/disable. - name (string, optional): Stream name. Required for create. - description (string, optional): Stream description. - social_accounts (string[], optional): Target accounts by name, platform, or group. Required for create. - schedule (object, optional): Weekly schedule with day names as keys and "HH:MM" UTC times as values. Required for update because the backend replaces the complete schedule. - min_days_before_repeat (number, optional): Minimum days before content can repeat. Default: 7. Returns: Confirmation with stream ID on create, success message on update/enable/disable. Examples: - "Create a stream posting to Twitter at 9am Mon/Wed/Fri" -> action="create", name="My Stream", social_accounts=["Twitter"], schedule={"monday":["09:00"],"wednesday":["09:00"],"friday":["09:00"]} - "Pause my Marketing stream" -> action="disable", stream_id="Marketing" Error Handling: - If account names don't resolve, suggests using brandghost_get_workspace_info

brandghost_delete_topic_stream

Destructive

Permanently delete a topic stream and all its content. This action cannot be undone. Args: - stream_id (string): Stream name or ID to delete. Returns: Confirmation that the stream was deleted.

brandghost_add_topic_stream_content

Add one or more content entries to a topic stream. Each entry becomes a post that rotates on the stream's schedule. Args: - stream_id (string): Stream name or ID - entries (array): Content entries to add. Each has: - body (string): Post text content (sets the PostBody field) - fields (object, optional): Additional per-entry fields as a map of field name -> string value. Open-ended — any field the target platforms support can be set. Do NOT include "PostBody" here; use "body" instead. Common fields: "Title", "youtube-title", "reddit-title", "pinterest-title", "youtube-privacy", "BoardIds" (Pinterest board targeting), "channelIds", "AutoRepost", "PostToStory". - enabled (boolean, optional): Whether entry is active (default: true) Returns: Confirmation with count of entries added. Examples: - "Add 3 tips to my Tips stream" -> stream_id="Tips", entries=[{body:"Tip 1"},{body:"Tip 2"},{body:"Tip 3"}] - With per-platform titles -> entries=[{body:"Caption", fields:{"youtube-title":"My Title","youtube-privacy":"public"}}]

brandghost_update_topic_stream_content

Update a content entry in a topic stream. Can change the post text, set additional per-entry fields, enable/disable, or any combination. Args: - stream_id (string): Stream name or ID containing the content - content_id (string): Content entry ID (from brandghost_get_topic_stream_content) - body (string, optional): Updated post text (sets the PostBody field) - fields (object, optional): Additional per-entry fields to set, as a map of field name -> string value. Merged on top of the entry's existing fields, so fields you don't include are left unchanged. Open-ended — any field the target platforms support can be set. Do NOT include "PostBody" here; use "body" instead. Common fields: "Title", "youtube-title", "reddit-title", "pinterest-title", "youtube-privacy", "BoardIds" (Pinterest board targeting), "channelIds", "AutoRepost", "PostToStory". - enabled (boolean, optional): Enable or disable this entry Provide at least one of body, fields, or enabled. Omitting enabled leaves the entry's enabled state unchanged. Returns: Confirmation that the entry was updated.

brandghost_delete_topic_stream_content

Destructive

Permanently delete a content entry from a topic stream. This cannot be undone. Args: - content_id (string): Content entry ID (from brandghost_get_topic_stream_content) Returns: Confirmation that the entry was deleted.

brandghost_list_content_library

Read Only

List visible Content Library items using cursor pagination, generic field filters, sorting, and facets. The result includes content owned by the authenticated account and content shared with it. Filters are combined with logical AND; within one filter, multiple fields are combined with logical OR. Args: - cursor (string, optional): Opaque next_cursor from a previous response - limit (number, optional): Items per page (default: backend default, max: 200) - sort_field (string, optional): Generic content field to sort by; omit for modification time - sort_direction ('asc' | 'desc', optional): Sort direction - filters (array, optional): Structured filters with fields, mode ('contains' or 'equals'), and value - facet_fields (string[], optional): Generic fields for which value counts should be returned - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: A page containing items, total matching count, next cursor, and requested facet counts. Examples: - List recent items: limit=25 - List articles: filters=[{fields:["PostType"],mode:"equals",value:"Article"}] - Search all fields and count types: filters=[{mode:"contains",value:"launch"}], facet_fields=["PostType"]

brandghost_get_content_library_item

Read Only

Get one visible Content Library item at its latest or a specific revision. Use exactly one of these lookup forms: - content_id only: latest revision - content_id plus revision: specific numeric revision (starting at 0) - content_revision_id only: specific immutable revision Args: - content_id (string, optional): Stable Content Library item ID - revision (number, optional): Numeric revision; requires content_id - content_revision_id (string, optional): Immutable revision ID; use without content_id or revision - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Ownership, resolved revision metadata, all generic fields, and media previews. Examples: - Latest: content_id="123" - Numeric revision: content_id="123", revision=2 - Immutable revision: content_revision_id="456"

brandghost_create_content_library_item

Create one Content Library item from a generic field map. Fields are open-ended string key/value pairs. Use whichever fields the intended content type and publishing platforms require, such as PostBody, PostType, Title, youtube-title, ResourceIds, Tags, or article-specific fields. Args: - fields (object): Generic field name -> string value map with at least one entry - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The stable content ID of the created item. Example: fields={"PostBody":"Draft text","PostType":"Text","Title":"Draft title"}

brandghost_update_content_library_item

Destructive

Patch generic fields on an existing Content Library item. Only supplied fields are changed; omitted fields remain unchanged. An empty or whitespace-only value removes that field from the item. Args: - content_id (string): Stable Content Library item ID - fields (object): Generic field patches as field name -> string value - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The stable content ID of the updated item. Examples: - Set fields: fields={"Title":"New title","Tags":"launch,product"} - Remove a field: fields={"LegacyField":""}

brandghost_delete_content_library_item

Destructive

Permanently delete one owned Content Library item and all of its revisions. Args: - content_id (string): Stable Content Library item ID Returns: Confirmation that the item no longer exists. Deleting an already-missing item is treated as successful.

brandghost_get_launchpad_knowledge_base

Read Only

Get the aggregate Launchpad knowledge base for one business. The backend returns every modeled KB area in one response: structured strategy, insights, brand story, personas, voice and tone, proof points, objections, FAQ, competitors, differentiation, press, snapshots, and growth portfolio items. Filtering is performed locally after that aggregate read. Args: - business_id (string): Launchpad business ID that owns the knowledge base - sections (string[], optional): Limit output to selected top-level sections - snapshot_types (string[], optional): Within snapshots, retain only social_audit, top_posts, strategic_analysis, and/or synthesis_brief - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The business ID and company name plus each requested section. Snapshot entries include their canonical type and complete Markdown content. Examples: - Get the complete KB -> business_id="123" - Get only strategic analysis -> sections=["snapshots"], snapshot_types=["strategic_analysis"] - Get brand voice and personas -> sections=["voice_and_tone","personas"] Error Handling: - Returns the API error when the business does not exist or is not accessible. - If the result is too large, request fewer sections or snapshot types.

brandghost_update_launchpad_knowledge_base

Destructive

Apply backend-native write operations to one Launchpad knowledge base. Operations run sequentially in array order and are not transactional. The tool stops at the first failure; earlier operations remain persisted and later operations are not attempted. Use replace_strategy, replace_insights, replace_brand_story, replace_voice_and_tone, or replace_differentiation for structured singleton areas. These are COMPLETE replacements: omitted nullable values are cleared and omitted collections become empty. Use create_* to add collection entries, or update_* with item_id to fully replace an existing persona, proof point, objection, FAQ entry, or competitor profile. Before any mutation, all update_* IDs are checked against the target business; a mismatch rejects the whole request. Create operations are not safe to retry blindly because they can create duplicates. Use upsert_snapshot for Markdown documents. strategic-analysis.md maps to snapshot_type="strategic_analysis"; strategy/_synthesis-brief.md maps to snapshot_type="synthesis_brief". These are distinct from the structured strategy area. Args: - business_id (string): Launchpad business ID that owns the knowledge base - operations (array, 1-50): Ordered backend-native mutations - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Completed operation indexes, operation names, resource IDs, update timestamps, and—if a call fails—the failed index, backend error, and number of operations not attempted. Examples: - Persist strategic analysis -> operations=[{"operation":"upsert_snapshot","snapshot_type":"strategic_analysis","content_markdown":"# Strategic Analysis\n..."}] - Add an FAQ -> operations=[{"operation":"create_faq","payload":{"category":"Product","question":"How does it work?","answer":"..."}}] Error Handling: - Invalid operation shapes are rejected before any API call. - A backend failure returns isError=true with partial-progress details. Read the KB before retrying create operations.

brandghost_get_analytics

Read Only

View performance analytics for your social accounts and posts. Use scope "accounts" for social account metrics over time, "posts" for post-level performance, or "snapshot" to trigger a fresh data refresh from platforms. Args: - scope ('accounts' | 'posts' | 'snapshot'): Type of analytics to retrieve - start_date (string, optional): Start date in ISO format, UTC. Required for 'accounts'. Default: 30 days ago. - end_date (string, optional): End date in ISO format, UTC. Default: today. - social_accounts (string[], optional): Filter by account names or platforms (for 'accounts'/'snapshot') - post_ids (string[], optional): Grouped post IDs for 'posts' scope. Alternative to using start_date/end_date. - metrics (string[], optional): Metric names to filter (e.g., "followers", "impressions") - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For 'accounts': Metric series over time grouped by account. For 'posts': Per-platform metrics grouped by grouped post ID. Does NOT include post content — use brandghost_get_calendar to get post bodies and grouped post IDs. For 'snapshot': Confirmation that data refresh was triggered. Examples: - "How did my Twitter grow this month?" -> scope="accounts", social_accounts=["Twitter"] - "Show metrics for post abc123" -> scope="posts", post_ids=["abc123"] - "What were my best posts last month?" -> scope="posts", start_date="2026-01-01", end_date="2026-01-31" - "Refresh my analytics data" -> scope="snapshot" Error Handling: - If no post_ids provided for 'posts' scope, suggests using brandghost_get_calendar

brandghost_list_post_templates

Read Only

List stored BrandGhost post templates for structural/style analysis. This read-only tool retrieves persisted template metadata through the existing template API. Templates are style/structure examples, not factual sources. Args: - active_status ('all' | 'active' | 'inactive', optional): Filter by active status (default: 'all') - post_type (string, optional): Filter by post type when present (for example: "Text") - social_platform_id (string, optional): Filter by social platform ID when present - template_scope ('all' | 'system' | 'user', optional): Filter by ownership scope (default: 'all') - limit (number, optional): Maximum templates to return (default: 25, max: 100) - offset (number, optional): Number of matched templates to skip (default: 0) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: A bounded list of template metadata with stable fields: id, name, description, socialPlatformId, postType, isActive, isSystemTemplate. Next Step: Use brandghost_get_template_content with selected IDs to fetch full stored template text.

brandghost_generate_content

Generate social media content using BrandGhost's AI engine. Can generate standalone posts, add AI-generated content directly to a topic stream, remix existing content, or list available content templates for backward compatibility. Args: - action ('generate' | 'generate_into_stream' | 'remix' | 'list_templates'): What to do - topics (string[], optional): Topics to write about (for 'generate'/'generate_into_stream') - count (number, optional): Number of posts to generate, or posts per topic for generate_into_stream (default: 3, max: 10) - template_ids (string[], optional): Template IDs to use as style guide - stream_id (string, optional): Target stream name or ID (for 'generate_into_stream') - content_to_remix (string, optional): Existing text to remix (for 'remix') - content_id (string, optional): Existing content ID to remix (for 'remix') - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: For 'generate'/'remix': Generated content text(s) ready to schedule or save. For 'generate_into_stream': Confirmation with number of entries added. For 'list_templates': Available content templates (legacy listing action). Examples: - "Write 5 tweets about AI trends" -> action="generate", topics=["AI trends"], count=5 - "Add posts about productivity to my Tips stream" -> action="generate_into_stream", stream_id="Tips", topics=["productivity"] - "Remix this post in a different style" -> action="remix", content_to_remix="..." - "What templates are available?" -> action="list_templates" (legacy; prefer brandghost_list_post_templates) Error Handling: - For 'generate_into_stream': stream_id is required. Use brandghost_get_topic_stream_info to list streams.

brandghost_get_template_content

Read Only

Fetch persisted template content (including post text/structure) for specific template IDs. Use this after listing templates with brandghost_list_post_templates to retrieve stored template text for selected templates. This tool only reads persisted template records and never triggers BrandGhost AI generation. Args: - template_ids (string[]): Template IDs to fetch (from brandghost_list_post_templates). Max 50. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Full persisted template content for the requested IDs, including templateContent exactly as stored. Examples: - "Show me the template content for IDs 123 and 456" -> template_ids=["123", "456"] - "Get template details in JSON" -> template_ids=["123"], response_format="json" Error Handling: - If template_ids is empty, returns an error. Use brandghost_list_post_templates to discover template IDs first.

brandghost_search_content_library

Read Only

Search visible Content Library items using semantic similarity. Returns ranked text chunks from owned and shared content. Args: - query (string): The search query — a topic, phrase, or question to find relevant content for - top_k (number, optional): Maximum number of results to return (default: 10, max: 100) - min_score (number, optional): Minimum similarity score threshold, 0.0 to 1.0 (default: 0.0) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Ranked content chunks with similarity scores and full text. Examples: - "Find my content about dependency injection" -> query="dependency injection" - "What have I written about testing?" -> query="testing strategies", top_k=5 - "Find highly relevant content only" -> query="...", min_score=0.7

brandghost_get_follower_metrics

Read Only

Get follower counts and growth data for your connected social accounts. Returns per-account follower metrics over a time period with computed growth values. Does not interpret or rank the data — returns computed metrics only. Args: - days (number, optional): Lookback period in days (default: 30, max: 365) - social_accounts (string[], optional): Filter by account names or platforms - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Per-account follower data: current count, starting count, absolute growth, growth percentage, and average daily growth. Examples: - "How are my followers trending?" -> no params needed - "LinkedIn follower growth this quarter" -> social_accounts=["LinkedIn"], days=90 - "All platform follower data for the year" -> days=365

brandghost_posting_cadence_analysis

Read Only

Analyze your posting consistency and surface gaps or underserved platforms. Fetches calendar entries for a date range and computes per-account statistics: post counts, day-of-week and hour-of-day distributions, longest consecutive zero-post gap, and which platforms are underserved relative to your average posting rate. Args: - start_date (string, optional): Start date in ISO format, UTC. Default: 30 days ago. - end_date (string, optional): End date in ISO format, UTC. Default: today. - social_accounts (string[], optional): Filter by account names, platforms, or groups. Default: all accounts. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - Per-account: total posts, last posted date, next scheduled date, top posting days - Overall: avg posts/day, longest gap with dates - Underserved platforms (< 50% of mean per-account post count) Examples: - "Am I posting consistently?" -> no params needed - "How is my Twitter cadence this month?" -> social_accounts=["Twitter"], start_date="2026-02-01" - "Show my posting gaps this quarter" -> start_date="2026-01-01", end_date="2026-03-31"

brandghost_cross_platform_post_comparison

Read Only

For one or more grouped posts, compare performance across platforms normalized by audience size. Fetches per-platform metrics (impressions, likes, replies, reposts) and current follower counts, then computes reach rate (impressions ÷ followers) and engagement rate ((likes+replies+reposts) ÷ followers) per platform. Ranks platforms so you can see which responded best relative to your audience. Note: follower counts are current approximations — not the exact count at the time of posting. Args: - grouped_post_ids (string[], required): One or more grouped post IDs (from brandghost_get_calendar or brandghost_get_analytics) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - Per post: table of platform metrics with reach rate and engagement rate - Best-for-engagement and best-for-reach platform callouts - Posts without metrics listed separately (no snapshot stored yet) Examples: - "Which platform did best for my post?" -> grouped_post_ids=["1459517366206173184"] - "Compare two posts across platforms" -> grouped_post_ids=["id1", "id2"]

brandghost_content_performance_patterns

Read Only

Analyze what makes your best posts perform well by correlating content attributes with engagement metrics. Fetches posted content from the calendar in a date range, retrieves stored metrics for those posts, then groups by content type (image/video/text/link), length bucket, time of day, and day of week. Computes average impressions and engagement per bucket to surface actionable patterns. Important: patterns are only as reliable as your metric snapshot coverage. The response always shows how many posts have metrics vs total. Args: - start_date (string, optional): Start date in ISO format, UTC. Default: 90 days ago. - end_date (string, optional): End date in ISO format, UTC. Default: today. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - Coverage summary: N of M posted posts have metrics - Pattern tables: avg impressions + engagement by content type, length, time of day, day of week - Top-performing bucket callout per dimension - Insufficient data warning if fewer than 3 posts have metrics Examples: - "What makes my posts perform best?" -> no params needed (uses last 90 days) - "Analyze my content patterns for 2026" -> start_date="2026-01-01", end_date="2026-12-31"

brandghost_stream_health_audit

Read Only

Audit all topic streams for content runway — how many days before content starts repeating. For each stream: computes enabled post frequency from the schedule and runway days before repeat (enabledContentCount × minDaysBeforeRepeat ÷ postsPerWeek). Health flags: - 🔴 Critical: < 7 days of runway, or active schedule with zero content - 🟡 Low: 7–13 days of runway - 🟢 Healthy: ≥ 14 days of runway - ⚪ Inactive: stream is disabled or has no enabled schedule slots Args: - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Per-stream health report with runway days, post frequency, and health flag. Summary counts by flag. Examples: - "How healthy are my topic streams?" -> no params needed - "Which streams need more content?" -> no params needed

brandghost_run_seo_audit

Run and store a comprehensive SEO, AEO (Answer Engine), GEO (Generative Engine), social-discovery, and performance audit on any live URL. BrandGhost fetches the page, evaluates its backend-defined weighted categories concurrently, and persists the completed result in the authenticated account's audit history. Args: - url (string): The full HTTP or HTTPS URL to audit - include_performance (boolean, optional): Include performance metrics (default: true) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: A scored audit with category weights, per-check status and severity, recommendations, structured evidence, violations, priority fixes, and available performance metrics. Examples: - "Audit my site" -> url="https://mybrand.com" - "Check SEO on this page" -> url="https://mybrand.com/blog/my-post"

brandghost_get_seo_audit_history

Read Only

View persisted SEO audit results for your account. Returns a paginated list of previous audits with SEO, GEO, AEO, Social, Performance, and overall scores. Args: - page (number, optional): Page number (default: 1) - page_size (number, optional): Results per page (default: 10, max: 100) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Previous audit URLs, identifiers, timestamps, category scores, and pagination metadata. Examples: - "Show my past SEO audits" -> no params needed - "Have I audited example.com before?" -> no params needed (scan results)

brandghost_transcribe_videos

Submit one or many videos for on-demand transcription. **Asynchronous:** this returns a job id immediately and does NOT wait for transcription to finish. The whole batch is scheduled as a single job. Media that already has a transcript is skipped unless you set `force`, and duplicate in-flight submissions are de-duped. On completion the backend creates a transcript content entry per media resource. To observe completion, poll `brandghost_get_job_status` with the returned `jobExecutionId` (transcription can take many minutes — poll with backoff), then read the outcome with `brandghost_get_job_result`. You can also re-check that transcript entries now exist for the media (naturally idempotent). Args: - media_fqbns (string[]): One or more **owner-qualified** media FQBNs in the form "<userId>/<resourceId>" (e.g. "auth0|abc123/52cfb90c-ea7e-4a5b-87a8-bf31e9ff9756"). This is the exact `Fqbn` value found in a content entry's `ResourceIds` part — pass it through verbatim. Bare resource ids are NOT accepted. - force (boolean, optional): Re-transcribe even if a transcript already exists (default: false). - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The scheduled job id plus how many media were scheduled vs. skipped as already in flight. Examples: - "Transcribe these clips" -> media_fqbns=["auth0|abc/52cfb90c-...","auth0|abc/59240aec-..."] - "Re-transcribe this video even if it already has a transcript" -> media_fqbns=["auth0|abc/a0821efe-..."], force=true

brandghost_get_job_status

Read Only

Check the progress/status of a long-running async job by its job id. Generic across any async BrandGhost job (e.g. video transcription, async SEO audit, embedding jobs) — not transcription-only. Use it to poll a job started by a tool such as `brandghost_transcribe_videos`. Long jobs can run for many minutes, so poll with backoff rather than tightly looping. Args: - job_id (string): The job id returned when the job was submitted (e.g. `jobExecutionId`). - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Progress (0..1), status, and last-updated time. An unknown/expired job is reported as a clean "not found" message (not an error) so pollers can keep going. Examples: - "Is job 12345 done yet?" -> job_id="12345" - "Check transcription progress" -> job_id="<jobExecutionId from brandghost_transcribe_videos>"

brandghost_get_job_result

Read Only

Fetch the result of a completed async job by its job id. Generic across any async BrandGhost job (e.g. video transcription, async SEO audit, embedding jobs) — not transcription-only. Call this once `brandghost_get_job_status` reports the job complete. Args: - job_id (string): The job id returned when the job was submitted (e.g. `jobExecutionId`). - response_format ('markdown' | 'json'): Output format (default: 'json') Returns: The job's result payload. If the job is unknown, still running, or produced no result, this is reported as a clean "no result" message (not an error) so pollers can keep going. Examples: - "Get the result of job 12345" -> job_id="12345"

brandghost_list_personas

Read Only

List the personas in your workspace. A persona is who post copy mentions via the {{@<display handle>}} token. Use this to confirm a collaborator's persona exists (and see its per-platform handles) before authoring a {{@...}} mention. Args: - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: One entry per persona with its id, display (mention) handle, fallback name, and per-platform handles. Examples: - "List my personas" -> no params needed - "Does a persona for Grace Hopper exist?" -> list and scan display handles

brandghost_get_persona

Read Only

Fetch a single persona by its display (mention) handle, optionally scoped to a platform. Note: the backend looks up personas by handle (not by id). Provide the display handle that {{@...}} would use; add social_platform_id to fetch that platform's handle specifically. A persona that doesn't exist is reported as a clean "not found". Args: - handle (string): The persona's display/mention handle (what {{@<handle>}} resolves). - social_platform_id (string, optional): Numeric SocialPlatformId (e.g. "222" for Twitter) to fetch that platform's handle. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The persona's id, display handle, fallback name, and (when a platform is given) that platform's handle. A persona that doesn't exist is reported as a clean "not found" message. Examples: - "Get the persona for Grace Hopper" -> handle="Grace Hopper" - "What is Grace Hopper's Twitter handle?" -> handle="Grace Hopper", social_platform_id="222"

brandghost_create_persona

Create a persona that post copy can mention via {{@<display handle>}}. `handles` maps a numeric SocialPlatformId to the per-platform handle resolved at post time, e.g. { "222": "@gracehopper", "444": "grace-hopper" }. An unparseable platform id is rejected by the backend. Args: - display_name (string): Display name; also the {{@...}} mention text unless handle_for_posting is set. - handle_for_posting (string, optional): Mention/display handle (defaults to display_name). - fallback_name (string, optional): Fallback name used when a platform handle is missing (defaults to display_name). - email (string, optional): Contact email for the persona. - handles (object, optional): Per-platform handles keyed by SocialPlatformId. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The new persona's id. Examples: - Create with a Twitter handle -> display_name="Grace Hopper", handles={"222":"@gracehopper"}

brandghost_update_persona

Update a persona's display name, fallback name, email, and/or platform handles. Handles: if `handles` is provided it REPLACES the persona's full set of platform handles. If `handles` is omitted, the persona's existing handles are preserved (this tool re-reads and resends them). To change a single handle without resending all, use `brandghost_add_persona_handle` / `brandghost_remove_persona_handle` instead. Args: - persona_id (string): The id of the persona to update. - display_name (string): New display name; also the {{@...}} mention text unless handle_for_posting is set. - handle_for_posting (string, optional): Mention/display handle (defaults to display_name). - fallback_name (string, optional): Fallback name (defaults to display_name). - email (string, optional): Contact email for the persona. - handles (object, optional): Full replacement set of per-platform handles keyed by SocialPlatformId. Omit to preserve existing handles. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The updated persona's id. Examples: - Rename only (handles preserved) -> persona_id="150...", display_name="Grace B. Hopper" - Replace handles -> persona_id="150...", display_name="Grace Hopper", handles={"222":"@grace"}

brandghost_delete_persona

Destructive

Delete a persona by id. This removes the persona and all its platform handles; {{@...}} mentions that referenced it will no longer resolve. Args: - persona_id (string): The id of the persona to delete. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Whether a persona was deleted. Examples: - "Delete persona 150..." -> persona_id="150..."

brandghost_add_persona_handle

Add or set a single per-platform handle on an existing persona, without resending the persona's other handles. Args: - persona_id (string): The id of the persona. - social_platform_id (string): Numeric SocialPlatformId (e.g. "222" for Twitter). - handle (string): The per-platform handle to set for that platform. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The persona's id. Examples: - Add a Twitter handle -> persona_id="150...", social_platform_id="222", handle="@gracehopper"

brandghost_remove_persona_handle

Destructive

Remove a single per-platform handle from an existing persona. The persona's other handles are unaffected. Args: - persona_id (string): The id of the persona. - social_platform_id (string): Numeric SocialPlatformId of the handle to remove (e.g. "222" for Twitter). - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: The persona's id. Examples: - Remove the Twitter handle -> persona_id="150...", social_platform_id="222"