Fetch YouTube transcripts, monitor channels and track keyword matches from your AI assistant.
Maintained bytranscripthook.com(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Start monitoring a YouTube channel. Accepts a @handle, a channel URL, or a UC… channel ID. If the channel is already monitored it returns the existing subscription instead of adding a duplicate. Counts against the channel limit of your plan.
Channel @handle, channel URL, or UC… channel ID
Optional comma-separated tags for filtering later, e.g. "finance,daily"
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://transcripthook.com/mcp
Start monitoring a YouTube channel. Accepts a @handle, a channel URL, or a UC… channel ID. If the channel is already monitored it returns the existing subscription instead of adding a duplicate. Counts against the channel limit of your plan.
| Argument | Type | Description |
|---|---|---|
| label | string | Optional comma-separated tags for filtering later, e.g. "finance,daily" |
| channel* | string | Channel @handle, channel URL, or UC… channel ID |
{
"type": "object",
"required": [
"channel"
],
"properties": {
"label": {
"type": "string",
"description": "Optional comma-separated tags for filtering later, e.g. \"finance,daily\""
},
"channel": {
"type": "string",
"description": "Channel @handle, channel URL, or UC… channel ID"
}
}
}Get the current plan, its limits, and how much of each has been used — monitored channels, webhooks, on-demand transcript credits, API rate limit and poll interval. Free, and the only way to check remaining credits without spending one.
No arguments.
{
"type": "object",
"properties": {}
}Show the keyword filter set on each monitored channel (or one channel). A filter makes a channel's webhook fire only for videos whose TITLE or FULL TRANSCRIPT contains one of its keywords. Returns the keywords, whether your plan applies it, and each channel's subscription_id for set_keyword_filter and get_keyword_matches.
| Argument | Type | Description |
|---|---|---|
| channel | string | Alternatively, a UC… channel ID from list_channels. |
| subscription_id | number | Only this subscription (from list_channels). Omit to list every channel. |
{
"type": "object",
"properties": {
"channel": {
"type": "string",
"description": "Alternatively, a UC… channel ID from list_channels."
},
"subscription_id": {
"type": "number",
"description": "Only this subscription (from list_channels). Omit to list every channel."
}
}
}Videos that matched keywords since a point in time, with WHY: for each video, the matched keywords and short quotable snippets from the transcript around each hit. Built for scheduled polling: pass the previous response's next_since as since (it equals as_of unless the result was truncated), and you get exactly the videos that became matchable after your last run — including videos detected earlier whose captions arrived later. By default it applies each channel's saved keyword filter (set_keyword_filter), i.e. the same videos that would have fired that channel's webhook; or pass keywords to search ad hoc across all channels. Matching is case-insensitive and whole-word/phrase. Videos still waiting for captions are not evaluated yet and are counted in pending_transcripts. Results trail real time by about 5 seconds, so a poll never skips a video that is still being saved. Returns snippets, not full transcripts — use get_transcript for the full text.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max videos to return (default 20, max 50). Oldest first. |
| since | string | Only videos that became matchable after this: an ISO 8601 timestamp WITH a timezone (2026-10-02T14:00:00Z), a date (2026-10-02), or relative like 6h or 7d. Default 24h. Max 30 days back. |
| keywords | any | Optional. Search these keywords across all your channels instead of using each channel's saved filter. |
| subscription_id | number | Optional. Only this channel (from list_channels). |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max videos to return (default 20, max 50). Oldest first."
},
"since": {
"type": "string",
"description": "Only videos that became matchable after this: an ISO 8601 timestamp WITH a timezone (2026-10-02T14:00:00Z), a date (2026-10-02), or relative like 6h or 7d. Default 24h. Max 30 days back."
},
"keywords": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
],
"description": "Optional. Search these keywords across all your channels instead of using each channel's saved filter."
},
"subscription_id": {
"type": "number",
"description": "Optional. Only this channel (from list_channels)."
}
}
}Get recent videos from your monitored YouTube channels, including full transcripts. Useful for summarizing, searching, or analyzing recent content.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max videos to return (default: 20, max: 100) |
| since | string | How far back to look — e.g. 1h, 24h, 7d, 30d (default: 24h) |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max videos to return (default: 20, max: 100)"
},
"since": {
"type": "string",
"description": "How far back to look — e.g. 1h, 24h, 7d, 30d (default: 24h)"
}
}
}Fetch the full transcript for any YouTube video. Pass a video ID (e.g. dQw4w9WgXcQ) or a full YouTube URL. Consumes one on-demand credit per successful fetch. The full text comes back into your context so you can summarize it, quote from it and answer follow-up questions. Do not paste it back to the user: summarize or quote the relevant parts, and only print the whole transcript if the user explicitly asks to see it. length_chars says how long it is.
| Argument | Type | Description |
|---|---|---|
| video_id* | string | YouTube video ID or full YouTube URL |
{
"type": "object",
"required": [
"video_id"
],
"properties": {
"video_id": {
"type": "string",
"description": "YouTube video ID or full YouTube URL"
}
}
}List all YouTube channels you are currently monitoring in TranscriptHook, with their latest detected video. Returns each subscription_id, which add/remove/pause tools accept.
No arguments.
{
"type": "object",
"properties": {}
}Search through videos from your monitored channels by keyword. Matches against video titles and full transcript text.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results (default: 10, max: 50) |
| query* | string | Keyword or phrase to search for |
| since | string | Limit to this time window — e.g. 24h, 7d, 30d (default: 7d) |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"description": "Max results (default: 10, max: 50)"
},
"query": {
"type": "string",
"description": "Keyword or phrase to search for"
},
"since": {
"type": "string",
"description": "Limit to this time window — e.g. 24h, 7d, 30d (default: 7d)"
}
}
}Pause or resume monitoring of a channel without deleting anything. A paused channel is skipped by the poller but keeps its stored videos and transcripts. This is the safe way to stop monitoring — prefer it over remove_channel. Note: a paused channel still occupies a slot against your plan's channel limit, so pausing does not free room to add a different channel.
| Argument | Type | Description |
|---|---|---|
| active* | boolean | true to resume monitoring, false to pause |
| channel | string | Alternatively, a channel @handle, URL, or UC… channel ID. Prefer subscription_id or a UC… ID from list_channels — a @handle or URL has to be resolved against YouTube on every call. |
| subscription_id | number | Subscription ID from list_channels (preferred) |
{
"type": "object",
"required": [
"active"
],
"properties": {
"active": {
"type": "boolean",
"description": "true to resume monitoring, false to pause"
},
"channel": {
"type": "string",
"description": "Alternatively, a channel @handle, URL, or UC… channel ID. Prefer subscription_id or a UC… ID from list_channels — a @handle or URL has to be resolved against YouTube on every call."
},
"subscription_id": {
"type": "number",
"description": "Subscription ID from list_channels (preferred)"
}
}
}Set, change or clear the keyword filter on a monitored channel. With a filter, the channel's webhook fires ONLY for new videos whose title or full transcript contains at least one keyword; every other video is stored but not delivered. Matching is case-insensitive and by WHOLE WORD or phrase — "Fed" matches "the Fed's decision" but not "federal", and "tariff" does not match "tariffs" (list both). A video whose transcript is not available yet is held until it is; if captions never arrive it is skipped, never delivered unchecked. Pass an empty list to clear. Changes what gets sent to the user's webhook, so only change it when the user has asked.
| Argument | Type | Description |
|---|---|---|
| channel | string | Alternatively, a UC… channel ID from list_channels. |
| keywords* | any | Keywords or phrases, as a list (["tariffs","rate cut"]) or a comma-separated string. Max 25, each up to 100 characters. An empty list or empty string clears the filter. |
| subscription_id | number | Subscription ID from list_channels (preferred) |
{
"type": "object",
"required": [
"keywords"
],
"properties": {
"channel": {
"type": "string",
"description": "Alternatively, a UC… channel ID from list_channels."
},
"keywords": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
}
],
"description": "Keywords or phrases, as a list ([\"tariffs\",\"rate cut\"]) or a comma-separated string. Max 25, each up to 100 characters. An empty list or empty string clears the filter."
},
"subscription_id": {
"type": "number",
"description": "Subscription ID from list_channels (preferred)"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.