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': AI content personas with descriptions. 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, and reply/ignore status. Supports filtering by status and platform. Args: - filter ('all' | 'unreplied' | 'replied' | 'ignored'): Filter items by reply status (default: 'all') - 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 with status counts. Examples: - "Show unreplied comments" -> filter="unreplied" - "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. - 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 - 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"}]

brandghost_update_topic_stream_content

Update a content entry in a topic stream. Can change text, enable/disable, or both. 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 - enabled (boolean, optional): Enable or disable this entry 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_get_content_library

Read Only

View saved content in your library. Content can be reused for scheduling posts or adding to topic streams. Args: - content_id (string, optional): Specific content ID to retrieve. Omit to list all. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Content items with text preview, modification date, and media status. Examples: - "Show my saved content" -> no params needed - "Get content abc123" -> content_id="abc123"

brandghost_manage_content_library

Save, update, or delete content in your library. Args: - action ('save' | 'update' | 'delete'): The operation to perform - content_id (string, optional): Content ID. Required for update and delete. - body (string, optional): Post text content. Required for save. - title (string, optional): Optional title for the content. Returns: Content ID on save/update, confirmation on delete. Examples: - "Save this post to my library" -> action="save", body="My post text..." - "Delete content abc123" -> action="delete", content_id="abc123"

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_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. 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 (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. 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" 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 full template content (including post text/structure) for specific template IDs. Use this after listing templates with brandghost_generate_content (action="list_templates") to retrieve the actual template text for selected templates. Templates contain structural post examples with placeholders that guide AI content generation. Args: - template_ids (string[]): Template IDs to fetch (from list_templates). Max 50. - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Full template content for the requested IDs, including the template text/structure. 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_generate_content with action="list_templates" to discover template IDs first.

brandghost_search_content

Read Only

Search your content library using semantic similarity. Returns ranked text chunks from your own blog posts, social posts, and notes that are most relevant to your query. 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: 50) - 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_content_similarity_check

Read Only

Check how similar a piece of content is to your existing content library using semantic search. Useful before adding new content to a topic stream or scheduling a post — surfaces near-duplicates and overlapping angles so you can differentiate or discard. Provide either raw text via 'content' or a saved content ID via 'content_id' (fetches from your content library). Exactly one must be provided. Args: - content (string, optional): Raw post text to check for similarity - content_id (string, optional): Content library ID — fetches PostBody from your library - top_k (number, optional): Max results to return (default: 5, max: 20) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: - Overall verdict: unique / related / similar / likely duplicate - Max similarity score - Top N matches with score, classification label, 120-char preview, and content ID Score thresholds: - >= 0.90 → ⚠️ Very similar (likely duplicate) - >= 0.75 → ⚠️ Similar (overlapping angle) - >= 0.60 → ℹ️ Related (same topic area) - < 0.60 → ✅ Distinct Examples: - "Is this post too similar to something I've written?" -> content="My post text..." - "Check my saved draft for duplicates" -> content_id="abc123"

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_find_content_gaps

Read Only

Check explicit topics against your content library to identify coverage gaps. For each topic, runs a semantic search and classifies how well the topic is covered in your existing content. Coverage thresholds: - ✅ Well covered: max similarity ≥ 0.75 - ⚠️ Lightly covered: max similarity ≥ 0.50 - 🔴 Gap: max similarity < 0.50 — no strong match found Args: - topics (string[], required): Topics to check — e.g. ["dependency injection", "career growth", "async patterns"] - top_k (number, optional): Max matches per topic to return (default: 3) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Per-topic coverage verdict with top matches and similarity scores. Summary gap count. Examples: - "Do I have content about TypeScript generics?" -> topics=["TypeScript generics"] - "Find gaps across these 5 topics" -> topics=["topic1","topic2","topic3","topic4","topic5"] Error Handling: - topics is required; returns error if omitted or empty

brandghost_run_seo_audit

Read Only

Run a comprehensive SEO, AEO (Answer Engine), and GEO (Generative Engine) audit on any live URL. Fetches the page, runs all checks concurrently, and returns a scored report across four categories: - **SEO** (40% weight): title tags, meta descriptions, canonical URLs, heading structure, Open Graph, viewport, www redirect, internal links, HTTPS completeness, title keywords in content - **AEO** (25% weight): FAQ schema, content readability, question formatting, featured snippet readiness - **GEO** (25% weight): llms.txt, AI bot robots.txt access, E-E-A-T signals, structured data completeness - **Performance** (10% weight): page size, response time, image optimization, compression, external resources Args: - url (string): The full URL to audit (must be publicly accessible) - include_performance (boolean, optional): Include performance metrics (default: true) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Scored audit report with per-category scores, per-check results, and a priority fixes list. 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 past SEO audit results for your account. Returns a paginated list of previous audits with their scores. Args: - page (number, optional): Page number (default: 1) - page_size (number, optional): Results per page (default: 10, max: 50) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: List of past audits with URL, date, and overall scores. Examples: - "Show my past SEO audits" -> no params needed - "Have I audited example.com before?" -> no params needed (scan results)