LLMExpert: cited Q&A over YouTube videos
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Ask cited questions across sets of YouTube videos, and get their transcripts. API key or x402 USDC.
| Author | io.llmexpert |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2979 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"LLMExpert: cited Q&A over YouTube videos": {
"url": "https://llmexpert.io/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (14)
query_channelread-onlyRun 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.
Parameters:
channel_id(required) — string — Channel to query. The key must be scoped to it.query(required) — string — The natural-language question.top_k— integer — Chunks to retrieve (default 5).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.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
list_channelsread-onlyList the channels the calling key is scoped to. Maps to GET /v1/channels. Cursor-paginated. Requires the key's `read` scope.
Parameters:
limit— integer — Max items (default 25).cursor— string — Opaque pagination cursor from a prior response.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
list_sourcesread-onlyList 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.
Parameters:
channel_id(required) — string — Channel whose sources to list.type— string — Filter by source type.limit— integer — Max items (default 25).cursor— string — Opaque pagination cursor.status— string — Filter by processing status.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
get_sourceread-onlyFetch a single source and its processing status (type-specific provenance included). Maps to GET /v1/sources/{sourceId}. Requires the key's `read` scope.
Parameters:
source_id(required) — string — Source identifier, e.g. src_71b0e4.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
add_sourceAdd 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.
Parameters:
channel_id(required) — string — Channel to add the source to.source(required) — The source to add (discriminated on `type`).idempotency_key— string — Idempotency-Key for safe retries.
Hints: read-only no · destructive not declared · idempotent not declared · open-world yes
get_usageread-onlyGet 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.
Parameters:
period— string — Billing period (default current).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
quoteread-onlyFree. 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.
Parameters:
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).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.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
transcribeCharged. 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.
Parameters:
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— 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.
Hints: read-only no · destructive not declared · idempotent not declared · open-world yes
create_collectionFree. 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.
Parameters:
title(required) — string — Display name for the collection.idempotency_key— string — Idempotency-Key for safe retries.
Hints: read-only no · destructive not declared · idempotent not declared · open-world yes
add_sourcesCharged 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.
Parameters:
collection_id(required) — string — Collection to add the sources to.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.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.
Hints: read-only no · destructive not declared · idempotent not declared · open-world yes
get_statusread-onlyFree. 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.
Parameters:
job_id(required) — string — The `job_id` from `transcribe` or `add_sources`.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
get_transcriptread-onlyFree. 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.
Parameters:
youtube_id(required) — string — The 11-character YouTube video id, e.g. dQw4w9WgXcQ.format— string — json (default) or text.collection_id— string — Collection the video is completed in (required with an API key).
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
query_collectionread-onlyCharged: $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.
Parameters:
collection_id(required) — string — Collection to query.query(required) — string — The natural-language question.session_id— string — Optional session for multi-turn continuity.idempotency_key— string — Idempotency-Key for safe retries.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
search_talksread-onlyAsk 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.
Parameters:
question(required) — string — The natural-language question.year— integer — Conference year, e.g. 2026.speaker— string — Part of a speaker name, case-insensitive.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.idempotency_key— string — Idempotency-Key for safe retries.
Hints: read-only yes · destructive not declared · idempotent not declared · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.