Documentation
Brand Mentality MCP Server - Client Documentation
The Brand Mentality MCP Server enables the intersection of real-time data listening and brand perception. The server provides Model Context Protocol (MCP) tools that allow clients to add these capabilities in conjunction with their existing data stack, enabling AI assistants and applications to access comprehensive brand profiles, discover cultural trends, and gather real-time insights from news articles and social media posts.
Key Capabilities
- Brand Intelligence: Access detailed brand profiles including values, mission, vision, and brand positioning
- Cultural Trend Analysis: Discover macro cultural trends and patterns by aggregating news moments and social media narratives
- Real-Time News Insights: Find clustered news moments (day-to-day events) and search individual news articles
- Social Media Intelligence: Track social media narratives (day-to-day conversations) and analyze individual posts
- TikTok Trend Discovery: Get trending TikTok hashtags filtered by category, date range, country, and optional search terms
- YouTube Intelligence: Search YouTube videos and channels from a curated dataset with filtering by language, country, categories, and engagement metrics
- Audience Targeting: Generate platform-specific audience targeting segments for ad campaigns across multiple platforms
Data Hierarchy
The server organizes data in a hierarchical structure:
- Individual Level: Articles and social media posts provide detailed, granular content
- Cluster Level: Moments (news clusters) and Narratives (social media clusters) group related content
- Trend Level: Trends aggregate moments and narratives to reveal long-term cultural patterns
Social Posts ──► Narratives ──┐
│
├──► Trends
│
Articles ──► Moments ────────┘Hierarchy:
- Social Posts → Clustered into Narratives (day-to-day conversations)
- Articles → Clustered into Moments (day-to-day news events)
- Narratives + Moments → Aggregated into Trends (long-term cultural patterns)
Connection
Protocol: Model Context Protocol (MCP) over HTTP Port: 8080 (default) Authentication: Authorization: Bearer <ACCESS_TOKEN>
All requests require the authentication token in the Authorization header.
Optional Headers:
X-Include-Image-URLs(case-insensitivetrue): adds animage_urlfield to each result item returned byget_news_articles,get_youtube_videos,get_youtube_channels,get_news_moments, andget_trends. When the header is absent,image_urlis omitted to keep responses lean. Set it only if your client renders images.
Credentials: The MCP server URL and Access token will be provided by Sightly.
Note: The authorization method may change in future versions.
Array Parameters
Every parameter documented as an array below also accepts a string, for clients that cannot send real JSON arrays:
- A JSON-encoded array, such as
"[\"Nike\", \"Adidas\"]", is parsed into the equivalent array. - Any other string, such as
"Nike", is treated as a single-element array.
Sending a real array is still preferred. The documented maximum item counts apply either way, and values are never split on commas, so "Nike, Adidas" is one value rather than two.
get_brand_profile1 params - 1 example
Get brand information, values, mission, and related entities.
Note: Brand profiles must be created in Brand Mentality before they can be retrieved via this tool.
Parameters:
brand_name(string, required): Brand name
Example:
{
"tool": "get_brand_profile",
"arguments": {
"brand_name": "Nike"
}
}get_trends8 params - 2 examples
Discover macro cultural trends (long-term patterns).
Parameters:
search_terms(array, 0-3 terms, optional): Search terms. If not provided, returns top trends sorted by total article count (biggest trends first). When provided, do NOT also sendsort_by— the two parameters are mutually exclusivestart_date(string, optional): YYYY-MM-DD format, earliest 2026-01-01end_date(string, optional): YYYY-MM-DD format, earliest 2026-01-01brand(array, optional): Filter by brand names in top 10 brands (max 5)person(array, optional): Filter by person names in top 10 people (max 5)sort_by(string, optional): Mutually exclusive withsearch_terms— sending both returns an error. Omit this parameter wheneversearch_termsis provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values:"size"(default) = total article count (biggest trends first);"recency"= most recent trends first. Use"recency"only when the user explicitly requests chronological orderinglimit(int, optional): Results per search term (default: 3, max: 5)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statistics
Example with search terms:
{
"tool": "get_trends",
"arguments": {
"search_terms": ["AI", "automation"],
"brand": ["Microsoft", "Google"],
"limit": 5
}
}Example without search terms (browse top trends):
{
"tool": "get_trends",
"arguments": {
"start_date": "2024-11-01",
"end_date": "2024-11-30",
"limit": 5
}
}get_news_moments8 params - 3 examples
Find clustered news articles about topics (day-to-day events).
Parameters:
search_terms(array, 0-3 terms, optional): Search terms. If not provided, returns top moments sorted by article count (biggest story clusters first). When provided, do NOT also sendsort_by— the two parameters are mutually exclusivestart_date(string, optional): UTC ISO datetimeYYYY-MM-DDTHH:MM:SS, earliest2026-01-01T00:00:00. Supports hour/minute precision — for a whole-day search useT00:00:00end_date(string, optional): UTC ISO datetimeYYYY-MM-DDTHH:MM:SS, earliest2026-01-01T00:00:00. For a whole-day search useT23:59:59category(array, optional): Filter by content categories (max 5)entity(array, optional): Filter by entity names (max 5)sort_by(string, optional): Mutually exclusive withsearch_terms— sending both returns an error. Omit this parameter wheneversearch_termsis provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values:"size"(default) = article count (biggest story clusters first);"recency"= most recent moments first. Use"recency"only when the user explicitly requests chronological orderinglimit(int, optional): Results per search term (default: 8, max: 20)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statistics
Example with search terms:
{
"tool": "get_news_moments",
"arguments": {
"search_terms": ["climate change"],
"start_date": "2024-01-01T00:00:00",
"end_date": "2024-01-31T23:59:59",
"category": ["environment"],
"limit": 10
}
}Example narrowing to a specific hour band:
{
"tool": "get_news_moments",
"arguments": {
"search_terms": ["breaking news"],
"start_date": "2026-05-13T08:00:00",
"end_date": "2026-05-13T10:00:00",
"limit": 10
}
}Example without search terms (browse top moments):
{
"tool": "get_news_moments",
"arguments": {
"start_date": "2024-01-01T00:00:00",
"end_date": "2024-01-31T23:59:59",
"limit": 10
}
}get_social_media_narratives13 params - 2 examples
Find clustered social media posts about topics (day-to-day conversations).
Parameters:
search_terms(array, 0-3 terms, optional): Search terms. If not provided, returns top narratives sorted by post count (most discussed first). When provided, do NOT also sendsort_by— the two parameters are mutually exclusivestart_date(string, optional): YYYY-MM-DD format, earliest 2026-01-01end_date(string, optional): YYYY-MM-DD format, earliest 2026-01-01sentiment(string, optional): Filter by sentiment:very_positive,positive,neutral,negative,very_negativeplatform(array, optional): Filter by platforms (max 5): X, Reddit, Truth Social, Pinterest, Instagram, Bluesky, TikTok, Threadstheme(array, optional): Filter by themes (max 5): discounts, purchase, appearance, churn, cost, ads, experience, craftmanship, transaction, criminal, loyalty, stock, taste, temperature, ambiance, delivery, fit, injury, knowledge, leadership, comfort, access, illness, location, restrooms, speed, satisfaction, wait times, cleanliness, durability, friendliness, selectionentity(array, optional): Filter to narratives about a specific named person, brand, organization, product, event, or place (max 5) — e.g.["Messi", "Nike"]. Case-insensitive substring; multiple values OR'd. Covers the ~two-thirds of narratives where an entity was detected. For broad topics/moods, usesearch_termsinstead.min_likes(int, optional): Only return narratives whose posts have at least this many likes in total (cluster-level engagement floor, must be ≥ 0). Narratives with no like total are excluded.min_comments(int, optional): Only return narratives whose posts have at least this many comments in total (cluster-level engagement floor, must be ≥ 0). Narratives with no comment total are excluded.min_shares(int, optional): Only return narratives whose posts have at least this many shares/reposts in total (cluster-level engagement floor, must be ≥ 0). Coverage is partial (present on roughly a quarter of narratives), so this can sharply narrow results — prefermin_likes/min_commentsfor general engagement filtering.sort_by(string, optional): Mutually exclusive withsearch_terms— sending both returns an error. Omit this parameter wheneversearch_termsis provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values:"size"(default) = post count (most discussed first);"recency"= most recent narratives first. Use"recency"only when the user explicitly requests chronological orderinglimit(int, optional): Results per search term (default: 8, max: 20)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statistics
Each returned narrative includes a sentiment_score — the cluster's overall sentiment on a -100 (most negative) to 100 (most positive) scale (omitted when unavailable). The sentiment filter buckets this score: very_negative (< -75), negative (< -25), neutral (-25…25), positive (> 25), very_positive (> 75). Each narrative also includes cluster-level engagement totals total_likes, total_comments, and total_shares (omitted when unavailable).
Example with search terms:
{
"tool": "get_social_media_narratives",
"arguments": {
"search_terms": ["AI"],
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"sentiment": "positive",
"platform": ["X", "Reddit"]
}
}Example without search terms (browse top narratives):
{
"tool": "get_social_media_narratives",
"arguments": {
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"platform": ["X"],
"limit": 10
}
}get_news_articles10 params - 3 examples
Search individual news articles (detailed content).
Parameters:
search_terms(array, 0-3 terms, optional): Keep complete concepts together (e.g., "renewable energy policy" not ["renewable", "energy"]). If not provided, returns most recent articles sorted by publish datestart_date(string, optional): UTC ISO datetimeYYYY-MM-DDTHH:MM:SS, earliest2026-01-01T00:00:00. Supports hour/minute precision — for a whole-day search useT00:00:00end_date(string, optional): UTC ISO datetimeYYYY-MM-DDTHH:MM:SS, earliest2026-01-01T00:00:00. For a whole-day search useT23:59:59publisher(string, optional): Filter by publisher namecategory(array, optional): Filter by content categories (max 5)entity(array, optional): Filter by entity names (max 5)publisher_location(string, optional): Filter by country: United States, United Kingdom, Canadalimit(int, optional): Results per search term (default: 10, max: 50)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statisticsinclude_full_body(bool, optional, defaultfalse): Return each article's full body text. By default bodies are truncated to 2,000 characters (at a word boundary) to keep responses small. Settrueonly when you need to read complete articles
Example with search terms:
{
"tool": "get_news_articles",
"arguments": {
"search_terms": ["renewable energy policy"],
"publisher_location": "United States",
"limit": 20
}
}Example narrowing to a specific hour band:
{
"tool": "get_news_articles",
"arguments": {
"search_terms": ["product launch"],
"start_date": "2026-05-13T08:00:00",
"end_date": "2026-05-13T10:00:00",
"limit": 20
}
}Example without search terms (browse recent articles):
{
"tool": "get_news_articles",
"arguments": {
"publisher_location": "United States",
"category": ["technology"],
"limit": 20
}
}get_social_media_posts14 params - 5 examples
Search individual social media posts (detailed content).
Parameters:
search_terms(array, 0-3 terms, optional): Keep complete concepts together. If not provided, returns most recent posts sorted by publish date. Use for topics, themes, concepts, or moods — anything that is not a specific named person/brand/product/event/place (useentityfor those). When unsure, favorsearch_terms. Pair withentityto find a topic about a named entitystart_date(string, optional): UTC ISO datetimeYYYY-MM-DDTHH:MM:SS, earliest2026-01-01T00:00:00. Supports hour/minute precision — for a whole-day search useT00:00:00end_date(string, optional): UTC ISO datetimeYYYY-MM-DDTHH:MM:SS, earliest2026-01-01T00:00:00. For a whole-day search useT23:59:59platform(array, optional): Filter by platforms (max 5): X, Reddit, Truth Social, Pinterest, Instagram, Bluesky, TikTok, Threadstheme(array, optional): Filter by themes (max 5): discounts, purchase, appearance, churn, cost, ads, experience, craftmanship, transaction, criminal, loyalty, stock, taste, temperature, ambiance, delivery, fit, injury, knowledge, leadership, comfort, access, illness, location, restrooms, speed, satisfaction, wait times, cleanliness, durability, friendliness, selectionentity(array, optional): Filter to posts about a specific named person, brand, organization, product, event, or place (max 5) — e.g."Messi","Nike","FIFA World Cup". Use this (rather thansearch_terms) when the user names such a thing; it is more precise for named subjects but only covers the ~half of posts where an entity was detected. Matching is case-insensitive substring ("contains") —"messi"matches"Lionel Messi","world cup"matches"FIFA World Cup"; multiple values are OR'd. Use short, distinctive fragments (very short terms like"cup"can over-match). For broad topics/themes/moods, usesearch_terms(and favorsearch_termswhen unsure). Combine withsearch_termsto find a topic about a named entity — e.g.entity: ["Nike"]+search_terms: ["product recall"].min_likes(int, optional): Only return posts with at least this many likes (engagement floor, must be ≥ 0). Posts with no like count are excluded.min_comments(int, optional): Only return posts with at least this many comments (engagement floor, must be ≥ 0). Posts with no comment count are excluded.min_shares(int, optional): Only return posts with at least this many shares/reposts (engagement floor, must be ≥ 0). Coverage is partial and platform-dependent — many platforms do not report shares, so this filter excludes most posts and can sharply narrow results. Prefermin_likes/min_commentsfor general engagement filtering.min_author_followers(int, optional): Only return posts whose author has at least this many followers (audience-reach floor, must be ≥ 0). Use this for questions about influential or large accounts — it measures the author's reach, whereasmin_likes/min_comments/min_sharesmeasure how an individual post performed. Posts with no follower count are excluded, which drops platforms that have no follower concept (Reddit, Facebook, Tumblr) entirely; follower counts are present on roughly three quarters of posts overall.country(array, optional): Filter by the post's country of origin as lowercase ISO 3166-1 alpha-2 codes (max 5) — e.g.["us", "gb", "ca", "au"](the UK's code isgb, Australia's isau). Coverage is sparse — most posts have no country code, so this filter excludes them and can sharply narrow results. Excludes posts whose country is unknown or unsupported.limit(int, optional): Results per search term (default: 10, max: 50)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statisticsinclude_full_body(bool, optional, defaultfalse): Return each post's full text. By default post text is truncated to 2,000 characters (at a word boundary) to keep responses small; most posts are shorter than that and are unaffected. Settrueonly when you need to read complete long-form posts
Each returned post includes likes, comments, and shares fields (integer like/favorite, comment/reply, and share/repost counts; omitted when the platform does not expose them — shares in particular is sparsely populated), author_followers (the posting account's follower count, a proxy for reach; omitted on platforms with no follower concept and where the account was not resolved), an entities array (named entities detected in the post; omitted when none were detected), and country (ISO 3166-1 alpha-2 origin country code; omitted when unknown.
Example with search terms:
{
"tool": "get_social_media_posts",
"arguments": {
"search_terms": ["climate action"],
"platform": ["X"],
"theme": ["experience"],
"limit": 25
}
}Example narrowing to a specific hour band:
{
"tool": "get_social_media_posts",
"arguments": {
"search_terms": ["product launch"],
"start_date": "2026-05-13T08:00:00",
"end_date": "2026-05-13T10:00:00",
"limit": 25
}
}Example without search terms (browse recent posts):
{
"tool": "get_social_media_posts",
"arguments": {
"platform": ["Reddit"],
"theme": ["experience"],
"limit": 25
}
}Example filtering by entity (substring/contains match):
{
"tool": "get_social_media_posts",
"arguments": {
"entity": ["Messi", "World Cup"],
"limit": 25
}
}Example filtering by engagement (only higher-engagement posts):
{
"tool": "get_social_media_posts",
"arguments": {
"search_terms": ["product launch"],
"min_likes": 100,
"min_comments": 10,
"limit": 25
}
}get_tiktok_hashtags6 params - 2 examples
Get trending TikTok hashtags. Can optionally filter by search terms or get top hashtags by category and date range.
Parameters:
search_terms(array, 0-3 terms, optional): Optional search terms to filter results. If not provided, returns top hashtags according to other parameterscategory_name(string, optional): Filter by TikTok category. When omitted, a query with search terms spans all categories, while a query without search terms defaults to the cross-category "ALL" leaderboard. Available categories: ALL, ACADEMIC_RESOURCES, ANIMATION_AND_COMICS, APPAREL_AND_ACCESSORIES, ART, AUTOMOTIVE, BABY_CARE, BABY_KIDS_AND_MATERNITY, BEAUTY, BEAUTY_AND_PERSONAL_CARE, BEAUTY_SERVICES, BUSINESS_AND_FINANCE, BUSINESS_SERVICES, CARD_AND_BOARD_GAMES, CAREER_AND_PROFESSIONAL_GROWTH, COLLEGE, COMEDY, COMMUNITY_UPDATES_AND_ISSUES, CONVENTIONAL_AND_MAINSTREAM_SPORTS, COOKING, CRAFTING_AND_CREATIONS, CULTURE, DANCE, DIARY_AND_VLOG, DRINKS, EATING_EXPERIENCES, EDUCATION, ENTERTAINMENT_AND_SPORTS_NEWS, ENVIRONMENT, EXERCISE_AND_FITNESS, EXTREME_AND_ADVENTURE_SPORTS, FAMILY, FINANCIAL_SERVICES, FOOD, FOOD_AND_BEVERAGE, FOOD_RECOMMENDATIONS, GADGETS_AND_INNOVATION, GAMES, GENERAL_TRAVEL, HAIR_CARE, HEALTH, HEALTH_AND_WELLNESS, HISTORY_AND_LITERATURE, HOME_AND_GARDEN, HOME_IMPROVEMENT, HOUSEHOLD_PRODUCTS, LEARNING_AND_DEVELOPMENT, LEISURE_AND_RECREATION_FACILITIES, LIFE_SERVICES, LIVESTOCK_AND_FARMING, MISCELLANEOUS_PERFORMANCES, MOVIES_AND_TV, MUSIC, NEWS_AND_ENTERTAINMENT, OTHER_BEAUTY, OTHER_FASHION, OTHER_TRANSPORTATION, OUTDOOR_RECREATION, OUTFITS, PERFORMING_ARTS, PERSONAL_PHOTOGRAPHY, PETS, PET_CARE_AND_ACCESSORIES, PHOTOGRAPHY, PRODUCTIVITY_AND_EFFICIENCY, ROMANCE, SCIENCE, SENSORY_EXPERIENCES, SHOWS_FESTIVALS_AND_EXHIBITIONS, SOFTWARE_AND_APPS, SPECIAL_EFFECTS, SPORTS, SPORTS_AND_OUTDOOR, SUPERNATURAL_AND_HORROR, TECHNOLOGY, TOYS_COLLECTIBLES_AND_MEMORABILIA, TRAVEL, VEHICLE_AND_TRANSPORTATION, VIDEO_GAMES, WILDLIFE_AND_EXOTIC_PETSdate_range(string, optional): Filter by date range (default: "1DAY"). Available options: "1DAY", "7DAY", "30DAY", "120DAY"country(array, optional): Filter by country, as uppercase ISO 3166-1 alpha-2 codes (max 5). Supported: US, GB, CA, DE, ES, TR, ZA, NG, CN, IN, PH, TH, MX, BR, AR, FR, IT, NL, PL (the UK's code isGB). Lowercase codes are accepted and upcased. When omitted, returns hashtags across all available countrieslimit(int, optional): Number of results per search term or total results if no search term (default: 50, max: 200)include_total_statistics(bool, optional): Whenfalse, omitsaggregate_stats. Defaults totrue. Unlike the other tools, these statistics are computed over the returned rows (not the full dataset), so disabling them reduces response size but does not speed up the search
Response: search_results holds one entry per search term, or a single unlabeled entry when browsing without search terms. Each entry carries its own hashtags rows and, when include_total_statistics is true, an aggregate_stats block describing exactly those rows:
{
"search_results": [
{
"search_term": "sports",
"aggregate_stats": {
"views_distribution": [
{"range": "0-100K", "count": 4},
{"range": "100K-1M", "count": 22},
{"range": "1M-10M", "count": 18},
{"range": "10M-100M", "count": 5},
{"range": "100M+", "count": 1}
],
"posts_distribution": [
{"range": "0-1K", "count": 12},
{"range": "1K-10K", "count": 26},
{"range": "10K-100K", "count": 12},
{"range": "100K-1M", "count": 0},
{"range": "1M+", "count": 0}
],
"rank_change_distribution": {"new": 28, "up": 11, "down": 9, "unchanged": 2},
"top_country_distribution": {"US": 34, "GB": 9, "CA": 7}
},
"hashtags": [ ... ]
}
]
}All statistics describe the returned rows, never the full dataset. views_distribution and posts_distribution always list every bucket, so a count of 0 means no returned row fell in that range, and a row whose value is missing or non-numeric falls in no bucket. rank_change_distribution buckets each row's rank change in the order new, up, down, unchanged; rows with a missing or unrecognized rank change are skipped, and buckets with no rows are omitted. Expect new to dominate, since most hashtags in this dataset are new on any given day. top_country_distribution counts how often each country appears across the rows' top-country lists, most frequent first; unlike other top_-prefixed distributions it is exhaustive over the returned rows rather than truncated.
Example:
{
"tool": "get_tiktok_hashtags",
"arguments": {
"search_terms": ["fitness"],
"category_name": "EXERCISE_AND_FITNESS",
"date_range": "7DAY",
"limit": 20
}
}Example without search terms:
{
"tool": "get_tiktok_hashtags",
"arguments": {
"category_name": "BEAUTY",
"date_range": "1DAY",
"limit": 15
}
}get_audience_targeting4 params - 2 examples
Generate audience targeting segments for specific ad platforms based on an audience description.
Parameters:
audience_name(string, required): The name of the audience to target (e.g., "Tech Enthusiasts", "Fitness Enthusiasts")audience_description(string, required): A description of the audience to target (e.g., "Young professionals interested in technology and innovation")platform(string, required): Which platform to target. Available platforms:Programmatic,YouTube,Pinterest,LinkedIn,TikTok,Snapchat,Meta,X,Reddit,Spotify
Platform-Specific Targeting Types:
- YouTube: detailed_demographics, life_events, affinity_audiences, in_market_audiences, topics, keywords
- Programmatic: categories, genres, ctv_segments, olv_segments
- TikTok: interests, video_interactions, creator_interactions, hashtags
- Meta: detailed_demographics, interests, behaviors
- Snapchat: lifestyle, shoppers, visitors
- LinkedIn: company_industries, member_interests, member_traits
- X: interests, keywords, hashtags
- Pinterest: interests, keywords
- Spotify: interests, music_genres, playlist_themes, podcast_topics
- Reddit: interest_groups, keywords
Returns: Platform-specific targeting segments organized by demographics and targeting types. The response structure varies by platform but includes:
- Demographics (age, gender, income, parental status, etc.) - varies by platform
- Targeting segments (interests, behaviors, keywords, etc.) - varies by platform
- Audience name and platform identifier
Example:
{
"tool": "get_audience_targeting",
"arguments": {
"audience_name": "Tech Enthusiasts",
"audience_description": "Young professionals aged 25-35 interested in technology, innovation, and startups",
"platform": "Meta"
}
}Example for YouTube:
{
"tool": "get_audience_targeting",
"arguments": {
"audience_name": "Fitness Enthusiasts",
"audience_description": "Adults interested in fitness, health, and wellness",
"platform": "YouTube"
}
}get_youtube_videos13 params - 3 examples
Search YouTube videos from the Brand Mentality curated YouTube dataset.
Parameters:
search_terms(array, 0-3 terms, optional): Search terms for video title/description. If not provided, returns top videos sorted by view count (highest first). When provided, do NOT also sendsort_by— the two parameters are mutually exclusivestart_date(string, optional): Start date for video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). Whileinclude_total_statisticsis true the range may not exceed 180 days; omit this to search the most recent 180 daysend_date(string, optional): End date for video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). Whileinclude_total_statisticsis true the range may not exceed 180 dayslanguage(array, optional): Filter by language codes (e.g., "en", "es") - max 5country(array, optional): Filter by channel country codes (e.g., "US", "UK") - max 5iab_category(array, optional): Filter by IAB taxonomy category names (e.g., "Sports", "Music") - max 5is_short(boolean, optional): Filter by video type: true for Shorts, false for long-form, omit for allexclude_kids_content(boolean, optional): Exclude kids content when truemin_views(int, optional): Minimum view count thresholdmin_channel_subscribers(int, optional): Minimum channel subscriber countsort_by(string, optional): Mutually exclusive withsearch_terms— sending both returns an error. Omit this parameter wheneversearch_termsis provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values:"size"(default) = view count (most viewed first);"recency"= newest videos first. Use"recency"only when the user explicitly requests chronological orderinglimit(int, optional): Results per search term (default: 10, max: 50)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statistics
Example with search terms:
{
"tool": "get_youtube_videos",
"arguments": {
"search_terms": ["tech reviews"],
"language": ["en"],
"country": ["US"],
"min_views": 10000,
"limit": 20
}
}Example with subscriber filter (videos from larger channels):
{
"tool": "get_youtube_videos",
"arguments": {
"search_terms": ["weight loss treatments"],
"min_channel_subscribers": 100000,
"limit": 20
}
}Example without search terms (browse top videos):
{
"tool": "get_youtube_videos",
"arguments": {
"iab_category": ["Sports"],
"is_short": false,
"exclude_kids_content": true,
"limit": 25
}
}get_youtube_channels12 params - 3 examples
Search YouTube channels from the Brand Mentality curated YouTube dataset.
Parameters:
search_terms(array, 0-3 terms, optional): Search terms for channel title/description. If not provided, returns top channels sorted by subscriber count (highest first). When provided, do NOT also sendsort_by— the two parameters are mutually exclusivestart_date(string, optional): Start date for latest video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). Whileinclude_total_statisticsis true the range may not exceed 180 days; omit this to search the most recent 180 daysend_date(string, optional): End date for latest video publish date filtering (YYYY-MM-DD format, earliest 2005-02-14). Whileinclude_total_statisticsis true the range may not exceed 180 dayslanguage(array, optional): Filter by language codes (e.g., "en", "es") - max 5country(array, optional): Filter by country codes (e.g., "US", "UK") - max 5exclude_kids_content(boolean, optional): Exclude kids content when truemin_subscribers(int, optional): Minimum subscriber count thresholdmin_views(int, optional): Minimum total view count thresholdmin_video_count(int, optional): Minimum video count on channelsort_by(string, optional): Mutually exclusive withsearch_terms— sending both returns an error. Omit this parameter wheneversearch_termsis provided (results are then ranked by relevance automatically). Only set when no search terms are given. Values:"size"(default) = subscriber count (most popular first);"recency"= recently active channels first. Use"recency"only when the user explicitly requests chronological orderinglimit(int, optional): Results per search term (default: 10, max: 50)include_total_statistics(bool, optional, defaulttrue): Include theaggregate_statsblock of population statistics. Setfalsefor sample records only, which is significantly faster. See Aggregate Statistics
Example with search terms:
{
"tool": "get_youtube_channels",
"arguments": {
"search_terms": ["cooking recipes"],
"language": ["en"],
"min_views": 1000000,
"limit": 15
}
}Example with subscriber filter (larger channels only):
{
"tool": "get_youtube_channels",
"arguments": {
"search_terms": ["personal finance"],
"country": ["US"],
"language": ["en"],
"min_subscribers": 5000,
"limit": 20
}
}Example without search terms (browse top channels):
{
"tool": "get_youtube_channels",
"arguments": {
"country": ["US"],
"exclude_kids_content": true,
"min_video_count": 50,
"limit": 20
}
}All search tools return results with clear distinction between total matches and sample results:
Output Format
Every tool returns its result as a single text block: the data context (guidance on how to interpret the payload) followed by a blank line and the data payload (JSON for search tools, markdown for get_brand_profile). Read the entire text block — do not assume the context and the payload are delivered as separate parts.
Field Naming Convention
aggregate_stats.total_matches: Total number of matching records in the databasesample_*: The subset of example records returned (e.g.,sample_social_media_posts,sample_news_articles)
This distinction helps clarify that aggregate_stats.total_matches represents the full scope of data matching your query, while the sample_* list contains representative examples limited by the limit parameter.
Population statistics are configurable. Computing them is expensive, so every search tool exposes the same switch:
- Every search tool except
get_tiktok_hashtagsreturns anaggregate_statsblock (the total match count plus fielddistributions) by default. Pass
include_total_statistics=falsewhen you only need a few example records and not population-level statistics: theaggregate_statsblock is then omitted and the search is significantly faster.
- For
get_youtube_videosandget_youtube_channels, leavinginclude_total_statisticsattruecaps the searched date range at 180 days (see Dates);
include_total_statistics=falseremoves the cap.
get_tiktok_hashtagsreturns anaggregate_statsblock per search result by default, computedover the returned rows rather than the full dataset;
include_total_statistics=falseomits it (smaller response, no speed difference).
- The
sample_*records are always returned and unaffected.
Aggregate Statistics
Every search tool except get_tiktok_hashtags returns full aggregate statistics per search term by default (omitted when include_total_statistics=false). Statistics cover every record matching that search term's query, not just the returned sample. When you pass search_terms, that population is the set matched by the term's query; when you browse without search terms, it is the whole filtered date range.
Distributions over multi-valued fields (a narrative's platforms, a moment's categories) count a record in every bucket it belongs to, so those buckets can sum to more than total_matches.
get_social_media_posts:total_matches,platform_distribution,top_themes_distribution,date_distribution,likes_stats,comments_stats, andshares_stats(engagement summaries over matching posts: each hascount,min,max,avg,sum;countreflects only posts that have a value for that metric — compare it tototal_matchesto gauge coverage, which is low forshares_stats)get_news_articles:total_matches,top_publishers_distribution,top_categories_distribution,publisher_location_distribution,date_distributionget_youtube_videos:total_matches,language_distribution,country_distribution,category_distribution,views_distribution,likes_distribution,date_distributionget_youtube_channels:total_matches,language_distribution,country_distribution,subscriber_distribution,date_distributionget_social_media_narratives:total_matches,total_post_count(combined posts across all matching narratives),sentiment_distribution(narrative counts keyednegative,neutral,positive),platform_distribution,narrative_size_distribution(narratives bucketed by post count),narratives_per_day_date_distribution(narratives counted by earliest post date), andtotal_likes_stats,total_comments_stats,total_shares_stats(summaries of each narrative's engagement totals: each hascount,min,max,avg,sum;countreflects only narratives that have a value for that metric — compare it tototal_matchesto gauge coverage, which is lowest fortotal_shares_stats)get_news_moments:total_matches,total_article_count(combined articles across all matching moments),moment_size_distribution(moments bucketed by article count),moments_per_day_date_distribution(moments counted by earliest article date)get_trends:total_matches,total_article_countandtotal_post_count(combined counts across all matching trends),top_brands_distributionandtop_people_distribution(how many matching trends list each name — not mention counts, and not limited to the 10 entities shown on each trend record),trends_per_day_date_distribution(trends counted by latest publish date)
Two notes on reading these:
- The
*_per_day_date_distributionseries count clusters, not their contents: when stories broke, conversations started, or trends concluded. For article or post volume over time, callget_news_articlesorget_social_media_posts, which bucket each record on its own publish date and give a true daily curve. sentiment_distributionhas three bands (negative,neutral,positive) while thesentimentfilter accepts five, so they do not map one to one: the distribution'snegativecovers everything the filter would callnegativeorvery_negative. Band edges are half-open, so a score of exactly0.25counts aspositivein the distribution but matchessentiment="neutral"when filtering. Narratives with no sentiment score appear in no band, so the bands need not sum tototal_matches.- Every bucket is always returned, including empty ones: date distributions include periods with no records as
count: 0so gaps are visible rather than collapsed, range distributions list every band, andsentiment_distributionlists all five. An absent bucket therefore means the field itself was not aggregated, never that the count was zero.
TikTok Hashtags returns aggregate_stats per search result (omitted when include_total_statistics=false): views_distribution, posts_distribution, rank_change_distribution, and top_country_distribution. These describe the returned rows rather than the full dataset. See get_tiktok_hashtags for details.
Example Response Structure
{
"search_start_date": "2024-10-01",
"search_end_date": "2024-12-01",
"search_results": [
{
"search_term": "AI",
"aggregate_stats": {
"total_matches": 15420,
"platform_distribution": {"X": 8500, "Reddit": 4200, "TikTok": 2720},
"top_themes_distribution": {"experience": 3200, "knowledge": 2800},
"date_distribution": {"interval": "1d", "buckets": [{"date": "2024-11-01", "count": 520}, ...]},
"likes_stats": {"count": 14200, "min": 0, "max": 84210, "avg": 312.5, "sum": 4437500},
"comments_stats": {"count": 13980, "min": 0, "max": 9120, "avg": 27.4, "sum": 383052},
"shares_stats": {"count": 1120, "min": 0, "max": 4300, "avg": 18.2, "sum": 20384}
},
"sample_social_media_posts": [
{ "post_id": "...", "text": "...", "likes": 1280, "comments": 64, "shares": 22, "entities": ["Lionel Messi", "FIFA World Cup"], ... }
]
}
]
}Note: Distribution fields prefixed with top_ (e.g., top_themes_distribution) return the most frequent values, not exhaustive lists. The exception is get_tiktok_hashtags's top_country_distribution, which counts every country code present in the returned rows' top_country_list values rather than a truncated top-N.
Dates
- Date-only format (
YYYY-MM-DD, e.g.,"2024-01-15"): used byget_trendsandget_social_media_narratives, earliest2026-01-01 - UTC ISO datetime format (
YYYY-MM-DDTHH:MM:SS, e.g.,"2026-05-13T12:05:18"): used byget_news_articles,get_news_moments, andget_social_media_postsfor hour/minute-precision filtering, earliest2026-01-01T00:00:00. Naive UTC — do not include a timezone offset. For a whole-day search useT00:00:00toT23:59:59. - YouTube tools (videos, channels): earliest
2005-02-14 - Default: If not provided, uses the earliest available date as the start
- YouTube tools with
include_total_statistics: true(the default): the searched range is capped at 180 days. An omittedstart_datedefaults to the most recent 180 days instead of the earliest available date, and an explicit range wider than 180 days returns an error. The returnedsearch_start_dateandsearch_end_datealways state the range actually searched, and the records andaggregate_statsalways cover that same range. Sendinclude_total_statistics: falseto search the full history without population statistics.
Search Terms
- 0-3 terms per request (optional for all tools)
- Terms run in parallel when provided
- For articles/posts: Keep complete concepts together
- ✅
["renewable energy policy"] - ❌
["renewable", "energy", "policy"] - Without search terms: Tools return results sorted by a logical default, customizable with
sort_byparameter: - Trends: default "size" (biggest trends), optional "recency" (most recent trends)
- Moments: default "size" (biggest story clusters), optional "recency" (most recent moments)
- Narratives: default "size" (most discussed), optional "recency" (most recent narratives)
- Articles: sorted by publish date (most recent)
- Posts: sorted by publish date (most recent)
- TikTok Hashtags: sorted by rank position
- YouTube Videos: default "size" (highest view count), optional "recency" (newest videos)
- YouTube Channels: default "size" (highest subscriber count), optional "recency" (recently active channels)
sort_byis mutually exclusive withsearch_terms: For tools that acceptsort_by(get_trends,get_news_moments,get_social_media_narratives,get_youtube_videos,get_youtube_channels), sending bothsort_byandsearch_termsin the same request returns an error. When search terms are provided, results are automatically ranked by relevance — omitsort_byentirely.
Tool Selection
- Brand info →
get_brand_profile - Long-term trends →
get_trends - News clusters →
get_news_moments - Social clusters →
get_social_media_narratives - Individual articles →
get_news_articles - Individual posts →
get_social_media_posts - Trending TikTok hashtags →
get_tiktok_hashtags - YouTube videos →
get_youtube_videos - YouTube channels →
get_youtube_channels - Audience targeting segments →
get_audience_targeting