Skip to main content
Glama

qencode-mcp

Model Context Protocol (MCP) server for the Qencode Transcoding API.

Connect any MCP-compatible AI client — Claude, Cursor, ChatGPT, Grok, Gemini — to your Qencode account and let it submit, monitor, and reason about transcoding jobs on your behalf.

Quick example

Once your client is connected (see Connect a client), ask your agent in plain English:

Transcode https://example.com/input.mp4 as an HLS ladder at 1080/720/540/360. Put it in my R2 bucket videos/demo/.

The agent picks the hls_abr recipe, fills in the per-rendition encoding params, submits via start_encode2_raw, and polls until the job is done.

Related MCP server: video-analyzer

Prerequisites

  • A Qencode portal account with at least one project — sign in at the portal for your environment: https://portal.qencode.com (production) or https://portal-qa.qencode.com (QA). You select the project during the OAuth consent step.

  • An MCP-compatible client (Claude, Cursor, ChatGPT, Grok, Gemini, or any custom client).

There are no API keys to copy into client config — authentication is browser-based OAuth.

How it works

The connector uses standard OAuth 2.1 — no API keys in client config. On first use, your client opens a browser, you sign in to your Qencode portal account, pick a project, and approve the requested scopes. The client stores the token; subsequent calls are silent until the token expires.

Scopes the client should request at authorize time (published via Protected Resource Metadata):

Scope

Purpose

openid

OIDC identity

profile

Display name

email

Account email

offline_access

Refresh token

transcoding:read

get_job_status, wait_for_job, docs tools

transcoding:write

transcode_video, start_encode2_raw

The RS enforces transcoding:read and transcoding:write on access tokens at the transport layer.

Your Qencode API keys never leave the portal. The MCP server derives a short-lived session token per request via an internal portal endpoint.

Environments

The same connector is deployed in two environments. Each has its own domains, accounts, projects, and credentials — sign in to the portal that matches the endpoint you connect to.

Role

Production

QA (testing)

MCP endpoint (connect here)

https://mcp.qencode.com/mcp

https://mcp-qa.qencode.com/mcp

Portal (sign in / projects)

https://portal.qencode.com

https://portal-qa.qencode.com

Authorization server

https://auth.qencode.com

https://auth-qa.qencode.com

Qencode API

https://api.qencode.com

https://api-qa.qencode.com

The instructions below use the production endpoint. To test against QA, swap in the QA URL and sign in at the QA portal.

Connect a client

Endpoint: https://mcp.qencode.com/mcp — same for every client below. Sign in to your Qencode account when the browser opens and approve access.

QA (internal testing): use https://mcp-qa.qencode.com/mcp and sign in at the QA portal instead.

Client

Where to add it

MCP URL / config

Claude (chat)

Message box → + → Connectors → Add connector

https://mcp.qencode.com/mcp

Claude Code

Terminal

claude mcp add --transport http qencode https://mcp.qencode.com/mcp

ChatGPT

Apps → search Qencode → Connect; or Developer Mode → Build app

Connector URL: https://mcp.qencode.com/mcp

Gemini

~/.gemini/settings.jsonmcpServers

"httpUrl": "https://mcp.qencode.com/mcp" — then /mcp auth qencode in the CLI

Cursor

Settings → Tools & MCP → New MCP Server (or ~/.cursor/mcp.json)

"url": "https://mcp.qencode.com/mcp" — restart Cursor after saving

Cursor (mcp.json):

{
  "mcpServers": {
    "qencode": { "url": "https://mcp.qencode.com/mcp" }
  }
}

Gemini (settings.json):

{
  "mcpServers": {
    "qencode": {
      "httpUrl": "https://mcp.qencode.com/mcp",
      "timeout": 30000,
      "trust": false
    }
  }
}

Tip: sign in to portal.qencode.com in your browser before connecting — OAuth goes smoother.

What the connector exposes

Tools

Transcoding & jobs

Tool

Description

transcode_video

Submit a job from a source URL to one or more outputs. Convenience wrapper — auto-injects encoder_version: 2 (or 1 for VMAF) when omitted.

start_encode2_raw

Escape hatch — submit a job with the full query JSON exactly as the Qencode API expects.

get_job_status

One-shot status snapshot by task_token.

get_job_status_detailed

Full, authoritative job status, including per-rendition progress and output details.

wait_for_job

Poll until terminal state, timeout, or internal poll cap. Do not call in parallel with other tools in the same client batch.

search_qencode_docs

Search the built-in knowledge base of recipes and reference docs.

fetch_qencode_doc

Fetch the full content of a knowledge-base resource by qencode:// URI (tool-based counterpart to resources/read).

Media Storage

Bucket management and ingest for Qencode Media Storage. These ride the same OAuth grant as the transcoding tools — no extra scope and no re-consent.

Tool

Description

list_buckets

List the Media Storage buckets available to the account.

create_bucket

Create a new bucket. Called only on an explicit request — not to satisfy a missing destination.

list_objects

Browse the contents of a bucket.

get_download_url

Return a time-limited download URL for an existing object.

download_url_to_bucket

Server-side copy of a public URL into a bucket (ingest, no transcoding).

Resources

The server ships a knowledge base of recipes and reference docs, exposed as MCP resources so the agent can fetch only what it needs. Notable URIs:

  • qencode://docs/best-practices — composition defaults the agent applies automatically

  • qencode://docs/storage — destination compatibility matrix (Qencode S3, R2, AWS S3, Azure, B2, FTP/SFTP)

  • qencode://docs/error-codes — error code → cause → fix

  • qencode://docs/gotchas — non-obvious API quirks

  • qencode://schema/digest — full attribute reference for start_encode2

  • qencode://recipe/<slug> — one per feature flow: hls_abr, mp4_ladder, audio_outputs, thumbnails, speech_to_text, subtitles, stitching, drm_widevine_ezdrm, drm_fairplay_ezdrm, drm_playready_ezdrm, drm_aes128, drm_buydrm, drm_expressplay, codec_av1, per_title_encoding, incremental_abr, refresh_abr_playlist, callbacks, reliability, video_metadata

Use search_qencode_docs to discover the right recipe URI for a goal.

Prompts (slash commands)

In clients that surface MCP prompts, 21 one-shot templates are available. Each tells the agent to read the matching qencode://recipe/... resource and submit via start_encode2_raw.

ABR / packaging: encode_hls_abr, encode_dash_abr, encode_mp4_ladder, encode_incremental_rung, encode_refreshing_playlist

Codecs / quality: encode_av1, tune_per_title

Audio / images / text: extract_audio, generate_thumbnails, transcribe, add_subtitles

Probe / stitch: get_video_metadata, stitch_videos

Production hooks: enable_callbacks, enable_reliability

DRM: encode_aes128_hls, encode_widevine_ezdrm, encode_playready_ezdrm, encode_fairplay_ezdrm, encode_drm_buydrm, encode_drm_expressplay

Source URL rules

transcode_video and start_encode2_raw accept source values with schemes https://, http://, s3://, or tus:. FTP/SFTP and private/metadata URLs are rejected at the tool boundary (SSRF defence). See docs/security/THREAT_MODEL.md for limitations.

Security

Authentication is OAuth 2.1 only — there is no static-API-key mode. Your Qencode API keys never leave the portal; the server derives a fresh, short-lived session token per request via an internal portal endpoint. Source URLs are validated at the tool boundary (SSRF defence — see Source URL rules).

Full threat model and adversarial test coverage: docs/security/THREAT_MODEL.md.

Development

uv venv && uv pip install -e ".[dev]"
NO_NETWORK=1 pytest -q              # offline L1 + L2 + L5 (~540 tests)
pytest -m protocol                # MCP wire conformance only
pytest -m unit                    # per-tool logic (FakeQencode)
pytest -m security                # OWASP MCP Top 10 adversarial suite

Protocol tests run fully offline (mocked Authorization Server, portal, and Qencode API). CI is the Jenkins job mcp_automated_tests (Jenkinsfile.manual): manual checkboxes for any layer, nightly L3 cron, weekly L4 cron.

Supported MCP protocol versions

Clients negotiate a version at initialize. This server targets MCP 2025-11-25 as the primary version. CI also runs conformance tests against 2025-06-18 because JSON-RPC batching behavior differs between earlier revisions. We do not claim support for 2025-03-26 or older wire semantics beyond what the underlying SDK negotiates.

Version

Support

Notes

2025-11-25

Primary

Streamable HTTP, resumable SSE where used

2025-06-18

CI matrix

Regression guard for mid-2025 clients

2025-03-26

Not targeted

Batching semantics differ from 2025-06-18

Directory listings (Glama)

The connector users install is the hosted endpoint above. For Glama Servers / awesome-mcp-servers scoring only, this repo also ships qencode-mcp-inspect (stdio, dummy env, tools/call refused). That is not a supported client transport. See docs/glama-release.md.

More docs

Versioning policy

The connector follows SemVer applied to the MCP surface — tools, prompts, resources, OAuth scopes, and supported protocol versions. Qencode HTTP API changes are out of scope (they are the API's own concern, not the connector's).

  • MAJOR — a breaking surface change: a tool/prompt/resource is removed or renamed, a previously optional argument becomes required, an OAuth scope is added or tightened in a way that forces re-consent, or a supported MCP protocol version is dropped.

  • MINOR — a backward-compatible addition: a new tool/prompt/resource, a new optional argument, or a newly supported protocol version.

  • PATCH — no change to the surface shape: tool/prompt description rewordings, knowledge-base/doc updates, and bug fixes.

Surface changes are guarded by snapshot tests under tests/protocol/. When you change the surface, regenerate the snapshots (python scripts/regen_tools_snapshot.py) and bump the version in the same PR: pyproject.toml, src/qencode_mcp/__init__.py, server.json, and a new CHANGELOG.md entry must all agree.

Available Tools

12 tools
create_bucketAInspect

Create a new Qencode Media Storage bucket.

Call this ONLY on an explicit request to create a bucket or to keep a
result long-term. Do NOT call it just because a transcoding request lacks a
`destination`, or because the user says they have no bucket / nowhere to
save the output — that is the default temp-storage case: omit `destination`
(24-hour temp storage) and disclose it, do not provision an account-level
bucket the user did not ask for.

Args:
    name: 6–63 chars, lowercase letters / digits / hyphens
        (`^[a-z0-9][a-z0-9-]{4,61}[a-z0-9]$`) — no underscores or uppercase.
        A name that breaks this pattern is rejected (`invalid_bucket_name`).
    region: one of us-west, eu-central.

Returns `{bucket, region, status}`:
  - `status: "created"` — a new bucket was provisioned.
  - `status: "exists"` — you already own a bucket with this name (no-op).
A name already taken by another account fails with `bucket_conflict`.

The bucket's CDN endpoint is provisioned asynchronously, so a new bucket is
usually usable within a few seconds but may not appear in `list_buckets`
immediately — poll `list_buckets` if you need to confirm it before using it.
During that same async window the bucket reports `public: false` and then
flips to `public: true` within a few seconds up to ~a minute as CDN
provisioning completes; the `public` value read right after creation is not
stable (see qencode://docs/storage).

This tool does not make the bucket public; visibility is otherwise managed in
the Qencode portal.
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
regionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
bucketYes
regionYes
statusYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses async provisioning, unstable public value, and that it does not make the bucket public, going beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise but detailed, with clear sections; front-loads purpose and call guidance, then args/returns, then additional notes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for the complexity: covers call conditions, arg constraints, return statuses, async behavior, polling, and portal visibility.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds constraints on name (regex, lowercase, digits, hyphens) and region (us-west, eu-central), plus validation outcome 'invalid_bucket_name'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb 'Create' with resource 'Qencode Media Storage bucket' and distinguishes from siblings by explicitly saying when NOT to call (e.g., 'Do NOT call it just because a transcoding request lacks a destination').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says call ONLY on explicit request to create or keep long-term, and provides alternative behavior (omit destination, disclose) and suggests polling list_buckets to confirm.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_url_to_bucketAInspect

Server-side copy of a public URL into a bucket (no transcoding).

The server fetches `source_url` itself and streams the bytes straight into
the bucket via a short-lived presigned upload — use this to ingest an
existing asset into Qencode Media Storage as-is. To store a *transcoded*
result instead, set a `destination` on a transcoding job.

IMPORTANT — this call is synchronous and blocking: it returns only after the
whole file has been fetched and uploaded, and there is no job token or
progress to poll (unlike transcoding). The transfer must finish inside the
presigned upload window (~10 minutes) and is size-capped server-side, so it
suits small/medium assets; very large or slow sources may time out — upload
those out-of-band instead.

Args:
    source_url: a publicly reachable `http(s)` URL the server can fetch
        directly. Non-http(s) schemes and private/loopback hosts are
        rejected up front; a source that responds with a redirect or a
        4xx/5xx fails the transfer.
    bucket: destination bucket name.
    key: destination object key (e.g. `raw/input.mov`). An existing object
        at this key is overwritten.

Returns `{bucket, key, size_bytes, status: "uploaded"}`.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes
source_urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyYes
bucketYes
statusYes
size_bytesYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors beyond the annotations: it is synchronous and blocking, has a ~10 minute presigned upload window, size caps, and overwrites existing objects ('An existing object at this key is overwritten'). It also details failure conditions for source URLs (non-http(s), private hosts, redirects, 4xx/5xx). These transparently state side effects and constraints, with no contradiction to the annotations (readOnlyHint=false, destructiveHint=false).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured: a concise introductory statement, a clear paragraph on synchronous behavior and limitations, individual parameter details, and a return type specification. Each sentence adds essential information without redundancy. The formatting with section breaks improves scannability while remaining appropriately detailed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers all necessary aspects: what it does, when to use it vs alternatives, parameter semantics, synchronous vs asynchronous behavior, failure modes, overwrite semantics, and the return value structure. The included return schema `{bucket, key, size_bytes, status: "uploaded"}` is sufficient. Nothing critical is omitted for an agent to decide and correctly invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the input schema has no descriptions (0% coverage), the tool description fully explains all three parameters: source_url includes requirements (publicly reachable http(s), no private hosts, redirects fail), bucket is the destination name, and key includes overwrite behavior. This provides complete semantic meaning beyond the bare schema property names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Server-side copy of a public URL into a bucket (no transcoding).' It explicitly distinguishes this from transcoding jobs, and the title 'Fetch URL into bucket' reinforces the purpose. The verb 'copy' and resource 'bucket' are specific, and the no-transcoding note differentiates it from sibling tools like transcode_video.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use this tool vs alternatives: 'use this to ingest an existing asset into Qencode Media Storage as-is. To store a *transcoded* result instead, set a `destination` on a transcoding job.' It also advises against using this for large files and suggests out-of-band uploads, giving clear criteria for selection among sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_qencode_docA
Read-onlyIdempotent
Inspect

Read the full content of a Qencode knowledge-base resource by URI.

Works for every URI returned by `search_qencode_docs` — recipes, best
practices, storage, gotchas, error codes, and the schema digest. This
is the tool-based counterpart to the MCP `resources/read` operation,
provided because some MCP clients (notably Claude Desktop) don't expose
`resources/read` to the model directly.

Args:
    uri: a `qencode://...` URI from a `search_qencode_docs` hit.
        Examples:
          - qencode://recipe/hls_abr
          - qencode://docs/best-practices
          - qencode://docs/storage
          - qencode://docs/error-codes
          - qencode://schema/digest

Returns:
    A dict with `uri`, `mime_type`, and `content` (the full markdown or
    JSON, depending on the doc). On unknown URI, returns
    `{"error": "...", "available_uris": [...]}` listing the URIs you can
    try instead.
ParametersJSON Schema
NameRequiredDescriptionDefault
uriYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
uriNo
errorNo
titleNo
contentNo
mime_typeNo
available_urisNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the exact return structure (uri, mime_type, content) and, notably, the error behavior on unknown URIs (returns error dict with available_uris). This is meaningful disclosure of failure semantics that the annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with a front-loaded purpose sentence followed by scope, Args with examples, and Returns with error behavior. It runs a bit long, but every section earns its place — the URI examples and error-handling detail are high-value for a reader. Slightly verbose but justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a single-parameter read tool: purpose, scope, usage routing, parameter semantics with examples, return format, and error behavior are all covered. Output schema exists and annotations carry the safety profile, so nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% — the schema declares only a bare string named 'uri' with no description. The description fully compensates by explaining the value is a qencode:// URI from search_qencode_docs and supplying five concrete examples across recipe, docs, and schema namespaces. For a single parameter this is complete, actionable documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('Qencode knowledge-base resource by URI'), and explicitly ties its scope to URIs returned by search_qencode_docs, distinguishing it from the transcode/storage siblings. It even positions itself as the tool-based counterpart to resources/read, which clarifies its role versus other read mechanisms.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context on when to use it: with any URI produced by search_qencode_docs, and explains it exists because some clients don't expose resources/read. It lacks explicit when-not-to-use or alternative exclusions beyond the implicit contrast with search (which produces, not reads), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_download_urlA
Read-onlyIdempotent
Inspect

Return a time-limited download URL for an existing object.

Args:
    bucket: bucket name. An unknown bucket fails with `bucket_not_found`.
    key: full object key (e.g. `out/result.mp4`).
    expires: presigned-URL lifetime in seconds, clamped to [300, 600].
        Values outside the range are silently clamped, not rejected.

Returns `{url, method: "GET", expires_at}`. The `url` is always a presigned
GET URL that stops working at `expires_at` (a timestamp within the clamped
[300, 600] s window) — this holds for every bucket, regardless of its
`public` flag. It is not a permanent link; if the user needs a lasting URL,
re-issue this call when it expires. Hand `url` to the user verbatim — it
carries the signature; do not edit it.
ParametersJSON Schema
NameRequiredDescriptionDefault
keyYes
bucketYes
expiresNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
methodYes
expires_atNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly discloses behavior: time-limited URL, clamping of expires, behavior regardless of bucket public flag, non-permanence, and the need to pass the signed URL unchanged. This goes beyond the readOnly/idempotent annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than strictly necessary but every sentence adds relevant context, such as clamping, public-flag independence, and signature handling. It is well-structured and not redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the return shape, failure mode for unknown buckets, expiration semantics, clamping, and user-handling instructions. It is fully sufficient for an agent to invoke the tool correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema lacks descriptions, the tool description fully explains bucket, key, and expires, including the default and clamping behavior. All three parameters are meaningfully covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a time-limited download URL for an existing object, using a specific verb and resource. It is easily distinguished from sibling tools like download_url_to_bucket and list_objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives useful usage guidance, such as re-issuing the call for a lasting URL and handing the URL verbatim, but it does not explicitly contrast this tool with sibling alternatives like download_url_to_bucket. The when-to-use context is partially implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_statusB
Read-onlyIdempotent
Inspect

Fetch the current status of a transcoding job.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
textsNo
audiosNo
imagesNo
statusNo
videosNo
percentNo
durationNo
warningsNo
status_urlNo
api_versionNo
source_sizeNo
error_descriptionNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description matches the readOnly and idempotent annotations and does not claim side effects. It adds no extra behavioral detail beyond what the annotations already convey, so a mid-level score is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no unnecessary words or redundant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The basic operation is understandable and an output schema exists, so return values need not be described. However, the description omits guidance on choosing among related status/wait tools and leaves the token parameter unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single required parameter task_token is only named in the schema with no description. The description does not explain where the token comes from or how to format it, leaving low parameter coverage uncompensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific operation: fetching current status of a transcoding job. It does not explicitly differentiate from the sibling get_job_status_detailed tool, so it loses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'current status' implies an immediate non-waiting fetch, but there is no explicit guidance about when to prefer this over get_job_status_detailed or wait_for_job, nor any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_status_detailedA
Read-onlyIdempotent
Inspect

Fetch the full, authoritative status of a transcoding job.

Like `get_job_status`, but follows the job's per-job master
`status_url` for the complete detail set: per-rendition output URLs,
sizes, bitrates, durations, and any `warnings`. Use this once a job is
finishing/finished (e.g. after `wait_for_job` returns `completed`) when
you need the concrete output artefacts rather than just the overall
`status`/`percent`.

Flow: the compact `/v1/status` is queried first to learn the
`status_url`; if present and safe, the master endpoint is queried for
the detailed view. If a job has no `status_url` yet (e.g. still
queued) or the URL fails the SSRF host check, the compact status is
returned unchanged — this tool never errors where `get_job_status`
would have succeeded.
ParametersJSON Schema
NameRequiredDescriptionDefault
task_tokenYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
textsNo
audiosNo
imagesNo
statusNo
videosNo
percentNo
durationNo
warningsNo
status_urlNo
api_versionNo
source_sizeNo
error_descriptionNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent, but the description adds meaningful behavior: it explains the flow of querying the compact /v1/status first, following status_url if safe, and falling back to compact status when unavailable or unsafe. It also guarantees it never errors where get_job_status would succeed, which is valuable operational context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured into three short paragraphs: purpose, usage timing, and flow. Each sentence adds distinct value, and there is no fluff or redundancy. It is detailed yet concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what the tool does, when to use it, how it operates internally, and its failure-safe behavior. It gives enough context for an agent to decide and invoke it correctly without needing to see the output schema, which is reported to exist.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter, task_token, is not explicitly described in the text and schema coverage is 0%. However, the token's purpose is self-evident from the tool name and the description's mention of a 'job.' The description indirectly implies it identifies the job to fetch status for, so it compensates adequately for the simple parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'Fetch the full, authoritative status of a transcoding job.' It also explicitly distinguishes from the sibling get_job_status by noting it follows the status_url for complete detail, making it unique among the provided tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage direction: 'Use this once a job is finishing/finished (e.g. after wait_for_job returns completed) when you need the concrete output artefacts rather than just the overall status/percent.' This tells when to choose it over alternative status tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_bucketsA
Read-onlyIdempotent
Inspect

List the Qencode Media Storage buckets available to the account.

Returns a `buckets` array; each entry has `name`, `region`
(us-west / eu-central), `created_at`, and `public`: true when the bucket is
served over an unauthenticated CDN endpoint (readable without a signed URL).
`public` is read-only here — bucket visibility is managed in the Qencode
portal, not via these tools.

Caveat: for a *just-created* bucket the `public` flag is not yet stable — it
starts `false` and flips to `true` within a few seconds up to ~a minute as
the CDN endpoint provisions. Don't cache a `public` value read right after
`create_bucket`; poll until it settles (see qencode://docs/storage).

Buckets are account-level (shared across the account's projects), not
per-project.
ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
bucketsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint and idempotentHint, and the description adds valuable detail about the returned fields and the transient nature of the 'public' flag. No contradictions or hidden side effects are present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core purpose. Each paragraph adds relevant information—return format, field semantics, and an important caveat—without unnecessary repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no parameters, the description fully covers the tool's behavior, output fields, and important operational caveats. It even points to additional documentation for polling guidance, making it self-sufficient for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema coverage is 100%, so parameter semantics are trivially satisfied. The baseline score of 4 applies because no parameters exist to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: listing Qencode Media Storage buckets available to the account. It also distinguishes this from per-project operations and explicitly notes the account-level scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides practical usage guidance, including the caveat about eventual consistency of the 'public' flag after bucket creation. It does not explicitly compare to sibling tools like list_objects, but the purpose and scope are clear enough for appropriate selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_objectsA
Read-onlyIdempotent
Inspect

Browse the contents of a Qencode Media Storage bucket.

Args:
    bucket: bucket name (see `list_buckets`). An unknown bucket fails with
        `bucket_not_found`.
    prefix: optional key prefix to filter by (e.g. `raw/`).
    continuation_token: pass the `next_token` from a previous truncated
        response to fetch the next page.

Returns `{objects: [{key, size, last_modified}], is_truncated}` plus
`next_token` when `is_truncated` is true. One call returns up to ~1000
objects; if the bucket (or prefix) holds more, `is_truncated` is true and
you page by re-calling with `continuation_token=next_token`.
ParametersJSON Schema
NameRequiredDescriptionDefault
bucketYes
prefixNo
continuation_tokenNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
objectsYes
next_tokenNo
is_truncatedYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true. The description adds meaningful behavioral details: return structure ({objects, is_truncated}), pagination behavior (~1000 objects per call), and the bucket_not_found error. This goes beyond the annotations and helps an agent predict outcomes, though it could mention eventual consistency or ordering, but that's minor. Score 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a one-line purpose, parameter explanations, and return/pagination details. Every sentence adds value, and the pagination logic is explained clearly. It's appropriately sized for the tool's complexity. Score 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a listing tool with an output schema and clear annotations, the description covers everything an agent needs: purpose, parameters, error handling, return format, and pagination. It even mentions the ~1000 object limit and how to page. There are no obvious missing details that would prevent correct invocation. Score 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries full responsibility for parameter meaning. It thoroughly explains all three parameters: bucket (with reference to list_buckets and error behavior), prefix (with example 'raw/'), and continuation_token (tied to pagination). This far exceeds the bare schema and fully compensates for the coverage gap. Score 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb ('Browse') and resource ('contents of a Qencode Media Storage bucket'), making the tool's purpose unambiguous. It doesn't explicitly name a sibling to differentiate, but the distinct resource (objects vs buckets) is obvious from the name and context. Slightly below 5 because it doesn't explicitly contrast with list_buckets or other alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides strong usage context: references list_buckets for bucket names, explains the prefix filtering, and details pagination with continuation_token and next_token. It also notes the error case for unknown buckets. It doesn't explicitly state when to avoid this tool, but the guidance is sufficient for correct invocation. A bit short of 5 because exclusions or alternative conditions aren't spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_qencode_docsA
Read-onlyIdempotent
Inspect

Search the Qencode knowledge base (recipes + reference docs).

Returns a ranked list of MCP resource URIs that match the query, each with
a short summary. Call this first whenever you're unsure which recipe
applies.

To read the full content of any URI returned here, call
`fetch_qencode_doc(uri)` next. (Some MCP clients also expose these URIs
via `resources/read`, but `fetch_qencode_doc` works in every client.)

Args:
    query: free-text search — output type, codec, DRM provider, feature name,
        etc. (e.g. "hls widevine ezdrm", "thumbnail sprite", "stitching",
        "speech to text translation")
    limit: max number of hits to return. Default 8.

Returns:
    A dict with `hits`, each containing `uri`, `title`, `summary`, `score`.
    Pass `uri` to `fetch_qencode_doc` to read the full markdown.
ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
hitsYes
queryYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnly/idempotent/destructive annotations already cover safety expectations. The description adds useful behavioral detail by explaining that results are ranked and include URI, title, summary, and score.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with purpose, usage, args, and return sections. It is slightly repetitive about calling fetch_qencode_doc in both the opening guidance and the returns section.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives enough context for an agent to decide when to search, what parameters to pass, and how to consume the returned URIs. It also names the exact next tool for reading full content.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the JSON schema has no property descriptions, the description fully explains both parameters. It clarifies query as free-text with concrete examples and defines limit as max hits with a default.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches the Qencode knowledge base, combining recipes and reference docs. It also distinguishes itself from the sibling fetch_qencode_doc by framing this as the search entry point.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger: call this first whenever unsure which recipe applies. It also provides the follow-up action, directing the agent to fetch_qencode_doc for full content.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_encode2_rawAInspect

Submit a job with the raw query JSON.

The `query` dict can be either the wrapped form `{"query": {...inner...}}`
or the inner object directly — the underlying client auto-wraps if needed.

The inner query MUST have shape:
    {
        "source": "<url>",
        "encoder_version": 2,
        "format": [                 # ARRAY of output specs
            {
                "output": "mp4",    # STRING type field. NOT "format".
                ...                 # encoding params per the recipe
            }
        ]
    }

Common composition mistakes this tool catches up front:
- `"format": "mp4"` inside an entry instead of `"output": "mp4"`.
- Missing `output` field.
- Unknown `output` value.
- `format` as a string at the top level (must be an array).
- `vmaf` without `distorted` (`source` = reference, `distorted` = encoded).
- `video_intelligence` without `mode` (use `mode: "description"`, not
  `features`). Source must be https://; `description` modes need ≥10s
  clip, `search` ≥4s — check duration before submit (metadata job).

Example vmaf query (encoder v1 — set explicitly here):
    {
        "source": "https://example.com/original.mp4",
        "encoder_version": 1,
        "format": [{
            "output": "vmaf",
            "distorted": "https://example.com/encoded.mp4",
            "destination": {"url": "s3://.../vmaf.json"}
        }]
    }

Example video_intelligence query (encoder v2):
    {
        "source": "https://example.com/input.mp4",
        "encoder_version": 2,
        "format": [{
            "output": "video_intelligence",
            "mode": "description",
            "destination": {"url": "s3://.../vi/"}
        }]
    }

Unlike `transcode_video`, this tool does **not** auto-inject
`encoder_version`. Set `"encoder_version": 2` at the top of the inner
query for all v2 outputs (`smart_thumbnail`, `ai_detection`,
`video_intelligence`, `m4a`, …). Use `1` for VMAF and stitching per
their recipes.

For complex queries — ABR ladders, DRM, stitching, callbacks — call
`search_qencode_docs(...)` then `fetch_qencode_doc(...)` to read the
matching recipe before composing.
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
payloadNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
status_urlNo
task_tokenYes
upload_urlNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral details that go beyond annotations: it does not auto-inject encoder_version, v2 outputs require explicit setting, supported output formats and modes have constraints, and certain composition mistakes are validated up front. It also provides concrete examples showing expected query structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured: it starts with a one-sentence summary, then explains query shapes, lists common mistakes, and gives two clear examples. Every section serves a concrete purpose, and the examples are directly actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of raw transcoding queries, the description provides enough context to compose valid jobs, including version selection, format recipes, destination requirements, and links to documentation for more advanced cases. The output schema is present, so omitting return-value details is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The query parameter is documented extensively with shape, examples, required fields, and common pitfalls. The optional payload parameter is not explained at all, but it is optional and appears secondary to the core query workflow. Overall, the description compensates well for the absence of schema-level descriptions for the primary parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this tool submits a raw transcoding job with a raw query JSON, and explicitly contrasts it with transcode_video's auto-injection behavior. It also references relevant sibling tools for complex queries, making the tool's specific role unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: use this tool for raw queries, set encoder_version manually, prefer transcode_video when auto-injection is desired, and consult docs via search_qencode_docs/fetch_qencode_doc for complex cases. It also notes duration checks and source URL requirements before submission.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transcode_videoAInspect

Submit a transcoding job.

Args:
    source: URL of the input video (https://, s3://, or `tus:<uuid>`).
    outputs: list of format-spec dicts. Each MUST have an `output` field
        whose value is one of: mp4, webm, advanced_hls, advanced_dash,
        webm_dash, repack, mp3, m4a, hls_audio, flac, gif, thumbnail,
        thumbnails, smart_thumbnail, metadata, speech_to_text, vmaf,
        video_intelligence, ai_detection.
        The OUTER array is named `format` in the Qencode schema (this
        tool wraps it for you). The INNER STRING field naming the type
        is `output` — NOT `format`. This is the most common composition
        mistake. Example of a valid entry:
            {
                "output": "mp4",
                "video_codec": "libx264",
                "audio_codec": "libfdk_aac",
                "resolution": 720,
                "optimize_bitrate": 1,
                "audio_bitrate": 128,
                "destination": {"url": "s3://..."}
            }
        For HLS/DASH ABR, put per-rendition params on each entry of an
        inner `stream[]` array (not on the format object directly).
        Output-specific required fields (see matching recipe):
            vmaf — `distorted` URL of the encoded video; `source` is the
                reference original (encoder v1 is auto-selected).
            video_intelligence — `mode` one of description, categorization,
                moderation, search, custom (NOT `features`). Source must be
                https:// and meet duration minimums (description etc. ≥10s,
                search ≥4s) — check via metadata or tell user if too short.
        Example vmaf entry:
            {
                "output": "vmaf",
                "distorted": "https://example.com/encoded.mp4",
                "destination": {"url": "s3://.../vmaf.json"}
            }
        Example video_intelligence entry:
            {
                "output": "video_intelligence",
                "mode": "description",
                "destination": {"url": "s3://.../vi/"}
            }
    payload: optional opaque string echoed back in callbacks.

`encoder_version` is injected automatically when omitted: `2` by default,
`1` when any output is `vmaf`. Stitch jobs (multi-source `stitch` array)
are not supported here — use `start_encode2_raw` with `encoder_version: 1`
per `qencode://recipe/stitching`.

Other composition defaults in this server's instructions (libfdk_aac,
optimize_bitrate, per-stream ABR params, etc.) still belong in each
`outputs[]` entry — consult the matching recipe via
`search_qencode_docs` + `fetch_qencode_doc` before submitting.
ParametersJSON Schema
NameRequiredDescriptionDefault
sourceYes
outputsYes
payloadNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
status_urlNo
task_tokenYes
upload_urlNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses automatic encoder_version injection, vmaf auto-selection, and payload echo in callbacks. It also states unsupported stitch jobs. This adds meaningful behavioral context, though it doesn't discuss error handling or async behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely packed with essential information: examples, pitfalls, and special cases. Each line serves a purpose, and the structured layout with bullets and code blocks aids readability. Slightly verbose but justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and open-world schema, the description covers required fields, provides examples, points to external docs, and explains edge cases like vmaf and video_intelligence. It supplies sufficient context for an agent to use the tool correctly without missing critical details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Since the schema has no descriptions, the tool description fully compensates: explains source URL formats, outputs structure with detailed examples and required fields for vmaf and video_intelligence, the common output/format mistake, and payload semantics. This is comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Submit a transcoding job' with a specific verb and resource. Differentiates from sibling by explicitly noting stitch jobs are not supported and pointing to start_encode2_raw.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool vs alternatives: states stitch jobs are not supported here and directs to start_encode2_raw with a recipe, and instructs to consult search_qencode_docs/fetch_qencode_doc before submitting. Also gives examples of valid outputs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

wait_for_jobA
Read-onlyIdempotent
Inspect

Poll a transcoding job until it reaches a terminal state or times out.

Three independent exit conditions, in priority order:

1. The upstream reports a terminal status (``completed`` / ``error``
   / ``failed``) or an explicit ``error`` field.
2. The wall-clock deadline derived from ``timeout_seconds`` is
   reached.
3. **MCP10 cap** — iterations exceed ``dos.MAX_POLLS``. This guards
   against a malicious or buggy caller passing
   ``timeout_seconds=1e9`` (or a poll_interval clamped down by
   another bug) and pinning an event-loop slot indefinitely. The
   cap returns the last observed status so the caller still gets
   structured data, just earlier than they asked for.
ParametersJSON Schema
NameRequiredDescriptionDefault
task_tokenYes
poll_intervalNo
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
textsNo
audiosNo
imagesNo
statusNo
videosNo
percentNo
durationNo
warningsNo
status_urlNo
api_versionNo
source_sizeNo
error_descriptionNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly, idempotent, and non-destructive behavior. The description adds meaningful details about blocking, timeout, poll interval, and the MCP10 cap, including the fallback of returning the last observed status. It does not overstate side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with numbered exit conditions and is appropriately detailed. It front-loads the main purpose and provides necessary edge-case behavior without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the main behavior, exit conditions, and timeout/cap semantics. It does not detail the output schema, but it does mention returning the last observed status, which is sufficient given the input schema is fully specified and output schema may be standard for polling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has no descriptions (0% coverage), so the description must compensate. It explicitly defines timeout_seconds as a wall-clock deadline and mentions poll_interval being clamped. task_token is not described but is inferable from the tool's purpose as the job identifier.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool polls a transcoding job until terminal state or timeout, which is a specific verb-resource pair. It implicitly distinguishes from sibling tools like get_job_status by focusing on blocking/waiting behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the polling behavior and exit conditions but does not explicitly mention when to prefer this over get_job_status or get_job_status_detailed. It gives implied usage (after starting a job) but lacks explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv1.1.0
    • First observedcreate_bucket
    • First observeddownload_url_to_bucket
    • First observedfetch_qencode_doc
    • First observedget_download_url
    • First observedget_job_status
    • First observedget_job_status_detailed
    • First observedlist_buckets
    • First observedlist_objects
    • First observedsearch_qencode_docs
    • First observedstart_encode2_raw
    • First observedtranscode_video
    • First observedwait_for_job

TDQS

A3.9/5.0

Scored across 12 tools

Disambiguation3/5

Several tools overlap in purpose: transcode_video and start_encode2_raw both submit transcoding jobs, and get_job_status, get_job_status_detailed, and wait_for_job all serve job monitoring. The long descriptions help, but the functional boundaries are not immediately obvious.

Naming Consistency5/5

All tools follow a consistent snake_case verb-first pattern (e.g., transcode_video, list_buckets, create_bucket, get_download_url). Even start_encode2_raw fits the pattern well enough, with no mixed casing or stylistic drift.

Tool Count5/5

Twelve tools is well within the ideal 3-15 range and appropriately scoped for the Qencode domain, covering transcoding, job status, knowledge-base lookup, and storage operations without feeling bloated.

Completeness3/5

The core job submission/status flow and storage operations are covered, but notable lifecycle gaps exist: there is no cancel or list jobs tool, and no delete object operation. The storage side is also limited to browsing and presigned URLs rather than full object management.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers