ChannelText MCP server

Endpoint https://channeltext.com/mcp · Streamable HTTP · REST API docs · server.json · llms.txt

Let Claude, Cursor or any MCP client fetch the text of YouTube videos, playlists and whole channels. The server is a thin client of the public API: same API key, same prepaid balance, same prices.

Pricing

Your API key

Sign in, open API keys and create a key (ct_live_…). It is shown once. Every request to /mcp sends it as Authorization: Bearer ct_live_…; a missing, unknown or revoked key gets HTTP 401. There is no OAuth sign-in.

Claude Code

claude mcp add --transport http channeltext https://channeltext.com/mcp --header "Authorization: Bearer ct_live_…"

Then ask, for example: "Get the transcripts of the last 5 videos of https://www.youtube.com/@somechannel".

Claude Desktop

The Settings → Connectors → Add custom connector dialog only supports OAuth, not an API key header. Use the mcp-remote bridge (needs Node.js) in claude_desktop_config.json (Settings → Developer → Edit Config), then restart Claude Desktop:

{
  "mcpServers": {
    "channeltext": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://channeltext.com/mcp",
        "--header",
        "Authorization:${CHANNELTEXT_AUTH}"
      ],
      "env": {
        "CHANNELTEXT_AUTH": "Bearer ct_live_…"
      }
    }
  }
}

The header is passed through an environment variable, with no space after the colon, because Claude Desktop on Windows does not keep spaces inside arguments.

Cursor

Add the server to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json in one project, then enable it under Cursor Settings → MCP:

{
  "mcpServers": {
    "channeltext": {
      "url": "https://channeltext.com/mcp",
      "headers": {
        "Authorization": "Bearer ct_live_…"
      }
    }
  }
}

Any other MCP client

npx -y @modelcontextprotocol/inspector --cli https://channeltext.com/mcp --transport http --header "Authorization: Bearer ct_live_…" --method tools/list

Tools

ToolArgumentsWhat it does
get_transcriptsurl, language (optional), maxVideos (optional)Get the transcripts (the published captions, as plain text) of a YouTube video, playlist or channel. Costs $0.008 per delivered transcript, paid from the user's prepaid ChannelText balance; every job is capped by that balance (it never takes more videos than the balance covers), and videos without captions (or private, removed or blocked ones) are free. Calling it again with the same arguments on the same day (UTC) returns the same job, not a new one or a new charge. On a later day it starts a new job: for a channel or playlist that job takes the next videos this account has not received yet, and charges them. Waits up to about 45 seconds: a small finished result (up to 3 videos) comes back as text with titles and URLs; anything larger or slower returns the job id, a summary and download links, and you then call get_job to poll or to read one video's text. For channels and playlists, set maxVideos to what you need (the cost is at most maxVideos x $0.008). If the balance is too low, the user can top up $10 at https://channeltext.com/.
get_jobjobId, videoIndex (optional)Check a ChannelText job started by get_transcripts: state and progress while it runs; once finished, the transcripts as text if the result is small, otherwise a summary with download links. Pass videoIndex (the number shown in the listing) to read one video's transcript, up to about 40,000 characters. Checking a job is free; transcripts cost $0.008 each, charged once when delivered, from the prepaid balance that caps every job; videos without captions are free.
get_balancenoneShow the user's prepaid ChannelText balance in USD and how many transcripts it covers. Transcripts cost $0.008 per delivered transcript; every job is capped by this balance; videos without captions are free. Top-ups ($10) are made by the user at https://channeltext.com/.

Long jobs

get_transcripts waits up to about 45 seconds. A finished job of up to 3 videos and 40,000 characters comes back as text. Anything larger returns a summary, the first 10 videos, download links (ZIP, all text in one file, one file per video) and the job id; call get_job to poll it, or with videoIndex to read one video. Download links need the same Authorization header. A tool result is never larger than about 50 KB.