YouTube Shorts MCP server

Registry name: io.github.johnisanerd/youtube-shorts. Maintained by AlphaOSINT (Apify developer johnvc, GitHub johnisanerd).

What it does

List the Shorts on a channel (or fetch given Short links) with views, likes, comments, publish time, duration, hashtags and channel statistics, sorted and filtered by date.

Short-form video performance for a channel. Use it for creator analytics, trend research and competitor content tracking.

This server is not self-hosted. It runs on Apify’s hosted MCP endpoint (mcp.apify.com), which starts the Apify Actor johnvc/youtube-shorts-api for each tool call. You need an Apify account, and every call is billed to that account at the Actor’s prices below. Apify’s own pricing and terms apply to the account.

Charge Price (USD) What it covers
Short $0.00001 Charged per YouTube Short returned in the dataset (video metrics plus channel stats in one row). Error rows, empty channels and skipped items are not charged.
Date filter $0.00001 Small extra charge per returned Short, applied only when oldestPostDate is set.

Prices shown are Apify’s free-plan rates; paid Apify plans get lower per-event prices. Apify also bills a token amount per run start and per stored row ($0.00001, $0.00001). Prices change from time to time; the Actor’s page on Apify shows the current ones.

Data source and terms

YouTube’s public channel and Shorts pages, collected by scraping. The server returns the data as published at the time of the call. You are responsible for using it in line with the source’s terms and the laws that apply to you. AlphaOSINT is not affiliated with the source.

Endpoint

Setup

Claude Code

claude mcp add --transport http youtube-shorts "https://mcp.apify.com/?tools=johnvc/youtube-shorts-api"

VS Code (.vscode/mcp.json)

{
  "servers": {
    "youtube-shorts": {
      "type": "http",
      "url": "https://mcp.apify.com/?tools=johnvc/youtube-shorts-api"
    }
  }
}

Cursor (~/.cursor/mcp.json)

{
  "mcpServers": {
    "youtube-shorts": {
      "url": "https://mcp.apify.com/?tools=johnvc/youtube-shorts-api"
    }
  }
}

Claude Desktop (Settings → Connectors → Add custom connector, paste the URL). Older versions without remote connectors can bridge through mcp-remote in claude_desktop_config.json:

{
  "mcpServers": {
    "youtube-shorts": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://mcp.apify.com/?tools=johnvc/youtube-shorts-api"
      ]
    }
  }
}

Each client opens an Apify sign-in (OAuth) on first use. To use a token instead, send Authorization: Bearer <APIFY_TOKEN> as a header; create one under Apify Console → Settings → API & Integrations.

Tools

Tool What it does
johnvc--youtube-shorts-api Runs the Actor with the parameters below and returns the result rows.
get-actor-run Status of a run started by the tool, for long runs.
get-dataset-items Pages through a run’s full output by datasetId when it is larger than the inline result.
get-key-value-store-record Reads a record a run stored, such as a run report.
abort-actor-run Stops a run.

Apify’s endpoint adds the four helper tools automatically whenever an Actor tool is loaded.

Parameters of johnvc--youtube-shorts-api

Parameter Type Required Default Description
channels array   ["siliconimist"] List YouTube channels to read Shorts from. Use the handle with or without @ (siliconimist, @MrBeast), a channel URL (https://www.youtube.com/@nasa), or a channel id (UC…). Each channel returns up to maxResultsShorts S…
startUrls array     Paste individual YouTube Short or video links to fetch just those items (https://www.youtube.com/shorts/, watch?v=, or youtu.be/). Optional; combine freely with channels. Up to 200 links per run. The date fi…
maxResultsShorts integer   10 Limit the number of Shorts returned from each channel (1 to 500). Runs stop at 1,000 Shorts in total.
sortChannelShortsBy string: NEWEST, POPULAR, OLDEST     Choose the order of a channel’s Shorts tab: NEWEST (default), POPULAR, or OLDEST. Maps to the three sort buttons on the channel page. Ignored (forced to NEWEST) when oldestPostDate is set.
oldestPostDate string     Return only Shorts published on or after this date. Use an absolute date (2025-06-03) or a relative span such as 7 days, 2 weeks, or 3 months. Setting it forces NEWEST order so the listing can stop at the first older Sh…

Example arguments:

{
  "helloWorld": 123
}

Output

The tool returns JSON rows with these fields.

Field Type Description
title string Title of the Short.
translatedTitle string Reserved for a translated title; null in this version.
translatedText string Reserved for a translated description; null in this version.
type string: shorts, None Content type, always shorts for a Short row.
id string YouTube video id of the Short.
url string Canonical Short URL.
thumbnailUrl string Largest available thumbnail image.
viewCount integer Exact view count at fetch time.
date string Publish timestamp in ISO 8601 UTC. Day precision (YYYY-MM-DD) only in the rare case YouTube withholds the exact time.
likes integer Exact like count at fetch time.
location string Location attached to the Short when the creator set one; usually null.
channelName string Display name of the channel that published the Short.
channelUrl string Canonical channel URL (channel id form).
channelId string YouTube channel id (UC…).
collaborators array Collaborating channels on the Short; empty when none.
channelUsername string Channel handle without the @ sign.
channelDescription string The channel’s About text.
channelJoinedDate string Date the channel was created, as YouTube shows it.
channelDescriptionLinks array Links from the channel’s About section as {text, url} objects.
channelLocation string Country the channel lists in its About section.
channelAvatarUrl string Channel profile image URL.
channelBannerUrl string Channel banner image URL.
channelTotalVideos integer Total videos on the channel.
channelTotalViews integer Total views across the channel.
numberOfSubscribers integer Subscriber count. Exact below 1,000, otherwise parsed from YouTube’s rounded figure (15.1M = 15100000).
isChannelVerified boolean Whether the channel shows the verified badge.
inputChannelUrl string Normalized URL of the channel that was requested.
isAgeRestricted boolean Whether YouTube marks the Short as age-restricted.
aboutChannelInfo object All channel fields repeated in one object for convenience.
duration string Length as HH:MM:SS.
commentsCount integer Comment count. Exact below 1,000, otherwise parsed from YouTube’s rounded figure (11K = 11000). Null when comments are turned off.
text string Full description text of the Short.
descriptionLinks array URLs found in the description as {url, text} objects.
subtitles array Reserved; null in this version. Use the YouTube Transcripts API for captions.
order integer Zero-based position of the Short in the returned list for its channel.
commentsTurnedOff boolean True when the creator disabled comments on the Short.
fromYTUrl string The YouTube page the Short was read from: the channel’s Shorts tab, or the Short link itself for direct links.
isMonetized boolean Reserved; YouTube does not expose monetization publicly, so this is null.
hashtags array Hashtags found in the title and description, with the # sign.
tags array The creator’s video keywords (the tags set in YouTube Studio), in the order YouTube returns them, without a # sign. Empty list when the creator set none. Not part of the drop-in contract; an extra key that existing pipe…
isMembersOnly boolean True when the Short is restricted to channel members.
input string The exact input value (channel or link) that produced this row.
fromChannelListPage string shorts when the row came from a channel’s Shorts tab; null for direct links.
error string Present only on error rows: CHANNEL_DOES_NOT_EXIST, CHANNEL_HAS_NO_SHORTS, DATE_FILTER_TOO_STRICT, VIDEO_UNAVAILABLE, AGE_RESTRICTED, INVALID_INPUT, NO_RESULTS, YOUTUBE_BLOCKED, or INPUT_TRUNCATED. Error rows are never…
note string Human-readable explanation on error rows.