{"name":"ViewsMax","summary":"Social posting + link tracking\/analytics SaaS. AI agents act on a user's behalf: compose and schedule posts to YouTube, TikTok, X, LinkedIn, Threads, Instagram, and Bluesky; create offers and tracked links; read click, conversion, and revenue stats; research outlier videos (content that massively over-performed its channel) and get AI breakdowns of why they worked. User data is private \u2014 all access is authenticated.","site":"https:\/\/viewsmax.com","docs":{"agents":"https:\/\/viewsmax.com\/ai.md","llms_txt":"https:\/\/viewsmax.com\/llms.txt","api_reference":"https:\/\/api.viewsmax.com\/docs","openapi":"https:\/\/api.viewsmax.com\/docs.openapi"},"mcp":{"endpoint":"https:\/\/api.viewsmax.com\/api\/mcp","transport":"streamable-http","auth":[{"type":"oauth2","grant":"authorization_code","pkce":true,"scopes":["mcp","mcp:read","mcp:write"],"authorization_server_metadata":"https:\/\/api.viewsmax.com\/.well-known\/oauth-authorization-server","protected_resource_metadata":"https:\/\/api.viewsmax.com\/.well-known\/oauth-protected-resource\/api\/mcp","dynamic_client_registration":true},{"type":"api_key","header":"Authorization: Bearer <key>","key_prefix":"vmx_","access_levels":["read","full"],"obtain_at":"https:\/\/viewsmax.com\/dashboard\/settings"}],"tools":[{"name":"list_connected_accounts","description":"List every social account the user has connected, plus a Beehiiv newsletter connection if there is one \u2014 a platform can appear more than once when several accounts are connected on it. Each entry carries social_account_id or connection_id (matching list_brands) plus its store. Posts can only publish to connected platforms; use get_connect_url for anything missing. Beehiiv is connected via an API key on the Connections page, not get_connect_url, and is used for newsletter reach, not posting.","access":"read"},{"name":"list_brands","description":"List the user's brands \u2014 named groups of connected accounts (e.g. a brand holding a TikTok, an X and a YouTube account). Pass a brand id to create_post as brand_id to post to every connected account in the brand at once. Accounts with a status other than \"connected\" are skipped when posting.","access":"read"},{"name":"upload_media","description":"Download a file from a URL and host it on ViewsMax storage for use in posts. Returns a media entry ({type, url, path}) to pass to create_post. Supports jpeg\/png\/webp\/gif images and mp4\/mov video. Each call stores a new copy of the file, so don't repeat a call that already succeeded.","access":"write"},{"name":"create_post","description":"Compose a social post for one or more platforms (tiktok, youtube, x, linkedin, threads, instagram, bluesky). Target either platforms[] or brand_id (from list_brands, posts to every connected account in the brand) \u2014 not both. status \"draft\" (default) saves without publishing, \"posted\" publishes immediately, \"scheduled\" publishes at scheduled_at. TikTok takes a video (with a url) or a photo slideshow (one or more image urls); YouTube requires a video with a path \u2014 both come from upload_media. Instagram needs an image or video url. TikTok photo slideshows accept options.tiktok.auto_add_music (boolean, default false) to let TikTok auto-add its recommended background music; there is no music option for video posts or for Instagram. Publishing\/scheduling to TikTok requires options.tiktok.privacy_level (one of PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY) \u2014 there is no default; branded_content cannot be SELF_ONLY. Ask the user which TikTok privacy_level to use and wait for their answer; never choose it for them. Ask the user which YouTube privacy_status to use (public, unlisted, or private) and wait for their answer; without it the video is public. Caption character limits: tiktok: 2200, youtube: 5000, x: 280, linkedin: 3000, threads: 500, instagram: 2200, bluesky: 300. Publishing is asynchronous: check per-platform results with get_post. Each call creates a new post, so don't repeat a call that already succeeded.","access":"write"},{"name":"list_posts","description":"List the user's posts, newest first, with per-platform publish status. Filter by status (draft, scheduled, posted) and\/or a scheduled_at date window (from\/to, ISO-8601). Returns one page at a time (25 by default); when has_more is true, ask for the next page.","access":"read"},{"name":"get_post","description":"Fetch one post by id, including each platform target's publish status (pending, publishing, published, failed) and error message.","access":"read"},{"name":"update_post","description":"Edit a draft or scheduled post: caption, media, platforms, schedule, or status. Setting status to \"posted\" publishes immediately. Posts that have already been published cannot be edited. Ask the user which TikTok privacy_level to use and wait for their answer; never choose it for them. Ask the user which YouTube privacy_status to use (public, unlisted, or private) and wait for their answer; without it the video is public. Caption character limits: tiktok: 2200, youtube: 5000, x: 280, linkedin: 3000, threads: 500, instagram: 2200, bluesky: 300.","access":"write"},{"name":"delete_post","description":"Delete a post and its platform targets. Does not remove content already published to the platforms.","access":"write"},{"name":"list_offers","description":"List the user's offers (tracked promotions) with their tracking links, goals, and per-offer click\/conversion stats. Optional from\/to date filter. Returns one page at a time (25 by default); when has_more is true, ask for the next page.","access":"read"},{"name":"create_offer","description":"Create an offer (a promotion to track). Requires offer_url; optional name and goals (conversion events with a conversion_url and value). Subject to the user's plan offer limit. Each call creates a new offer, so don't repeat a call that already succeeded.","access":"write"},{"name":"get_offer","description":"Fetch one offer by id, with its tracking links and goals.","access":"read"},{"name":"update_offer","description":"Update an offer's name, offer_url, goals, or links.","access":"write"},{"name":"delete_offer","description":"Delete an offer and stop tracking it.","access":"write"},{"name":"create_tracking_link","description":"Create a tracking link for an offer, to place in a video description, email, social bio, etc. Placement is one of: video, email, x, linkedin, podcast, blog, website, tiktok, ad, instagram, beehiiv, other \u2014 attaching a youtube_video_id or beehiiv_post_id auto-sets the matching placement. Each call creates a new tracking link, so don't repeat a call that already succeeded.","access":"write"},{"name":"get_offer_stats","description":"Aggregated analytics across the user's offers: video views, clicks, calls booked, email signups, and sales revenue. Optional from\/to window.","access":"read"},{"name":"get_stats_timeseries","description":"Daily time-series of clicks and attributed revenue (one bucket per day, gaps zero-filled). Defaults to the last 28 days; filter with from\/to and optionally a single offer via event_id.","access":"read"},{"name":"disconnect_account","description":"Disconnect a social account by platform (e.g. x, youtube, tiktok). Fully disconnects it \u2014 nothing is left half-connected \u2014 and any pending posts targeting that platform will fail to publish.","access":"write"},{"name":"get_connect_url","description":"Get the URL of the ViewsMax Connections page where the user can connect a social platform. The user must open the page in a browser and click Connect there \u2014 the OAuth approval happens on that page and cannot be completed inside this conversation.","access":"write"},{"name":"create_feature_request","description":"Submit a feature request to the ViewsMax team on the user's behalf. Don't use this for plan, billing, or purchase requests; tell the user to manage their plan in the ViewsMax app instead. Each call submits a new request, so don't repeat a call that already succeeded.","access":"write"},{"name":"list_outliers","description":"Browse outlier videos \u2014 content that massively over-performed its channel's average (outlier_score = views \u00f7 channel average views) across YouTube, TikTok and Instagram. Without `query` this is the curated\/featured feed; with `query` it returns title matches already in the database. If the response `status` is \"queued\" or \"in_progress\" no scrape has finished for that query yet \u2014 call search_outliers to start one, then re-run this tool. Filter by platform, score, views, subscribers, publish date, duration (long\/shorts), channel ids or ISO country codes. Paginated (per_page \u2264 50).","access":"read"},{"name":"search_outliers","description":"Start a background YouTube search (YouTube Data API) for outlier videos matching a keyword\/topic. Returns immediately with status \"queued\"; results land in the shared outlier database over the next minute or two \u2014 poll list_outliers with the same `query` until its status is \"done\". Use exact_match to require the whole phrase. This search covers YouTube only: for TikTok and Instagram, add a single video by its link with fetch_outlier, or add a creator's channel with add_outlier_channel to pull in their recent videos.","access":"write"},{"name":"get_outlier","description":"Fetch one outlier video by platform + video id (as returned by list_outliers or fetch_outlier), including its channel, views, outlier score and engagement. `status` is \"ready\" (the video fields follow) or \"ingesting\" (fetch_outlier queued the download and it has not landed yet \u2014 poll again in about 15 seconds; Instagram can take minutes). A video that was never fetched, or whose download failed, is an error.","access":"read"},{"name":"fetch_outlier","description":"Pull a specific video into the outlier database from its URL so it can be analysed (get_outlier, generate_outlier_breakdown, save_outlier). If the video is already known it is returned immediately; otherwise ingestion is queued (`queued: true`) \u2014 poll get_outlier with the returned platform + video_id until its `status` is \"ready\".","access":"write"},{"name":"get_outlier_breakdown","description":"Read the AI breakdown of an outlier video (hook, structure, why it worked, how to replicate it). `status` is none (never generated \u2014 call generate_outlier_breakdown), pending\/processing (poll again), completed (`payload` holds the analysis) or failed (`error`).","access":"read"},{"name":"generate_outlier_breakdown","description":"Queue an AI breakdown of an outlier video (transcript + analysis of the hook, structure and why it over-performed). Generation runs in the background and takes up to a couple of minutes \u2014 poll get_outlier_breakdown until status is completed. Re-running for a video that already has a breakdown returns the existing one instead of regenerating.","access":"write"},{"name":"list_saved_outliers","description":"The user's saved-outliers library (videos they bookmarked with save_outlier), newest first, with tags and the video snapshot taken when saved. Filter by a title\/channel query, tag names, platforms, or creator name. Returns one page at a time (25 by default); when has_more is true, ask for the next page.","access":"read"},{"name":"save_outlier","description":"Bookmark an outlier video into the user's library, optionally with tags (created on demand). Saving the same video again replaces its tags. The video must already be in the outlier database (list_outliers \/ fetch_outlier).","access":"write"},{"name":"remove_saved_outlier","description":"Remove a saved video from the user's outlier library by its saved id (from list_saved_outliers \/ save_outlier). The video itself stays in the outlier database.","access":"write"},{"name":"add_outlier_channel","description":"Add a creator's channel to the outlier database from a profile URL or @handle (YouTube, TikTok, Instagram) and pull in their 10 most recent videos, scored against that channel's own median. Also adds the channel to the user's competitor list. Not for video links \u2014 use fetch_outlier for those. Returns `status: done` with the channel when it was pulled in the last 24 hours; otherwise `queued: true` with an ingest_id \u2014 poll get_outlier_channel_ingest until `done`, then list_outliers with `channels: [channel.id]` (and `duration_type: shorts` for TikTok\/Instagram) to see the videos. No AI breakdowns are generated.","access":"write"},{"name":"get_outlier_channel_ingest","description":"Poll a channel add started by add_outlier_channel. `status` is queued, processing, done (then `channel` is set and `videos_added` says how many videos landed \u2014 use channel.id in list_outliers `channels`), or failed (then `error` explains why). Pulls take ~10-60 seconds; poll every 5-10 seconds.","access":"read"}]},"rest":{"base_url":"https:\/\/api.viewsmax.com\/api","auth":"Same vmx_ API key as a Bearer token (posts, offers, tracking, stats, and outliers endpoints only; read-only keys are limited to GET).","openapi":"https:\/\/api.viewsmax.com\/docs.openapi"},"rate_limits":{"mcp_requests_per_minute":120,"create_post_per_hour":180,"upload_media_per_hour":40,"search_outliers_per_hour":30,"fetch_outlier_per_hour":60,"generate_outlier_breakdown_per_hour":30,"add_outlier_channel_per_hour":10}}