
BrandGhost MCP Server
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 OnlyView 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 OnlyView 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
DestructivePermanently 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 OnlyView 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 OnlyGet 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 OnlyView 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
DestructivePermanently 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
DestructivePermanently 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 OnlyView 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 OnlyView 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 OnlyFetch 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 OnlySearch 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 OnlyGet 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 OnlyAnalyze 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 OnlyCheck 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 OnlyFor 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 OnlyAnalyze 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 OnlyAudit 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 OnlyCheck 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 OnlyRun 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 OnlyView 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)