Ask cited questions across sets of YouTube videos, and get their transcripts. API key or x402 USDC.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <llmexpert /v1 API key> or a ct_ collection token. Optional: transcribe and query_collection accept x402 USDC payments without a key.
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.
Add a source to a channel and begin background ingestion. Maps to POST /v1/channels/{channelId}/sources. Only `type: video` is processed today; `document` and `website` are reserved and return a 501 error until released. Charged from the key owner's prepaid balance at the ingest rate: $0.01/min standard, $0.03/min whisper by default, 1-minute minimum per video. A short balance returns a 402 error. Requires the key's `write` scope.
The source to add (discriminated on `type`).
Channel to add the source to.
Idempotency-Key for safe retries.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 25, 2026.
Add a source to a channel and begin background ingestion. Maps to POST /v1/channels/{channelId}/sources. Only `type: video` is processed today; `document` and `website` are reserved and return a 501 error until released. Charged from the key owner's prepaid balance at the ingest rate: $0.01/min standard, $0.03/min whisper by default, 1-minute minimum per video. A short balance returns a 402 error. Requires the key's `write` scope.
| Argument | Type | Description |
|---|---|---|
| source* | any | The source to add (discriminated on `type`). |
| channel_id* | string | Channel to add the source to. |
| idempotency_key | string | Idempotency-Key for safe retries. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"channel_id",
"source"
],
"properties": {
"source": {
"anyOf": [
{
"type": "object",
"required": [
"type",
"youtube_video_id"
],
"properties": {
"type": {
"type": "string",
"const": "video"
},
"youtube_video_id": {
"type": "string",
"description": "YouTube video id, e.g. dQw4w9WgXcQ."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "Public document URL."
},
"type": {
"type": "string",
"const": "document"
},
"file_id": {
"type": "string",
"description": "Id from a prior upload."
},
"mime_type": {
"type": "string",
"description": "e.g. application/pdf."
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"type",
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "URL to crawl."
},
"type": {
"type": "string",
"const": "website"
},
"crawl_depth": {
"type": "integer",
"maximum": 5,
"minimum": 0,
"description": "Crawl depth (default 1)."
}
},
"additionalProperties": false
}
],
"description": "The source to add (discriminated on `type`)."
},
"channel_id": {
"type": "string",
"description": "Channel to add the source to."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"additionalProperties": false
}Charged like `transcribe`. Expand the given YouTube URLs, charge for the new work and start an ingest job in an existing collection. Maps to POST /v1/collections/{collectionId}/sources. $0.01/min standard, $0.03/min whisper by default, 1-minute minimum per video. Videos already in the collection are free. Pass a `quote_id` from `quote` to be charged exactly that price. Poll `get_status` every 10–30 s until `status` is completed, partial or failed; `completed` means every accepted video is transcribed and indexed, so the collection is queryable. API key required (the key's `write` scope). Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| url | string | One YouTube URL (video, @handle, /channel/UC…, or playlist). |
| urls | array | Several YouTube URLs. |
| quality | string | Transcription quality (default standard). |
| language | string | Optional BCP-47 hint for transcription, e.g. en. |
| quote_id | string | A `quote_id` from `quote`: charges exactly the quoted price (400 if unknown or expired). |
| channel_url | string | `https://www.youtube.com/@handle`, `/channel/UC…`, or a playlist URL. |
| channel_urls | array | Several channel or playlist URLs. |
Free. Create an empty collection to add sources to later with `add_sources`. Maps to POST /v1/collections. Returns the collection and its `collection_token` (`ct_…`, shown once: store it; absent on an idempotent replay). API key required (the key's `write` scope). Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| title* | string | Display name for the collection. |
| idempotency_key | string | Idempotency-Key for safe retries. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"description": "Display name for the collection."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"additionalProperties": false
}Fetch a single source and its processing status (type-specific provenance included). Maps to GET /v1/sources/{sourceId}. Requires the key's `read` scope.
| Argument | Type | Description |
|---|---|---|
| source_id* | string | Source identifier, e.g. src_71b0e4. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"source_id"
],
"properties": {
"source_id": {
"type": "string",
"description": "Source identifier, e.g. src_71b0e4."
}
},
"additionalProperties": false
}Free. Get an ingest job started by `transcribe` or `add_sources`. Maps to GET /v1/jobs/{jobId}. Poll every 10–30 s until `status` is completed, partial or failed (terminal). `completed` means every accepted video is transcribed and indexed, so the collection is queryable; `partial` means some videos failed and were credited back (`credited_usd`); `videos.completed` / `videos.failed` count progress. Works with an API key or the collection's `ct_` token as the bearer. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The `job_id` from `transcribe` or `add_sources`. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "The `job_id` from `transcribe` or `add_sources`."
}
},
"additionalProperties": false
}Free. Get the transcript of a video that is completed in one of your collections. Maps to GET /v1/videos/{youtubeId}/transcript. `collection_id` is required with an API key; with the collection's `ct_` token as the bearer it defaults to the token's collection. `format` is json (segments with timestamps, default) or text (one `[H:MM:SS] text` line per segment). 404 when the video is not completed in that collection, or the transcript predates the transcript cache. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| format | string | json (default) or text. |
| youtube_id* | string | The 11-character YouTube video id, e.g. dQw4w9WgXcQ. |
| collection_id | string | Collection the video is completed in (required with an API key). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"youtube_id"
],
"properties": {
"format": {
"enum": [
"json",
"text"
],
"type": "string",
"description": "json (default) or text."
},
"youtube_id": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{11}$",
"description": "The 11-character YouTube video id, e.g. dQw4w9WgXcQ."
},
"collection_id": {
"type": "string",
"description": "Collection the video is completed in (required with an API key)."
}
},
"additionalProperties": false
}Get usage and spend in dollars for the calling key: the account balance (wallet_usd), this period's spend (consumed_usd), query count, and budget remaining. Maps to GET /v1/usage. Requires the key's `read` scope.
| Argument | Type | Description |
|---|---|---|
| period | string | Billing period (default current). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"period": {
"enum": [
"current",
"previous"
],
"type": "string",
"description": "Billing period (default current)."
}
},
"additionalProperties": false
}List the channels the calling key is scoped to. Maps to GET /v1/channels. Cursor-paginated. Requires the key's `read` scope.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max items (default 25). |
| cursor | string | Opaque pagination cursor from a prior response. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Max items (default 25)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a prior response."
}
},
"additionalProperties": false
}List the sources (video/document/website) in a channel, optionally filtered by type or status. Maps to GET /v1/channels/{channelId}/sources. Cursor-paginated. Requires the key's `read` scope.
| Argument | Type | Description |
|---|---|---|
| type | string | Filter by source type. |
| limit | integer | Max items (default 25). |
| cursor | string | Opaque pagination cursor. |
| status | string | Filter by processing status. |
| channel_id* | string | Channel whose sources to list. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"channel_id"
],
"properties": {
"type": {
"enum": [
"video",
"document",
"website"
],
"type": "string",
"description": "Filter by source type."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Max items (default 25)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor."
},
"status": {
"enum": [
"queued",
"ingesting",
"indexing",
"ready",
"error"
],
"type": "string",
"description": "Filter by processing status."
},
"channel_id": {
"type": "string",
"description": "Channel whose sources to list."
}
},
"additionalProperties": false
}Run a retrieval-augmented query against a channel's indexed knowledge base and return a generated answer with citations. Maps to POST /v1/query. Requires the key's `query` scope and access to the channel. Charged: $0.02 flat per call by default. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| query* | string | The natural-language question. |
| top_k | integer | Chunks to retrieve (default 5). |
| channel_id* | string | Channel to query. The key must be scoped to it. |
| session_id | string | Optional session for multi-turn continuity. |
| source_types | array | Restrict retrieval to these source types. |
| idempotency_key | string | Idempotency-Key for safe retries. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"channel_id",
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The natural-language question."
},
"top_k": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Chunks to retrieve (default 5)."
},
"channel_id": {
"type": "string",
"description": "Channel to query. The key must be scoped to it."
},
"session_id": {
"type": "string",
"description": "Optional session for multi-turn continuity."
},
"source_types": {
"type": "array",
"items": {
"enum": [
"video",
"document",
"website"
],
"type": "string"
},
"description": "Restrict retrieval to these source types."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"additionalProperties": false
}Charged: $0.02 flat per call by default, no token multiplier. Ask a question of a collection and get a generated answer with citations. Maps to POST /v1/collections/{collectionId}/query. Query a collection once `get_status` says completed. With an API key it needs the key's `query` scope. Without an API key this tool is payable in USDC via x402: the first call returns a payment-required result (`isError` with the payment requirements in `structuredContent`); an x402-aware MCP client signs and retries the same call with `_meta['x402/payment']`, and the receipt returns in the result's `_meta['x402/payment-response']`. Never pay again after a 409 (already presented) or 502 (settlement unknown) result. Keyless, only the address that paid for the collection may query it. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| query* | string | The natural-language question. |
| session_id | string | Optional session for multi-turn continuity. |
| collection_id* | string | Collection to query. |
| idempotency_key | string | Idempotency-Key for safe retries. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"collection_id",
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The natural-language question."
},
"session_id": {
"type": "string",
"description": "Optional session for multi-turn continuity."
},
"collection_id": {
"type": "string",
"description": "Collection to query."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"additionalProperties": false
}Free. Expand YouTube URLs exactly as an ingest would and return the price, the per-video lines and the per-source rejections. Maps to POST /v1/quote. $0.01/min standard, $0.03/min whisper by default, 1-minute minimum per video. The `quote_id` is valid for 15 minutes; pass it to `transcribe` or `add_sources` to be charged exactly this price. Pass `collection_id` to price against an existing collection (videos already in it are free). At least one of url, urls, channel_url, channel_urls. Requires the key's `read` scope. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| url | string | One YouTube URL (video, @handle, /channel/UC…, or playlist). |
| urls | array | Several YouTube URLs. |
| quality | string | Transcription quality (default standard). |
| language | string | Optional BCP-47 hint for transcription, e.g. en. |
| channel_url | string | `https://www.youtube.com/@handle`, `/channel/UC…`, or a playlist URL. |
| channel_urls | array | Several channel or playlist URLs. |
| collection_id | string | Price against this collection (videos already in it are free). |
Ask a question across about 490 curated 2026 conference talks and get a generated answer whose citations give each talk's video URL (with t=) and start_seconds, plus its conference, year and speakers. Optional filters: conference (one of ai-engineer-worlds-fair, ai-engineer-europe, kubecon-eu, google-cloud-next, microsoft-build, pycon-us, google-io, code-with-claude, openai-devday), year, and speaker (part of a name, case-insensitive; speakers are known for about half the talks, so a speaker filter misses the rest). A filter that matches no talk answers `answer: null` and costs nothing. Maps to POST /v1/search/talks. Charged: $0.02 flat per call by default, or free within the daily free allowance. With an API key it needs the key's `query` scope. Without an API key this tool is payable in USDC via x402: the first call returns a payment-required result (`isError` with the payment requirements in `structuredContent`); an x402-aware MCP client signs and retries the same call with `_meta['x402/payment']`, and the receipt returns in the result's `_meta['x402/payment-response']`. Never pay again after a 409 (already presented) or 502 (settlement unknown) result. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| year | integer | Conference year, e.g. 2026. |
| speaker | string | Part of a speaker name, case-insensitive. |
| question* | string | The natural-language question. |
| conference | string | Conference slug: ai-engineer-worlds-fair, ai-engineer-europe, kubecon-eu, google-cloud-next, microsoft-build, pycon-us, google-io, code-with-claude, openai-devday. |
Charged. Create a collection and start an ingest job for the given YouTube URLs in one call. Maps to POST /v1/transcribe. $0.01/min standard, $0.03/min whisper by default, 1-minute minimum per video. Pass a `quote_id` from `quote` to be charged exactly that price. Returns `job_id`, `collection_id` and `collection_token` (`ct_…`, shown once: store it; it reads this collection without an API key). Poll `get_status` every 10–30 s until `status` is completed, partial or failed; `completed` means every accepted video is transcribed and indexed, so the collection is queryable. With an API key it needs the key's `write` scope. Without an API key this tool is payable in USDC via x402: the first call returns a payment-required result (`isError` with the payment requirements in `structuredContent`); an x402-aware MCP client signs and retries the same call with `_meta['x402/payment']`, and the receipt returns in the result's `_meta['x402/payment-response']`. Never pay again after a 409 (already presented) or 502 (settlement unknown) result. Keyless `transcribe` takes one channel-like source and at most 3 videos. Prices are the service defaults; `quote` returns the exact price.
| Argument | Type | Description |
|---|---|---|
| url | string | One YouTube URL (video, @handle, /channel/UC…, or playlist). |
| urls | array | Several YouTube URLs. |
| title | string | Title for the new collection (default: generated). |
| quality | string | Transcription quality (default standard). |
| language | string | Optional BCP-47 hint for transcription, e.g. en. |
| quote_id |
| collection_id* |
| string |
| Collection to add the sources to. |
| exclude_shorts | boolean | Skip videos of 3 minutes or less when expanding a channel or playlist (default true); explicit video URLs are never skipped. |
| idempotency_key | string | Idempotency-Key for safe retries. |
| min_duration_seconds | integer | Skip expanded videos shorter than this many seconds. |
| max_videos_per_channel | integer | Newest-first cap on eligible videos per channel or playlist (default 25); Shorts and videos below min_duration_seconds are skipped before the cap. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"collection_id"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "One YouTube URL (video, @handle, /channel/UC…, or playlist)."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "Several YouTube URLs."
},
"quality": {
"enum": [
"standard",
"whisper"
],
"type": "string",
"description": "Transcription quality (default standard)."
},
"language": {
"type": "string",
"description": "Optional BCP-47 hint for transcription, e.g. en."
},
"quote_id": {
"type": "string",
"description": "A `quote_id` from `quote`: charges exactly the quoted price (400 if unknown or expired)."
},
"channel_url": {
"type": "string",
"description": "`https://www.youtube.com/@handle`, `/channel/UC…`, or a playlist URL."
},
"channel_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Several channel or playlist URLs."
},
"collection_id": {
"type": "string",
"description": "Collection to add the sources to."
},
"exclude_shorts": {
"type": "boolean",
"description": "Skip videos of 3 minutes or less when expanding a channel or playlist (default true); explicit video URLs are never skipped."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
},
"min_duration_seconds": {
"type": "integer",
"maximum": 14400,
"minimum": 0,
"description": "Skip expanded videos shorter than this many seconds."
},
"max_videos_per_channel": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Newest-first cap on eligible videos per channel or playlist (default 25); Shorts and videos below min_duration_seconds are skipped before the cap."
}
},
"additionalProperties": false
}| exclude_shorts | boolean | Skip videos of 3 minutes or less when expanding a channel or playlist (default true); explicit video URLs are never skipped. |
| min_duration_seconds | integer | Skip expanded videos shorter than this many seconds. |
| max_videos_per_channel | integer | Newest-first cap on eligible videos per channel or playlist (default 25); Shorts and videos below min_duration_seconds are skipped before the cap. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "One YouTube URL (video, @handle, /channel/UC…, or playlist)."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "Several YouTube URLs."
},
"quality": {
"enum": [
"standard",
"whisper"
],
"type": "string",
"description": "Transcription quality (default standard)."
},
"language": {
"type": "string",
"description": "Optional BCP-47 hint for transcription, e.g. en."
},
"channel_url": {
"type": "string",
"description": "`https://www.youtube.com/@handle`, `/channel/UC…`, or a playlist URL."
},
"channel_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Several channel or playlist URLs."
},
"collection_id": {
"type": "string",
"description": "Price against this collection (videos already in it are free)."
},
"exclude_shorts": {
"type": "boolean",
"description": "Skip videos of 3 minutes or less when expanding a channel or playlist (default true); explicit video URLs are never skipped."
},
"min_duration_seconds": {
"type": "integer",
"maximum": 14400,
"minimum": 0,
"description": "Skip expanded videos shorter than this many seconds."
},
"max_videos_per_channel": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Newest-first cap on eligible videos per channel or playlist (default 25); Shorts and videos below min_duration_seconds are skipped before the cap."
}
},
"additionalProperties": false
}| idempotency_key | string | Idempotency-Key for safe retries. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"question"
],
"properties": {
"year": {
"type": "integer",
"description": "Conference year, e.g. 2026."
},
"speaker": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Part of a speaker name, case-insensitive."
},
"question": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The natural-language question."
},
"conference": {
"type": "string",
"description": "Conference slug: ai-engineer-worlds-fair, ai-engineer-europe, kubecon-eu, google-cloud-next, microsoft-build, pycon-us, google-io, code-with-claude, openai-devday."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"additionalProperties": false
}| string |
| A `quote_id` from `quote`: charges exactly the quoted price (400 if unknown or expired). |
| channel_url | string | `https://www.youtube.com/@handle`, `/channel/UC…`, or a playlist URL. |
| channel_urls | array | Several channel or playlist URLs. |
| exclude_shorts | boolean | Skip videos of 3 minutes or less when expanding a channel or playlist (default true); explicit video URLs are never skipped. |
| idempotency_key | string | Idempotency-Key for safe retries. |
| min_duration_seconds | integer | Skip expanded videos shorter than this many seconds. |
| max_videos_per_channel | integer | Newest-first cap on eligible videos per channel or playlist (default 25); Shorts and videos below min_duration_seconds are skipped before the cap. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"url": {
"type": "string",
"format": "uri",
"description": "One YouTube URL (video, @handle, /channel/UC…, or playlist)."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"description": "Several YouTube URLs."
},
"title": {
"type": "string",
"description": "Title for the new collection (default: generated)."
},
"quality": {
"enum": [
"standard",
"whisper"
],
"type": "string",
"description": "Transcription quality (default standard)."
},
"language": {
"type": "string",
"description": "Optional BCP-47 hint for transcription, e.g. en."
},
"quote_id": {
"type": "string",
"description": "A `quote_id` from `quote`: charges exactly the quoted price (400 if unknown or expired)."
},
"channel_url": {
"type": "string",
"description": "`https://www.youtube.com/@handle`, `/channel/UC…`, or a playlist URL."
},
"channel_urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "Several channel or playlist URLs."
},
"exclude_shorts": {
"type": "boolean",
"description": "Skip videos of 3 minutes or less when expanding a channel or playlist (default true); explicit video URLs are never skipped."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
},
"min_duration_seconds": {
"type": "integer",
"maximum": 14400,
"minimum": 0,
"description": "Skip expanded videos shorter than this many seconds."
},
"max_videos_per_channel": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Newest-first cap on eligible videos per channel or playlist (default 25); Shorts and videos below min_duration_seconds are skipped before the cap."
}
},
"additionalProperties": false
}