# Viral Outliers (remote · viraloutliers.com)

Find viral outlier posts on TikTok, Instagram and YouTube, pull creator stats, and crawl on demand.

- Trust score: 72/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-16

## Components

- remote · `viraloutliers.com`: 72/100 (this document), [markdown](https://verifymcp.io/servers/com-viraloutliers-viral-outliers/api-mcp.md), [page](https://verifymcp.io/servers/com-viraloutliers-viral-outliers/api-mcp)

## Channel facts

- Endpoint: `https://viraloutliers.com/api/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-16.

- **Endpoint Security**: 80/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 73/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2711 tokens (~129/item across 21 items; 21 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 10/100
  - Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 86/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 59% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### Claude

```bash
claude mcp add --transport http com-viraloutliers-viral-outliers https://viraloutliers.com/api/mcp
```

### Codex

```toml
[mcp_servers.com-viraloutliers-viral-outliers]
url = "https://viraloutliers.com/api/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-viraloutliers-viral-outliers": {
      "type": "remote",
      "url": "https://viraloutliers.com/api/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-viraloutliers-viral-outliers --url https://viraloutliers.com/api/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-viraloutliers-viral-outliers:
    url: "https://viraloutliers.com/api/mcp"
```

### Other

```json
{
  "mcpServers": {
    "com-viraloutliers-viral-outliers": {
      "type": "http",
      "url": "https://viraloutliers.com/api/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-16 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-14 (score 71, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-08-13 (score 70)

First indexed and scored.

## MCP tools (21)

### `search_outliers` (~294 tokens)

Search Viral Outlier Posts

Search a continuously-crawled database of social media posts ranked by outlier score: how strongly a post overperforms the account's own baseline. Filter by platform, keyword, content type, views, follower count, engagement rate and time window; sort by outlier score, views or recency. Returns post metadata, stats and thumbnails. Use this to find proven viral formats in any niche before creating content. Results may include deleted posts (deleted_at set) and posts from deactivated profiles (profile is_active=false), these are kept for their thumbnails and format ideas, with stats frozen at deletion; filter on deleted_at / is_active if you only want live content. Cost: 1 credit per call.

Input parameters:

- `contentTypes` (array)
- `handle` (string): Exact creator handle filter
- `maxEngagementRate` (number)
- `maxFollowers` (number)
- `maxOutlierScore` (number)
- `maxViews` (number)
- `minEngagementRate` (number)
- `minFollowers` (number)
- `minOutlierScore` (number)
- `minViews` (number)
- `page` (integer)
- `pageSize` (integer)
- `platforms` (array)
- `query` (string): Keyword search over captions/titles
- `sortBy` (string)
- `timeFrame` (string)

### `search_profiles` (~160 tokens)

Search Social Media Profiles

Search tracked social media profiles by handle or name, filtered by platform. Returns profile metadata, follower counts and average performance stats. Use it to resolve a handle to a profile id before fetching stats or posts, or to discover creators in the database. Results may include deactivated profiles (is_active=false), e.g. an account that was renamed or went private, retained with frozen stats; filter on is_active if you only want live accounts. Note a creator who changed handles can appear as two rows (old deactivated + new active). Cost: 1 credit per call.

Input parameters:

- `page` (integer)
- `pageSize` (integer)
- `platforms` (array)
- `query` (string): Handle, @handle, or profile URL

### `get_post` (~126 tokens)

Get Post Details

Fetch a single post by id: views, likes, comments, engagement rate, outlier scores for seven time windows, thumbnail and the owning profile. When a transcript or visual analysis already exists it is included at no extra cost. Request new ones via request_transcript. Use after search_outliers to deep-dive a result. Cost: 1 credit per call.

Input parameters:

- `includeTranscript` (boolean): Attach cached transcript (default true)
- `includeVisualAnalysis` (boolean): Attach cached visual analysis (default true)
- `postId` (string, required): Internal post id from search results

### `get_profile` (~105 tokens)

Get Profile Stats

Fetch one tracked profile by id: follower count, bio, average views/likes/engagement across time windows, and recent tracked posts. The averages are the baseline outlier scores are computed against. Use search_profiles first to resolve a handle to an id. Cost: 1 credit per call.

Input parameters:

- `handle` (string)
- `platform` (string): With handle: look up by handle instead of id
- `profileId` (string): Profile id from search results

### `request_transcript` (~114 tokens)

Transcribe a Post

Queues AI transcription for a post (spoken audio; slideshows use on-screen text extraction). Accepts a public post URL or an internal post id. Asynchronous: returns a job reference to poll with get_job_status; once complete the transcript is attached to get_post responses. Credits are charged on queueing and automatically refunded if the job fails. Cost: 10 credits per call.

Input parameters:

- `postId` (string): Internal post id
- `url` (string): Public post URL (alternative to postId)

### `crawl_profile` (~96 tokens)

Crawl a New Profile

Submits a public profile for crawling: profile metadata plus its recent posts, stats and thumbnails, after which it stays tracked and appears in searches. Asynchronous. Returns a job reference for get_job_status. If the profile is already tracked, this returns immediately without charging a full crawl. Credits are refunded automatically when a crawl fails. Cost: 40 credits per call.

Input parameters:

- `handle` (string, required)
- `platform` (string, required)

### `get_job_status` (~71 tokens)

Check Job Status

Returns the status of an asynchronous job started by crawl_profile or request_transcript: pending, processing, completed or failed. Free to call: polling must never cost credits. Poll every 10–30 seconds; jobs typically complete within a few minutes. Cost: free.

Input parameters:

- `jobRef` (string, required)

### `get_credit_balance` (~57 tokens)

Check Credit Balance

Returns the current API credit balance for the authenticated account. Free to call. Agents should check the balance before starting large batch jobs and surface "insufficient_credits" errors to the user with a link to top up. Cost: free.

### `compare_profiles` (~123 tokens)

Compare Profiles Head-to-Head

Compares 2–5 tracked profiles (by profile id or platform+handle) and returns each one's stats (follower count, average views/likes across time windows, engagement rate) plus a computed ranking flagging the top performer by followers and by engagement. Pure lookup, fast. Unresolved profiles come back in a notFound list rather than failing the call. Cost: 2 credits per call.

Input parameters:

- `handles` (array): Handle pairs to resolve; 2–5 profiles total across both fields
- `profileIds` (array): Profile ids to compare

### `niche_trends` (~119 tokens)

What's Trending in a Niche

Returns the top overperforming posts in a niche over a recent window (default one week), plus a breakdown of which content types are driving the trend and which creators are represented. Filter by keyword and platform. Great as the first call in a content-research loop: see what's hot, then deep-dive or remix the winners. Cost: 2 credits per call.

Input parameters:

- `limit` (integer)
- `platforms` (array)
- `query` (string): Niche keyword
- `timeFrame` (string): Default one_week

### `resolve_post_url` (~140 tokens)

Resolve a Post URL

Takes a public post URL (TikTok video/photo, Instagram post/reel, YouTube video/short) and resolves it to the tracked post: the entry point when your input is a link. found:true returns the postId for get_post, request_transcript, download_post_media and remix_post. found:false tells you whether the whole profile is untracked (call crawl_profile) or just this post. TikTok/Instagram short links (vm.tiktok.com, /share/) must be expanded to the canonical URL first. Cost: 1 credit per call.

Input parameters:

- `url` (string, required): Public post URL (canonical, not a short link)

### `download_post_media` (~142 tokens)

Download Post Media

Returns direct media URLs for a tracked post, the video file, or slideshow images with positions. Accepts a public post URL or an internal post id. When media is not stored yet it queues an on-demand fetch and returns a jobRef to poll (typically ready within ~90 seconds); call again once complete. Platform CDN URLs can expire, so download promptly. YouTube currently returns the thumbnail image. You are responsible for using downloaded media in line with the platforms' terms and applicable law. Cost: 3 credits per call.

Input parameters:

- `postId` (string): Internal post id
- `url` (string): Public post URL (alternative to postId)

### `remix_post` (~215 tokens)

Remix a Post to Your Niche

Takes a post (pass a public post URL or an internal post id) plus a target niche/brand description, and produces an adapted content idea: rewritten title and description, segment-by-segment script, and an execution checklist, the proven format transplanted into your niche. Asynchronous (~1–3 minutes): returns a jobRef; poll get_remix_result until its "remix" field is populated (it returns status + result together). For video posts the remix now auto-generates the transcript and visual analysis first, so quality no longer depends on you transcribing beforehand (it just takes a little longer). Credits are refunded automatically if the remix fails. Cost: 20 credits per call.

Input parameters:

- `postId` (string): Internal post id
- `targetNiche` (string, required): Your niche/brand/audience, 5–500 chars
- `tone` (string): Preferred tone of voice
- `url` (string): Public post URL (alternative to postId — what a user browsing social media has)

### `get_remix_result` (~82 tokens)

Fetch a Finished Remix

Returns the finished remix for a remix_post job: adapted title, description, script segments and checklist. Free to call. Poll get_job_status until the job reports completed, then fetch here. The result is also viewable in the web app under Content Ideas. Cost: free.

Input parameters:

- `jobRef` (string, required): The pipeline jobRef returned by remix_post

### `create_topup_link` (~101 tokens)

Create a Credit Top-Up Link

Creates a Stripe Checkout link for a credit pack, so when the balance runs out mid-task you can hand the account owner a one-click payment link instead of instructions. Credits land within seconds of payment. Free to call (5 links/hour); links are valid for 24 hours. Packs: see the pricing table in the docs. Cost: free.

Input parameters:

- `packId` (string, required): Credit pack to buy — see get_credit_balance / docs for sizes

### `report_issue` (~148 tokens)

Report an Issue

Report a problem with any skill: an error you keep hitting, data that looks wrong or stale, or something you needed that the API could not do. Free: never spend credits on telling us something is broken. Include what you called, what you expected and what happened. Set wantsUpdate to true to get an email on your account address when the issue is resolved. Reports go straight to the team. Cost: free.

Input parameters:

- `message` (string, required): What you called, what you expected, what happened (10–2000 chars)
- `skill` (string): Which skill the issue is about, when known
- `wantsUpdate` (boolean): true = email the account owner when resolved

### `track_profile` (~215 tokens)

Monitor a Profile

Starts monitoring a profile so it is automatically re-crawled at a cadence you choose (daily, every_3_days or weekly), keeping its posts and stats fresh without you polling crawl_profile. Identify the profile by profileId, platform+handle, or a public profile/post URL. Managing monitoring is free; each scheduled refresh crawl costs credits (10 per refresh) and monitoring pauses itself if your balance runs out, then resumes when you top up. The profile must already be in the database; crawl_profile it first if it is not. Calling again on an already-monitored profile just updates the cadence. Pull the new posts with get_tracked_updates. Cost: free.

Input parameters:

- `frequency` (string): Refresh cadence (default weekly)
- `handle` (string): Public handle, without @ (pair with platform)
- `platform` (string): With handle: resolve the profile to monitor
- `profileId` (string): Internal profile id from search results
- `url` (string): Public profile or post URL identifying the profile

### `untrack_profile` (~96 tokens)

Stop Monitoring a Profile

Stops monitoring a profile: no further scheduled refresh crawls are charged for it. Free to call. Pass the internal profileId (from list_tracked_profiles or search results). The profile and its already-crawled posts stay in the database and searchable; only the recurring refresh stops. Returns not_found if the profile is not currently being monitored. Cost: free.

Input parameters:

- `profileId` (string, required): Internal profile id to stop monitoring

### `list_tracked_profiles` (~89 tokens)

List Monitored Profiles

Returns every profile you are currently monitoring, with its handle, platform, follower count, refresh cadence, next scheduled crawl time, when it was last checked for updates, and any paused reason (e.g. paused for insufficient credits). Free to call. Use it to audit what is being refreshed and what it is costing, or to grab a profileId for untrack_profile. Cost: free.

### `get_tracked_updates` (~140 tokens)

Get New Posts From Monitored Profiles

Returns the posts newly discovered (first stored by our crawler) since your last check, across all the profiles you are monitoring. Free to call. Each call advances a per-profile cursor, so a subsequent call only returns posts crawled after it (a feed, not a re-scan). New posts arrive when a profile's scheduled refresh crawl runs, on the cadence set by track_profile. Results are the same flattened post shape as search_outliers (stats, thumbnail, handle). Total posts are capped (limit 1–100, default 50). Cost: free.

Input parameters:

- `limit` (integer): Max posts to return (default 50)

### `get_trending_outliers` (~78 tokens)

Trending Viral Outliers (Free)

Returns the current top trending outlier posts across TikTok, Instagram and YouTube, deduplicated to one per creator. Free and unauthenticated (rate-limited per IP; cached ~2 hours). A taste of the database. For filtered search, transcripts and on-demand crawling, create an API key. Cost: free.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-viraloutliers-viral-outliers/api-mcp#diagnostics

## Score history

- 2026-08-16: 72
- 2026-08-15: 71
- 2026-08-14: 71
- 2026-08-13: 70

## Links

- Remote endpoint: https://viraloutliers.com/api/mcp
- Website: https://viraloutliers.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-viraloutliers-viral-outliers/api-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-viraloutliers-viral-outliers/api-mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-viraloutliers-viral-outliers/api-mcp
