Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

AI Media Router

OCI · GHCR.IO/JUTSUHQ/AI-MEDIA-ROUTER

Image and video generation across 40+ providers with your own keys, plus a local asset library.

31 Trust /100

Last scanned (5 hours ago)

Scores higher than 36% of OCI servers

Category Design and Media

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: we could not reach the registry to check. This is a gap on our side.Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: we could not reach the registry to check. This is a gap on our side.Unverified
Provenance & Transparency0
  • Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
  • Build provenance not yet verified. View diagnostics → Unverified
  • License not yet determined.Unverified
  • Maintenance history not yet determined.Unverified
  • Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability80
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Tool/resource definitions use about 8591 tokens (~86/item across 99 items; 55 tools + 44 resources), lean.Pass
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage95
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 81% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_asset" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 57 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 2 categories

Categories scored 0 because we could not verify them: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

What we tested

Checks we ran (7)

  • Source repository
  • Schema quality
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Checks we could not complete (9)

These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.

  • Malware scan in Supply Chain Security (scores 0 for this)No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  • Known CVEs in Supply Chain Security (scores 0 for this)Known CVEs could not be checked: we could not reach the registry to check. This is a gap on our side.
  • Install scripts in Supply Chain Security (scores 0 for this)Install-script risk not yet assessed.
  • Dependency health in Supply Chain Security (scores 0 for this)Dependency health could not be checked: we could not reach the registry to check. This is a gap on our side.
  • Provenance in Provenance & TransparencyBuild provenance not yet verified.
  • License in Provenance & TransparencyLicense not yet determined.
  • Maintenance in Provenance & TransparencyMaintenance history not yet determined.
  • Security disclosure in Provenance & TransparencySecurity-disclosure policy not yet verified: we couldn't inspect the source repository.
  • Stability in Stability & Change Management (scores 0 for this)Stability not yet verified: not enough scan history yet (needs a 30-day window).

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Nov 26 −10
    • Provenance: fail → unverified ▼ security
    • Stability: 0.03 → unverified ▼ security
    • Source repository: pass → fail ▼ security
    • License: pass → unverified ▼ functional
    • Security disclosure: pass → unverified ▼ functional
    • Maintenance: pass → unverified ▼ functional
    • Licence: MIT functional
  • 2 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 40

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 5 Nov 2026 · Analysed oci/ghcr.io/jutsuhq/ai-media-router@v0.1.0

Provenance Inconclusive

We could not complete the check, so nothing is claimed either way. This is a gap on our side, not a finding about the package.

Result Inconclusive
Ecosystem oci
Reason No trust root

Background: How many MCP packages publish verified provenance →

MCP tools · 55 exposed · ~6,259 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add_to_collection ~63

Add assets to a collection, creating it when missing.

NameTypeReqDescription
asset_idsarrayyes–
collectionstringyesCollection name; add_to_collection creates it when missing.
descriptionstring|null–add_to_collection only: replaces the collection's description.
NameTypeReqDescription
assetsintegeryes–
created_atintegeryes–
descriptionstringyes–
namestringyes–

No examples provided.

add_to_reference ~74

Append assets to a reference, optionally with a role (e.g. "side").

NameTypeReqDescription
asset_idsarrayyes–
referencestringyesReference name or id.
rolestring|null–add_to_reference only: role of these assets, e.g. "front", "side", "palette".
NameTypeReqDescription
assetsarrayyesIn order; `{{ref:<name>}}` in a string field uses the first one.
created_atintegeryes–
descriptionstringyes–
idstringyes–
kind–yes–
namestringyes–
tagsstringyes–
updated_atintegeryes–

No examples provided.

cancel_job ~56

Cancel a waiting or running job: it becomes failed with `cancelled`, and jobs waiting on it fail too. The provider is not asked to stop, so a running generation may still bill there.

NameTypeReqDescription
job_idstringyes–

Structured output declared, but exposes no named fields.

No examples provided.

check_spec ~161

Check a spec without saving or calling the provider: validates it (pointers, template variables), replays recorded fixtures, and with model/input renders the exact HTTP requests it would send.

NameTypeReqDescription
inputobject|null–Generation input for the rendered requests.
modelstring|null–With `model`, also render the exact HTTP requests a generation would send (nothing is sent).
providerstring|null–Check the loaded spec of this provider. Omit when passing `spec`.
specstring|null–TOML text of a candidate spec (not saved). Format: docs/provider-spec.md.
varsobject|null–Values for variables later steps capture from earlier responses (e.g. {"id": "task-123"}).
NameTypeReqDescription
errorstring|null–Parse or validation error (TOML line/column, field, pointer or template variable).
fixturesarrayyes–
hintstringyes–
keystring|null––
requestsarrayyesRendered requests, credentials shown as `<ENV_NAME>`; only when `model` is given.
validbooleanyes–

No examples provided.

concat ~86

Join two or more video assets in order into one MP4 (first clip's size, 30 fps); returns the new asset.

NameTypeReqDescription
asset_idsarrayyesTwo or more video assets in playback order. Output takes the first clip's size (others are letterboxed) at 30 fps; clips without sound get silence when any clip has sound.
save_to–––
NameTypeReqDescription
asset–yes–
hintstringyes–
job_idstringyesThe local job that recorded this operation (provider `local`, model = operation, cost 0).

No examples provided.

delete_asset ~39

Delete an asset's file and library entry; it leaves every reference and collection. Jobs keep their record of it.

NameTypeReqDescription
asset_idstringyes–
NameTypeReqDescription
bytesintegeryes–
created_atintegeryes–
descriptionstringyesFree text set with update_asset; searched together with prompt and tags.
duration_secsnumber|null–Length of a video or audio file.
has_audioboolean|null–Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed).
heightinteger|null––
idstringyesContent hash prefix; identical files share one id.
job_idstring|null–First job that produced this file; get_lineage shows every job around it.
mimestring|null––
pathstringyesAbsolute path of the stored file.
previewstring|null–JPEG preview (scaled image or first video frame); null without ffmpeg or for audio.
promptstring|null––
ratinginteger|null–1-5, set with review_asset.
review_notesstringyesReviewer's notes (what is wrong or right); searched like prompt, tags and description.
statusstringyesReview gate: `draft` (default), `approved` or `rejected`; set with review_asset.
tagsstringyes–
widthinteger|null–Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

No examples provided.

delete_budget ~26

Delete a budget; its jobs stay in the history.

NameTypeReqDescription
namestringyes–
NameTypeReqDescription
created_atintegeryes–
jobsintegeryes–
limit_usdnumberyes–
namestringyes–
remaining_usdnumberyes–
spent_usdnumberyesReported USD cost of finished jobs, plus the estimate of running jobs and of jobs whose provider reports no USD cost.

No examples provided.

delete_recipe ~28

Delete a recipe; jobs made from it stay in the history.

NameTypeReqDescription
namestringyes–
NameTypeReqDescription
budgetstring|null–Budget every run counts against unless the call names another.
created_atintegeryes–
descriptionstringyes–
input––Generation input with `{{var:<name>}}` (and any other placeholders) left in place.
modelstring|null––
namestringyes–
offer_idstring|null–Offer from search_prices that prices every run; single-generation recipes only.
providerstring|null–Single-generation recipe: provider, model and input. Absent when the recipe has `steps`.
save_to––Where the outputs are filed; with steps, the outputs of the final steps (those no later step uses).
stepsarrayyesA chain started by one run_recipe, in order; run_recipe returns the last step's job.
updated_atintegeryes–
variablesobjectyes–

No examples provided.

delete_reference ~30

Delete a reference; its assets stay in the library.

NameTypeReqDescription
referencestringyesReference name or id.
NameTypeReqDescription
assetsarrayyesIn order; `{{ref:<name>}}` in a string field uses the first one.
created_atintegeryes–
descriptionstringyes–
idstringyes–
kind–yes–
namestringyes–
tagsstringyes–
updated_atintegeryes–

No examples provided.

delete_snippet ~33

Delete a snippet; inputs that still use it fail with the list of known snippets.

NameTypeReqDescription
namestringyes–
NameTypeReqDescription
descriptionstringyes–
namestringyes–
textstringyes–
updated_atintegeryes–

No examples provided.

doctor ~94

Check the installation: data directory, database, ffmpeg/ffprobe, which providers have keys, spec override errors, recorded fixtures of configured providers, jobs no worker is polling, and the last day's failure kinds. online=true also pings every configured provider. Run it first when something does not work.

NameTypeReqDescription
onlineboolean|null–Also send one GET to every configured provider's base URL (any HTTP answer counts as reachable).
NameTypeReqDescription
checksarrayyes–
okbooleanyesNo check failed.
providersarrayyesConfigured providers and local overrides.

No examples provided.

estimate_cost ~298

Estimate a generation's USD cost: an offer's price (offer_id from search_prices) times the duration or image count read from input, plus the median of past jobs on this provider and model. Says which formula and input fields it used. With recipe (and vars) instead: every step of that recipe and the sum.

NameTypeReqDescription
inputobject–Generation input. Seconds are read from duration, duration_seconds, duration_secs, seconds, video_length or length; the output count from num_images, n, num_outputs, image_count, number_of_images, sa…
modelstring|null–The provider's model id, as passed to generate. Required unless `recipe` is given.
offer_idstring|null–Offer from search_prices to price; without it only the history median is used.
providerstring|null–Provider key, e.g. "kie". Required unless `recipe` is given.
recipestring|null–Price a run_recipe instead: each step from its own estimated_cost_usd or offer_id (edits cost 0), and the sum.
reuseboolean|null–As in generate: report (with cost 0) when the run would return an identical job's outputs.
varsobject|null–The recipe's variables, as in run_recipe.
NameTypeReqDescription
estimate_usdnumber|null–Expected cost in USD; null when none could be computed (`note` says why).
formulastring|null–How `estimate_usd` was computed.
history––Median USD cost of finished jobs on this provider and model that reported USD.
notestring|null––
offer––The offer priced, when `offer_id` was given.
readobjectyesInput fields the formula read, by path, with the values found.
reuse––The job whose outputs generate would return instead of submitting (`reuse`); the estimate is then 0.
stepsarrayyesFor a recipe with steps: each step's share of `estimate_usd`, in order.

No examples provided.

export_collection ~95

Export a collection as a ZIP in <home>/exports/: the files, their previews, and collection.json with each asset's metadata (review status, rating, notes), the job that made it (provider, model, input, cost) and its references. only_approved=true ships only assets approved with review_asset.

NameTypeReqDescription
collectionstringyes–
only_approvedboolean|null–Only assets approved with review_asset.
NameTypeReqDescription
assetsintegeryes–
bytesintegeryes–
pathstringyesThe ZIP file: `files/` (assets), `previews/`, and `collection.json` with metadata (review status, rating, notes), the job behind each asset (provider, model, input, cost) and its references.

No examples provided.

extract_frame ~97

Save one frame of a video as a PNG asset: at "first", "last" or seconds. Use the last frame as the start image of the next clip.

NameTypeReqDescription
asset_idstringyesA video asset.
at––"first", "last", or seconds from the start (e.g. 1.5). Default "first".
save_to––File the new asset into a collection and/or reference.
NameTypeReqDescription
asset–yes–
hintstringyes–
job_idstringyesThe local job that recorded this operation (provider `local`, model = operation, cost 0).

No examples provided.

generate ~702

Start a generation. Returns the job immediately (status running); poll it with get_job. Results are downloaded into the library. Library files go into input as "{{asset:<id>}}" / "{{ref:<name>}}"; save_to files the outputs into a collection and/or reference. `recipe` names a saved single-generation preset (list_recipes shows the user's presets), so provider and model can be omitted.

NameTypeReqDescription
budgetstring|null–Count this job against a budget (set_budget); the job is refused if it would exceed it.
estimated_cost_usdnumber|null–Expected cost in USD. With `budget` and no value, it is computed like estimate_cost.
inputobjectyesModel input passed to the provider unchanged (prompt, image_urls, duration, ...). Library files go in as placeholders, uploaded through the provider before submit: "{{asset:<id>}}" or "{{ref:<name>}}…
modelstring–The provider's own model id or endpoint, e.g. "kling-2.6/image-to-video" on kie. Required unless `recipe` is given.
offer_idstring|null–Offer from search_prices this job buys; its price × the duration or image count in `input` becomes the job's estimate when `estimated_cost_usd` is not given.
providerstring–Provider key, e.g. "kie". See get_provider for what `model` means there. Required unless `recipe` is given.
recipestring|null–A saved single-generation recipe used as a preset: its provider, model, input (variables filled, defaults applied), save_to, offer_id and budget are the defaults. Fields given here win; `input` merge…
retry––Resubmit after a retryable failure (rate_limit, provider_error, network, timeout): {attempts: 1-5, delay_secs}. Off by default, since a provider may bill a failed attempt.
reuseboolean|null–true: when a job with the same provider, model and input (library files compared by content) is done and its outputs are still in the library, or is still running, return those outputs as a new job a…
save_to––File the outputs into a collection and/or an existing reference when the job finishes.
varsobject|null–The recipe's variables, as in run_recipe.

Structured output declared, but exposes no named fields.

No examples provided.

generate_batch ~251

Start up to 100 jobs at once: items (e.g. one prompt on several provider/model pairs) x matrix (top-level input fields to vary). Item input merges over defaults.input. With defaults.budget the sum of estimates is admitted first. Returns the batch; follow it with get_batch.

NameTypeReqDescription
defaults––Shared by every job; items override provider, model, save_to and estimated_cost_usd, and merge their input over this input.
itemsarray|null–One entry per variant, e.g. the same prompt on several provider/model pairs (a bench).
labelstring|null–Free text to recognise the batch by.
matrixobject|null–Top-level input fields to vary: {"aspect_ratio": ["16:9", "9:16"], "seed": [1, 2]}. Every item runs with every combination. At most 100 jobs in total.
recipestring|null–Run a saved recipe: its provider, model, input and save_to are the defaults, and `matrix` keys, `defaults.vars` and item `vars` fill its "{{var:<name>}}" variables instead of input fields.
NameTypeReqDescription
countsobjectyesJobs per status (`waiting`, `running`, `done`, `failed`).
created_atintegeryes–
hintstringyes–
idstringyes–
jobsarrayyesIn submission order.
labelstring|null––
outputsarrayyesEvery output of the batch's finished jobs, in job order; for a recipe run only the final steps' outputs.
recipestring|null–The recipe this batch is one run of.
refusedarrayyesJobs that were never created (bad placeholder, unknown reference), by their position in the batch.

No examples provided.

get_asset ~24

Metadata and local path of one asset.

NameTypeReqDescription
asset_idstringyes–
NameTypeReqDescription
bytesintegeryes–
created_atintegeryes–
descriptionstringyesFree text set with update_asset; searched together with prompt and tags.
duration_secsnumber|null–Length of a video or audio file.
has_audioboolean|null–Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed).
heightinteger|null––
idstringyesContent hash prefix; identical files share one id.
job_idstring|null–First job that produced this file; get_lineage shows every job around it.
mimestring|null––
pathstringyesAbsolute path of the stored file.
previewstring|null–JPEG preview (scaled image or first video frame); null without ffmpeg or for audio.
promptstring|null––
ratinginteger|null–1-5, set with review_asset.
review_notesstringyesReviewer's notes (what is wrong or right); searched like prompt, tags and description.
statusstringyesReview gate: `draft` (default), `approved` or `rejected`; set with review_asset.
tagsstringyes–
widthinteger|null–Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

No examples provided.

get_batch ~73

A batch's jobs per status, each job's outputs, and every output file. wait_secs blocks until all finish (max 50).

NameTypeReqDescription
batch_idstringyes–
wait_secsinteger|null–Block up to this many seconds (max 50) for every job to finish. Default 0.
NameTypeReqDescription
countsobjectyesJobs per status (`waiting`, `running`, `done`, `failed`).
created_atintegeryes–
hintstringyes–
idstringyes–
jobsarrayyesIn submission order.
labelstring|null––
outputsarrayyesEvery output of the batch's finished jobs, in job order; for a recipe run only the final steps' outputs.
recipestring|null–The recipe this batch is one run of.
refusedarrayyesJobs that were never created (bad placeholder, unknown reference), by their position in the batch.

No examples provided.

get_job ~118

Job status, provider progress and stored result files. wait_secs blocks until done (max 50); debug=true adds the raw provider exchanges.

NameTypeReqDescription
debugboolean|null–Include `trace`: the exact request and raw provider response of each step. Use it when a job failed or stays running, to see which pointer or URL in the spec is wrong.
job_idstringyes–
wait_secsinteger|null–Block up to this many seconds (max 50) for the job to finish. Default 0.

Structured output declared, but exposes no named fields.

No examples provided.

get_lineage ~51

Generation graph of an asset: the assets and references it was made from (ancestors) and everything made from it (descendants), with the job of each step.

NameTypeReqDescription
asset_idstringyes–
NameTypeReqDescription
ancestorsarrayyesWhat the asset was made from, nearest first.
asset–yes–
collectionsarrayyes–
descendantsarrayyesWhat was made from it, nearest first.
hintstringyes–
referencesarrayyesReferences and collections that hold this asset.

No examples provided.

get_provider ~52

How to call one provider: model id format, an example generate call, docs link, upload support, known quirks.

NameTypeReqDescription
providerstringyesProvider key from list_providers, e.g. "fal".
NameTypeReqDescription
catalogarrayyesProvider names in the price catalog that this provider serves.
configuredbooleanyes–
cost_unitstring|null–Unit of job `cost` for this provider, if known.
docsstringyesWhere to look up model ids and input fields.
example––A complete generate call known to match this spec; adapt model and input.
keystringyes–
missing_envarrayyes–
model_hintstringyesWhat to pass as `model` and `input` for this provider.
namestringyes–
notesstring|null––
sourcestringyes`builtin` or `override`.
spec_pathstringyesSpec file: `providers/<key>.toml` in the repo, or the override path.
uploadstring|null–How references are uploaded: multipart, json, put, post_form, data_uri, or null if not supported.
upload_usagestring|null–How to put an upload_asset result into `input`, when it is not a plain URL.

No examples provided.

get_recipe ~20

One recipe by name.

NameTypeReqDescription
namestringyes–
NameTypeReqDescription
budgetstring|null–Budget every run counts against unless the call names another.
created_atintegeryes–
descriptionstringyes–
input––Generation input with `{{var:<name>}}` (and any other placeholders) left in place.
modelstring|null––
namestringyes–
offer_idstring|null–Offer from search_prices that prices every run; single-generation recipes only.
providerstring|null–Single-generation recipe: provider, model and input. Absent when the recipe has `steps`.
save_to––Where the outputs are filed; with steps, the outputs of the final steps (those no later step uses).
stepsarrayyesA chain started by one run_recipe, in order; run_recipe returns the last step's job.
updated_atintegeryes–
variablesobjectyes–

No examples provided.

get_reference ~36

One reference by name or id, with its assets in order and their local paths.

NameTypeReqDescription
referencestringyesReference name or id.
NameTypeReqDescription
assetsarrayyesIn order; `{{ref:<name>}}` in a string field uses the first one.
created_atintegeryes–
descriptionstringyes–
idstringyes–
kind–yes–
namestringyes–
tagsstringyes–
updated_atintegeryes–

No examples provided.

get_spec ~60

Read a provider's active spec (TOML), whether it is built-in or a local override, and its fixture names. First step of fixing a provider.

NameTypeReqDescription
providerstringyesProvider key from list_providers, e.g. "fal".
NameTypeReqDescription
builtin_textstring|null–The built-in spec, when an override replaces it.
fixturesarrayyesRecorded request/response fixtures replayed by check_spec.
keystringyes–
pathstringyes–
sourcestringyes`builtin` or `override`.
textstringyesThe active spec (TOML). Edit it and pass it to check_spec, then save_spec.

No examples provided.

get_stats ~102

Per provider and model: jobs, done/failed share, failure kinds, average rating, approved share, average USD cost and seconds to finish. Filter by provider, model or collection. Use it to pick a model that worked before.

NameTypeReqDescription
collectionstring|null–Only jobs that read from or wrote into this collection.
modelstring|null–The provider's model id.
providerstring|null–Provider key, e.g. "kie".
NameTypeReqDescription
hintstringyes–
modelsarrayyesPer provider and model, most used first.

No examples provided.

import_asset ~113

Copy a local file into the asset library, e.g. a reference image. Files made by ai-media-router carry their provider, model, input, job and parent assets: import restores prompt, tags and lineage, and returns that provenance.

NameTypeReqDescription
pathstringyesAbsolute path of a local file.
promptstring|null–Description used for search; defaults to the prompt stored in the file by ai-media-router.
tagsstring|null–Space-separated tags, e.g. "character hero".
NameTypeReqDescription
bytesintegeryes–
created_atintegeryes–
descriptionstringyesFree text set with update_asset; searched together with prompt and tags.
duration_secsnumber|null–Length of a video or audio file.
has_audioboolean|null–Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed).
heightinteger|null––
hintstring|null––
idstringyesContent hash prefix; identical files share one id.
job_idstring|null–First job that produced this file; get_lineage shows every job around it.
mimestring|null––
missing_parentsarrayyesParents named in the provenance that are not in this library; importing them links them up.
pathstringyesAbsolute path of the stored file.
previewstring|null–JPEG preview (scaled image or first video frame); null without ffmpeg or for audio.
promptstring|null––
provenance––Provenance found in the file (written by ai-media-router); null for other files.
ratinginteger|null–1-5, set with review_asset.
review_notesstringyesReviewer's notes (what is wrong or right); searched like prompt, tags and description.
statusstringyesReview gate: `draft` (default), `approved` or `rejected`; set with review_asset.
tagsstringyes–
widthinteger|null–Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

No examples provided.

list_budgets ~21

Budgets with their limit, spent and remaining USD.

Input schema present but exposes no named parameters.

NameTypeReqDescription
budgetsarrayyes–

No examples provided.

list_collections ~28

List collections (projects) with their asset counts. search_assets {collection} lists one's assets.

Input schema present but exposes no named parameters.

NameTypeReqDescription
collectionsarrayyes–

No examples provided.

list_jobs ~151

Generation history, newest first, with provider, model, input, cost, input assets and outputs. Filter by reference, collection, status or error_kind.

NameTypeReqDescription
batchstring|null–Only jobs of this batch (generate_batch).
collectionstring|null–Only jobs that read from or wrote into this collection.
error_kind––Only failed jobs of this kind, e.g. "moderation" or "rate_limit".
limitinteger|null–Default 20.
referencestring|null–Only jobs that used this reference (name or id) as input or filed outputs into it.
statusstring|null–`running`, `done` or `failed`.
NameTypeReqDescription
jobsarrayyes–

No examples provided.

list_keys ~64

Every provider key any loaded spec uses: whether it is set, where it comes from, and the command that sets it. Never returns key values (only the last 4 characters), so it is safe to show the user; keys are added by the user in a terminal.

Input schema present but exposes no named parameters.

NameTypeReqDescription
config_filestringyes–
hintstringyes–
keysarrayyes–
warningsarrayyesThings that would hide a key or expose the file, each with its fix.

No examples provided.

list_providers ~32

List providers, whether their API keys are set, and whether each runs the built-in spec or a local override.

Input schema present but exposes no named parameters.

NameTypeReqDescription
providersarrayyes–
spec_errorsarrayyesOverride files that failed to load (the built-in spec stays active). Fix them with check_spec.

No examples provided.

list_recipes ~24

List recipes with their provider, model, input or steps, and variables.

Input schema present but exposes no named parameters.

NameTypeReqDescription
recipesarrayyes–

No examples provided.

list_references ~62

List references, most recently changed first; filter by kind or a substring of name, description or tags.

NameTypeReqDescription
kind–––
limitinteger|null–Default 20.
querystring|null–Substring of name, description or tags.
NameTypeReqDescription
referencesarrayyes–

No examples provided.

list_snippets ~15

List snippets with their text.

Input schema present but exposes no named parameters.

NameTypeReqDescription
snippetsarrayyes–

No examples provided.

mux_audio ~86

Put an audio track (audio asset or another video's sound) under a video, replacing its sound; returns the new asset.

NameTypeReqDescription
audio_asset_idstringyesAn audio asset, or a video whose sound is taken. Replaces the video's sound; padded with silence or cut to the video's length.
save_to–––
video_asset_idstringyes–
NameTypeReqDescription
asset–yes–
hintstringyes–
job_idstringyesThe local job that recorded this operation (provider `local`, model = operation, cost 0).

No examples provided.

overlay ~166

Draw an image (packshot, logo) over an image or video at x, y pixels, optionally scaled to width; returns the new asset.

NameTypeReqDescription
base_asset_idstringyesImage or video to draw on (e.g. a generated plate).
overlay_asset_idstringyesImage drawn on top (e.g. a real packshot or a logo; PNG transparency is kept).
save_to–––
widthinteger|null–Scale the overlay to this width in pixels, keeping its aspect. Default: its own size.
xinteger|null–Left edge in pixels of the base (get_asset shows its width and height). Default 0.
yinteger|null–Top edge in pixels of the base. Default 0.
NameTypeReqDescription
asset–yes–
hintstringyes–
job_idstringyesThe local job that recorded this operation (provider `local`, model = operation, cost 0).

No examples provided.

preflight ~281

Dry run of generate with the same arguments: checks the provider and keys, snippets and placeholders (assets, references, parent jobs), upload support, save_to, cost and budget, and renders the exact HTTP requests. Sends nothing, spends nothing; `ready` says whether generate would start. Use it before an expensive or unfamiliar generation. With recipe and vars instead: every step of run_recipe (checks named <step>/<check>), the summed estimate and the budget.

NameTypeReqDescription
budgetstring|null–With a recipe of steps, the sum of every step's estimate is checked against it.
estimated_cost_usdnumber|null––
inputobject–As in generate.
modelstring|null–As in generate; required unless `recipe` is given.
offer_idstring|null––
providerstring|null–As in generate; required unless `recipe` is given.
recipestring|null–Check a run_recipe instead: every step of the recipe, their summed estimate and the budget for the sum.
retry–––
reuseboolean|null–As in generate: report (with cost 0) when the run would return an identical job's outputs.
save_to–––
varsobject|null–The recipe's variables, as in run_recipe.
NameTypeReqDescription
checksarrayyes–
estimate_usdnumber|null––
hintstringyes–
input––The input as the provider would receive it; uploads are shown as `<upload of asset …>`. For a recipe with steps, each step's input by step name.
readybooleanyesNo check failed: generate with the same arguments would be submitted (or wait for its parent jobs).
requestsarrayyesThe HTTP requests generate would send, secrets masked.
reuse––The job whose outputs generate would return at no cost instead of submitting (`reuse`).
uploadsarrayyesLibrary assets (or video frames) that would be uploaded to the provider first.
waits_onarrayyesRunning jobs named by `{{job:…}}` that the job would wait for.

No examples provided.

reframe ~125

Change an image's or video's aspect ratio (e.g. 16:9 to 9:16) by centered crop or black padding; returns the new asset.

NameTypeReqDescription
aspectstringyesTarget aspect ratio "W:H", e.g. "9:16", "1:1", "16:9", or a number like "1.91".
asset_idstringyesAn image or video asset.
mode––`crop` (default): cut the edges away, centered. `pad`: add black bars.
save_to–––
NameTypeReqDescription
asset–yes–
hintstringyes–
job_idstringyesThe local job that recorded this operation (provider `local`, model = operation, cost 0).

No examples provided.

remove_from_collection ~68

Remove assets from a collection (not from the library); an emptied collection disappears.

NameTypeReqDescription
asset_idsarrayyes–
collectionstringyesCollection name; add_to_collection creates it when missing.
descriptionstring|null–add_to_collection only: replaces the collection's description.
NameTypeReqDescription
assetsintegeryes–
created_atintegeryes–
descriptionstringyes–
namestringyes–

No examples provided.

remove_from_reference ~69

Remove assets from a reference; they stay in the library.

NameTypeReqDescription
asset_idsarrayyes–
referencestringyesReference name or id.
rolestring|null–add_to_reference only: role of these assets, e.g. "front", "side", "palette".
NameTypeReqDescription
assetsarrayyesIn order; `{{ref:<name>}}` in a string field uses the first one.
created_atintegeryes–
descriptionstringyes–
idstringyes–
kind–yes–
namestringyes–
tagsstringyes–
updated_atintegeryes–

No examples provided.

reset_spec ~42

Delete a provider's local override so the built-in spec is used again.

NameTypeReqDescription
providerstringyesProvider key from list_providers, e.g. "fal".
NameTypeReqDescription
keystringyes–
removedstringyesThe override file that was removed.
sourcestringyes`builtin` if a built-in spec is active again, `none` if the provider no longer exists.

No examples provided.

review_asset ~144

Review assets: status approved/rejected/draft, rating 1-5, notes. Rejected assets are skipped when a {{ref:…}} expands; export_collection {only_approved} ships only approved ones; get_stats averages ratings per model.

NameTypeReqDescription
asset_idsarrayyes–
notesstring|null–What is right or wrong with it, e.g. "extra fingers, logo warped"; replaces earlier notes, searched by search_assets.
ratinginteger|null–1-5.
status––`approved` (ready to use), `rejected` (skipped by {{ref:…}} expansion) or `draft`.
NameTypeReqDescription
assetsarrayyes–

No examples provided.

run_recipe ~375

Start a generation from a recipe with values for its variables (defaults fill the rest). Returns the job like generate. A recipe with steps starts every step at once in one batch, admitting the sum of their estimates against `budget`; it returns the last step's job, and get_batch {batch_id} follows the whole run.

NameTypeReqDescription
budgetstring|null–With steps, the sum of every step's estimate is admitted before anything is submitted.
estimated_cost_usdnumber|null–With `budget` and no value, it is computed like estimate_cost. Not for a recipe with steps: set it per step.
namestringyes–
offer_idstring|null–Offer from search_prices; prices the run from the filled input. Not for a recipe with steps: set it per step.
retry––Resubmit after a retryable failure (rate_limit, provider_error, network, timeout): {attempts: 1-5, delay_secs}. Off by default, since a provider may bill a failed attempt.
reuseboolean|null–true: when a job with the same provider, model and input (library files compared by content) is done and its outputs are still in the library, or is still running, return those outputs as a new job a…
save_to––Replaces the recipe's save_to for this run (with steps: for the final steps).
varsobject|null–Values for the recipe's variables, e.g. {"language": "de", "duration": 5}.

Structured output declared, but exposes no named fields.

No examples provided.

save_recipe ~514

Save a generation template: from_job copies a working job, or give provider, model and input. "{{var:<name>}}" in input marks what changes per run; every recipe also appears as the MCP prompt recipe:<name>. A chain: `steps` (generations and ffmpeg edits linked by "{{step:<name>}}"), or from_job / from_asset with chain: true to take the final job's whole lineage.

NameTypeReqDescription
budgetstring|null–Budget every run counts against unless the call names another.
chainboolean|null–With from_job / from_asset: also save the jobs that made its inputs ({{job:…}}, {{asset:…}} made by a job, asset ids of an edit), back to imported files and references, as earlier steps; their ids be…
descriptionstring|null––
from_assetstring|null–Like from_job, with the job that made this asset.
from_jobstring|null–Start from this job's provider, model, input and save_to; other fields given here override them.
inputobject|null–Generation input. "{{var:<name>}}" as a whole string becomes the variable's JSON value, inside a longer string its text. Text and media placeholders ({{snippet:…}}, {{ref:…}}, {{asset:…}}) stay and r…
modelstring|null–Required unless from_job is given.
namestringyesUnique name; saving again replaces the recipe.
offer_idstring|null–Offer from search_prices that prices every run; single-generation recipes only.
providerstring|null–Required unless from_job is given.
save_to––With steps: where the final steps' outputs are filed.
stepsarray|null–A chain instead of provider/model/input, run in order by one run_recipe: each step is a generation {name, provider, model, input} or an ffmpeg edit {name, op, input: <that tool's parameters>}. Later…
variablesobject|null–Declared variables; ones used in input but not listed here are added as required.
NameTypeReqDescription
budgetstring|null–Budget every run counts against unless the call names another.
created_atintegeryes–
descriptionstringyes–
input––Generation input with `{{var:<name>}}` (and any other placeholders) left in place.
modelstring|null––
namestringyes–
offer_idstring|null–Offer from search_prices that prices every run; single-generation recipes only.
providerstring|null–Single-generation recipe: provider, model and input. Absent when the recipe has `steps`.
save_to––Where the outputs are filed; with steps, the outputs of the final steps (those no later step uses).
stepsarrayyesA chain started by one run_recipe, in order; run_recipe returns the last step's job.
updated_atintegeryes–
variablesobjectyes–

No examples provided.

Install

How do I install the AI Media Router MCP server?

AI Media Router runs locally as a container image, launched with docker run --rm -i -e KIE_API_KEY -e FAL_KEY -e REPLICATE_API_TOKEN -e RUNWARE_API_KEY -e WAVESPEED_API_KEY ghcr.io/jutsuhq/ai-media-router:v0.1.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

oci · ghcr.io/jutsuhq/ai-media-router

# add to Claude Code
claude mcp add jutsuhq-ai-media-router -- docker run --rm -i -e KIE_API_KEY -e FAL_KEY -e REPLICATE_API_TOKEN -e RUNWARE_API_KEY -e WAVESPEED_API_KEY ghcr.io/jutsuhq/ai-media-router:v0.1.0

This image reads KIE_API_KEY, FAL_KEY, REPLICATE_API_TOKEN, RUNWARE_API_KEY and WAVESPEED_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

Common questions

What is the AI Media Router MCP server?

AI Media Router is an MCP server listed in the public MCP registry as io.github.jutsuhq/ai-media-router. Image and video generation across 40+ providers with your own keys, plus a local asset library. This page covers its container image (ghcr.io/jutsuhq/ai-media-router).

Is the AI Media Router MCP server safe to use?

AI Media Router scores 31 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the AI Media Router MCP server expose?

AI Media Router exposes 55 tools: add_to_collection, add_to_reference, cancel_job, check_spec, concat, and 50 more. Their descriptions and schemas cost roughly 6,259 tokens of context every time the server is loaded.

Is the AI Media Router MCP server still maintained?

AI Media Router is still listed as active in the MCP registry. We last reached this channel on 2 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What did VerifyMCP test on the AI Media Router MCP server?

VerifyMCP ran 7 checks on AI Media Router, covering Source repository, Schema quality, Tool coverage, Injection markers and 3 more. 9 items could not be completed, a gap on our side rather than a finding about AI Media Router: Malware scan, Known CVEs, Install scripts, Dependency health and 5 more. 2 categories score 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.