LLMExpert transcription
YouTube transcription and collection Q&A over MCP; pay with an API key or x402 USDC.
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"transcription": {
"url": "https://llmexpert.io/mcp"
}
}
}Puntos de conexión remotos
https://llmexpert.io/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (13)
🟢query_channel(channel_id, query, session_id, top_k, source_types, ...)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"channel_id": {
"type": "string",
"description": "Channel to query. The key must be scoped to it."
},
"query": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "The natural-language question."
},
"session_id": {
"type": "string",
"description": "Optional session for multi-turn continuity."
},
"top_k": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"description": "Chunks to retrieve (default 5)."
},
"source_types": {
"type": "array",
"items": {
"type": "string",
"enum": [
"video",
"document",
"website"
]
},
"description": "Restrict retrieval to these source types."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"required": [
"channel_id",
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢list_channels(limit, cursor)
List the channels the calling key is scoped to. Maps to GET /v1/channels. Cursor-paginated. Requires the key's `read` scope.
Esquema de entrada
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "Max items (default 25)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor from a prior response."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢list_sources(channel_id, limit, cursor, type, status)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"channel_id": {
"type": "string",
"description": "Channel whose sources to list."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"description": "Max items (default 25)."
},
"cursor": {
"type": "string",
"description": "Opaque pagination cursor."
},
"type": {
"type": "string",
"enum": [
"video",
"document",
"website"
],
"description": "Filter by source type."
},
"status": {
"type": "string",
"enum": [
"queued",
"ingesting",
"indexing",
"ready",
"error"
],
"description": "Filter by processing status."
}
},
"required": [
"channel_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_source(source_id)
Fetch a single source and its processing status (type-specific provenance included). Maps to GET /v1/sources/{sourceId}. Requires the key's `read` scope.
Esquema de entrada
{
"type": "object",
"properties": {
"source_id": {
"type": "string",
"description": "Source identifier, e.g. src_71b0e4."
}
},
"required": [
"source_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡add_source(channel_id, source, idempotency_key)
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. Requires the key's `write` scope.
Esquema de entrada
{
"type": "object",
"properties": {
"channel_id": {
"type": "string",
"description": "Channel to add the source to."
},
"source": {
"anyOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "video"
},
"youtube_video_id": {
"type": "string",
"description": "YouTube video id, e.g. dQw4w9WgXcQ."
}
},
"required": [
"type",
"youtube_video_id"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "document"
},
"file_id": {
"type": "string",
"description": "Id from a prior upload."
},
"url": {
"type": "string",
"format": "uri",
"description": "Public document URL."
},
"mime_type": {
"type": "string",
"description": "e.g. application/pdf."
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "website"
},
"url": {
"type": "string",
"format": "uri",
"description": "URL to crawl."
},
"crawl_depth": {
"type": "integer",
"minimum": 0,
"maximum": 5,
"description": "Crawl depth (default 1)."
}
},
"required": [
"type",
"url"
],
"additionalProperties": false
}
],
"description": "The source to add (discriminated on `type`)."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"required": [
"channel_id",
"source"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_usage(period)
Get usage, quota, and spend for the calling key (queries, tokens, cost, budget remaining). Maps to GET /v1/usage. Requires the key's `read` scope.
Esquema de entrada
{
"type": "object",
"properties": {
"period": {
"type": "string",
"enum": [
"current",
"previous"
],
"description": "Billing period (default current)."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢quote(url, urls, channel_url, channel_urls, max_videos_per_channel, ...)
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.10/min standard, $0.25/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.
Esquema de entrada
{
"type": "object",
"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."
},
"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."
},
"max_videos_per_channel": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"description": "Newest-first cap applied to each channel or playlist (default 25)."
},
"quality": {
"type": "string",
"enum": [
"standard",
"whisper"
],
"description": "Transcription quality (default standard)."
},
"language": {
"type": "string",
"description": "Optional BCP-47 hint for transcription, e.g. en."
},
"collection_id": {
"type": "string",
"description": "Price against this collection (videos already in it are free)."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡transcribe(url, urls, channel_url, channel_urls, max_videos_per_channel, ...)
Charged. Create a collection and start an ingest job for the given YouTube URLs in one call. Maps to POST /v1/transcribe. $0.10/min standard, $0.25/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.
Esquema de entrada
{
"type": "object",
"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."
},
"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."
},
"max_videos_per_channel": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"description": "Newest-first cap applied to each channel or playlist (default 25)."
},
"quality": {
"type": "string",
"enum": [
"standard",
"whisper"
],
"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)."
},
"title": {
"type": "string",
"description": "Title for the new collection (default: generated)."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡create_collection(title, idempotency_key)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Display name for the collection."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"required": [
"title"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡add_sources(collection_id, url, urls, channel_url, channel_urls, ...)
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.10/min standard, $0.25/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.
Esquema de entrada
{
"type": "object",
"properties": {
"collection_id": {
"type": "string",
"description": "Collection to add the sources to."
},
"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."
},
"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."
},
"max_videos_per_channel": {
"type": "integer",
"minimum": 1,
"maximum": 200,
"description": "Newest-first cap applied to each channel or playlist (default 25)."
},
"quality": {
"type": "string",
"enum": [
"standard",
"whisper"
],
"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)."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"required": [
"collection_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_status(job_id)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"job_id": {
"type": "string",
"description": "The `job_id` from `transcribe` or `add_sources`."
}
},
"required": [
"job_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_transcript(youtube_id, collection_id, format)
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.
Esquema de entrada
{
"type": "object",
"properties": {
"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)."
},
"format": {
"type": "string",
"enum": [
"json",
"text"
],
"description": "json (default) or text."
}
},
"required": [
"youtube_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢query_collection(collection_id, query, session_id, idempotency_key)
Charged: $0.05 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.
Esquema de entrada
{
"type": "object",
"properties": {
"collection_id": {
"type": "string",
"description": "Collection to query."
},
"query": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "The natural-language question."
},
"session_id": {
"type": "string",
"description": "Optional session for multi-turn continuity."
},
"idempotency_key": {
"type": "string",
"maxLength": 255,
"description": "Idempotency-Key for safe retries."
}
},
"required": [
"collection_id",
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Comunidad
Evidencia