The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Transcodely listing page.
A video pipeline for AI agents, over the Model Context Protocol — with nothing on it that can delete your work.
Hand your agent a video URL and it comes back a playable link: transcoded into an ABR ladder, hosted, captioned if you ask. Then let it read back what it actually produced, what it cost, and why an upload did not become a job. No delete, no cancel, no key material. Connect with one OAuth click — no API key to create or paste.
https://mcp.transcodely.com/mcpcom.transcodely/mcpThis is the public home of the hosted server: connect instructions, the tool surface, and the registry manifest. The server itself is a hosted service — there is nothing to install or run.
Claude Code
Then run /mcp inside Claude Code and pick Authenticate — your browser opens, you approve, and the tools are live. No Transcodely account yet? One is created for you during authorization.
claude.ai / Claude desktop — Settings → Connectors → Add custom connector → https://mcp.transcodely.com/mcp.
Cursor — add to ~/.cursor/mcp.json:
Any other client that supports remote MCP servers over streamable HTTP works the same way. For headless use (CI, server-side agents), attach a Transcodely API key as a bearer token instead — see the connect guide.
Fifteen tools: nine only read, four create something — three of those start work you are billed for, and saving a preset is free — and two overwrite a setting that only affects work created after it. No tool on this surface deletes, cancels, removes or rotates anything.
| Tool | Effect | What it does |
|---|---|---|
create_job | creates work · billable | Create a transcoding job. |
create_preset | creates · free | Create a custom encoding preset for this app: a named, reusable bundle of encoding settings that create_job can reference by slug. |
create_video_from_url | creates work · billable | Ingest a remote https:// video and host it in one call — this is the tool for "transcode and host this, give me a link". |
generate_captions | creates work · billable | Generate AI captions (subtitles) for a hosted video by id (vid_...). |
get_ingest_rule | read | Fetch one ingest rule by id (ing_...): its origin, enabled state, filters, the job it submits, and its event/job counts. |
get_job_status | read | Get a concise status snapshot for a transcoding job by id (job_...): overall status and progress, any error code/message, and per-output status/progress with errors. |
get_output_report | read | Get the full measurement report for one job output (job_... plus out_...): what the produced file turned out to BE, measured from the written file, and the verdict of comparing that against what the job asked for. |
get_usage | read | Return hosting usage and cost for a billing month: videos encoded, encoding minutes, average storage, egress, request counts, and per-line and total cost in EUR. |
get_video | read | Fetch a hosted video by id (vid_...): status, visibility, title, duration, poster image, encoded renditions (resolution, codec, bitrate, dimensions), and — once status is "ready" — a playback block. |
list_ingest_events | read | List the storage deliveries this app's ingest rules received, newest first, with what became of each: the bucket and object key, the outcome (received, matched, created, skipped or failed), the REASON for a skip or failure, and the job id when one was created. |
list_ingest_rules | read | List this app's ingest rules: the standing instructions that turn an object landing in a storage origin into a transcoding job. |
list_jobs | read | List transcoding jobs for the authenticated app, newest first. |
list_presets | read | List the encoding presets available to this app: the read-only ones the platform ships and the app's own custom ones. |
set_spend_limit | overwrites a setting | Set or clear this app's monthly transcoding spend limit, in EUR. |
update_preset | overwrites a setting | Update a custom preset's settings by id (pst_...). |
Generated from tools.json by npm run readme:gen — do not edit by hand. Read-only: 9. Writing: 6. Billable: 3.
The promise is narrow and literal, and it is checked rather than asserted: test/vendored.mjs re-derives it from tools.json on every CI run and fails if a future release adds a tool whose name begins with delete, cancel, remove, purge, rotate or destroy.
update_preset and set_spend_limit carry destructiveHint: true, which in the protocol means "replaces a value" rather than "additive" — not that anything is removed. A preset is read and expanded when a job is created, so editing one never reaches a job that already exists; lowering a spend limit blocks the next job and never stops one in flight.set_spend_limit is the only tool with an authorization rule of its own, because it is the only one that moves money policy.
ak_…. The refusal says so in words rather than failing as a generic permission error. This surface is deliberately stricter than REST here: over REST, a key can manage its own app's limit.https://mcp.transcodely.com/mcp/app_… to pin a specific app; the bare URL resolves to your organization's oldest active app.ak_… key presented at a different app's URL is rejected outright.create_job, create_video_from_url and generate_captions — charged at the ordinary Transcodely rates. Every other tool is free to call, including the ones that write: saving a preset or setting a spend limit costs nothing.Remote-capable clients should connect straight to the hosted endpoint above — that's the one-click OAuth path. For stdio-only clients, sandboxes, and headless use, this repo is also a runnable bridge that serves the same tools over stdio and forwards calls to the hosted server:
Without TRANSCODELY_API_KEY the bridge still starts and answers introspection
(initialize, tools/list); tool calls return an error pointing at the two auth paths.
set_spend_limit is listed but always refused over this path — see the rule above.
tools.json is kept honesttools.json is generated, not written: it is the byte-exact stdout of
the Transcodely API's own export, go run ./cmd/mcp --dump-tools, run in a checkout of the
release pinned in api-pin.json. The README table above is generated from
it in turn. Two checks hold that chain:
| Check | Command | Runs |
|---|---|---|
| Vendored consistency — counts, annotations, the "nothing deletes" promise, manifest versions, the README naming every tool | node test/vendored.mjs | every push and PR |
| The bridge serves exactly the vendored surface, keyless calls guide | node test/introspect.mjs | every push and PR |
The README table is regenerated from tools.json | node scripts/gen-readme.mjs --check | every push and PR |
tools.json is byte-exact with the pinned api release | npm run tools:check | when a token is available — see below |
To land a tool-surface change:
Or skip step 2 entirely: with API_REPO_TOKEN set and no TRANSCODELY_API_PATH, the script
clones the pinned tag itself. That is the only mode that verifies the pin, so prefer it.
The honest limitation: transcodely/api is a private repository, so the parity job needs
a read token in API_REPO_TOKEN and cannot run on a pull request from a fork. When the token
is absent the script exits 78 and the job reports not armed rather than passing — it never
claims a parity it did not check. The always-on checks above still catch the drift that has
actually bitten here: an export that moved while the README, the manifest and the bridge kept
the old numbers.
server.json is the manifest published to the official MCP registry. Its
version must be bumped for a republish to take effect — the registry serves the last
published version's description, so a description edit with an unchanged version is invisible.