# LLMExpert: cited Q&A over YouTube videos

> Ask cited questions across sets of YouTube videos, and get their transcripts. API key or x402 USDC.

- name: io.llmexpert/transcription
- version: 0.2.1
- connection class: R0 (autonomous)
- trust: 83/100 flags: no-repository
- quality: 77/100 (new)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.llmexpert%2Ftranscription
- tools: https://api.protogrid.dev/v1/servers/io.llmexpert%2Ftranscription/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "transcription": {
      "type": "http",
      "url": "https://llmexpert.io/mcp",
      "headers": {
        "Authorization": "Bearer ${TRANSCRIPTION_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${TRANSCRIPTION_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 100
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% +updated-0d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 77/100 (new)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 13 of 13 tools declare readOnlyHint or destructiveHint
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: get_usage (destructiveHint, idempotentHint); get_transcript (destructiveHint, idempotentHint); create_collection (destructiveHint, idempotentHint); …
- pass `tools.token_cost`: about 3,842 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: n/a (weight 15)

- n/a `stability.changes`, `stability.rug_pull`: tool history recorded for 1 of the 7 days needed

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 13, about 3,842 tokens to load them all
- tool set hash: 44fd3337289a42225be9b91d098dc275
- badge: [![protogrid quality](https://protogrid.dev/badge/io.llmexpert/transcription.svg)](https://protogrid.dev/servers/io.llmexpert/transcription)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

_No tool definition changes recorded._

## Remotes

- https://llmexpert.io/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (13)

- `add_source`: 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.
- `add_sources`: 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.
- `create_collection`: 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.
- `get_source`: Fetch a single source and its processing status (type-specific provenance included). Maps to GET /v1/sources/{sourceId}. Requires the key's `read` scope.
- `get_status`: 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.
- `get_transcript`: 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.
- `get_usage`: 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.
- `list_channels`: List the channels the calling key is scoped to. Maps to GET /v1/channels. Cursor-paginated. Requires the key's `read` scope.
- `list_sources`: 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.
- `query_channel`: 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.
- `query_collection`: 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.
- `quote`: 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.
- `transcribe`: 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.
