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.
Available components
Last scanned (5 hours ago)
Scores higher than 36% of OCI servers
Category Design and Media
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.
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 →
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.
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 →
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 →
add_to_collection ~63
Add assets to a collection, creating it when missing.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_ids | array | yes | – |
| collection | string | yes | Collection name; add_to_collection creates it when missing. |
| description | string|null | – | add_to_collection only: replaces the collection's description. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | integer | yes | – |
| created_at | integer | yes | – |
| description | string | yes | – |
| name | string | yes | – |
No examples provided.
add_to_reference ~74
Append assets to a reference, optionally with a role (e.g. "side").
| Name | Type | Req | Description |
|---|---|---|---|
| asset_ids | array | yes | – |
| reference | string | yes | Reference name or id. |
| role | string|null | – | add_to_reference only: role of these assets, e.g. "front", "side", "palette". |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | yes | In order; `{{ref:<name>}}` in a string field uses the first one. |
| created_at | integer | yes | – |
| description | string | yes | – |
| id | string | yes | – |
| kind | – | yes | – |
| name | string | yes | – |
| tags | string | yes | – |
| updated_at | integer | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| input | object|null | – | Generation input for the rendered requests. |
| model | string|null | – | With `model`, also render the exact HTTP requests a generation would send (nothing is sent). |
| provider | string|null | – | Check the loaded spec of this provider. Omit when passing `spec`. |
| spec | string|null | – | TOML text of a candidate spec (not saved). Format: docs/provider-spec.md. |
| vars | object|null | – | Values for variables later steps capture from earlier responses (e.g. {"id": "task-123"}). |
| Name | Type | Req | Description |
|---|---|---|---|
| error | string|null | – | Parse or validation error (TOML line/column, field, pointer or template variable). |
| fixtures | array | yes | – |
| hint | string | yes | – |
| key | string|null | – | – |
| requests | array | yes | Rendered requests, credentials shown as `<ENV_NAME>`; only when `model` is given. |
| valid | boolean | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_ids | array | yes | Two 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 | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| asset | – | yes | – |
| hint | string | yes | – |
| job_id | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | – |
| created_at | integer | yes | – |
| description | string | yes | Free text set with update_asset; searched together with prompt and tags. |
| duration_secs | number|null | – | Length of a video or audio file. |
| has_audio | boolean|null | – | Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed). |
| height | integer|null | – | – |
| id | string | yes | Content hash prefix; identical files share one id. |
| job_id | string|null | – | First job that produced this file; get_lineage shows every job around it. |
| mime | string|null | – | – |
| path | string | yes | Absolute path of the stored file. |
| preview | string|null | – | JPEG preview (scaled image or first video frame); null without ffmpeg or for audio. |
| prompt | string|null | – | – |
| rating | integer|null | – | 1-5, set with review_asset. |
| review_notes | string | yes | Reviewer's notes (what is wrong or right); searched like prompt, tags and description. |
| status | string | yes | Review gate: `draft` (default), `approved` or `rejected`; set with review_asset. |
| tags | string | yes | – |
| width | integer|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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | integer | yes | – |
| jobs | integer | yes | – |
| limit_usd | number | yes | – |
| name | string | yes | – |
| remaining_usd | number | yes | – |
| spent_usd | number | yes | Reported 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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | Budget every run counts against unless the call names another. |
| created_at | integer | yes | – |
| description | string | yes | – |
| input | – | – | Generation input with `{{var:<name>}}` (and any other placeholders) left in place. |
| model | string|null | – | – |
| name | string | yes | – |
| offer_id | string|null | – | Offer from search_prices that prices every run; single-generation recipes only. |
| provider | string|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). |
| steps | array | yes | A chain started by one run_recipe, in order; run_recipe returns the last step's job. |
| updated_at | integer | yes | – |
| variables | object | yes | – |
No examples provided.
delete_reference ~30
Delete a reference; its assets stay in the library.
| Name | Type | Req | Description |
|---|---|---|---|
| reference | string | yes | Reference name or id. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | yes | In order; `{{ref:<name>}}` in a string field uses the first one. |
| created_at | integer | yes | – |
| description | string | yes | – |
| id | string | yes | – |
| kind | – | yes | – |
| name | string | yes | – |
| tags | string | yes | – |
| updated_at | integer | yes | – |
No examples provided.
delete_snippet ~33
Delete a snippet; inputs that still use it fail with the list of known snippets.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | yes | – |
| name | string | yes | – |
| text | string | yes | – |
| updated_at | integer | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| online | boolean|null | – | Also send one GET to every configured provider's base URL (any HTTP answer counts as reachable). |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | yes | – |
| ok | boolean | yes | No check failed. |
| providers | array | yes | Configured 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.
| Name | Type | Req | Description |
|---|---|---|---|
| input | object | – | 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… |
| model | string|null | – | The provider's model id, as passed to generate. Required unless `recipe` is given. |
| offer_id | string|null | – | Offer from search_prices to price; without it only the history median is used. |
| provider | string|null | – | Provider key, e.g. "kie". Required unless `recipe` is given. |
| recipe | string|null | – | Price a run_recipe instead: each step from its own estimated_cost_usd or offer_id (edits cost 0), and the sum. |
| reuse | boolean|null | – | As in generate: report (with cost 0) when the run would return an identical job's outputs. |
| vars | object|null | – | The recipe's variables, as in run_recipe. |
| Name | Type | Req | Description |
|---|---|---|---|
| estimate_usd | number|null | – | Expected cost in USD; null when none could be computed (`note` says why). |
| formula | string|null | – | How `estimate_usd` was computed. |
| history | – | – | Median USD cost of finished jobs on this provider and model that reported USD. |
| note | string|null | – | – |
| offer | – | – | The offer priced, when `offer_id` was given. |
| read | object | yes | Input 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. |
| steps | array | yes | For 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.
| Name | Type | Req | Description |
|---|---|---|---|
| collection | string | yes | – |
| only_approved | boolean|null | – | Only assets approved with review_asset. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | integer | yes | – |
| bytes | integer | yes | – |
| path | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | A 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| asset | – | yes | – |
| hint | string | yes | – |
| job_id | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | Count this job against a budget (set_budget); the job is refused if it would exceed it. |
| estimated_cost_usd | number|null | – | Expected cost in USD. With `budget` and no value, it is computed like estimate_cost. |
| input | object | yes | Model 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>}}… |
| model | string | – | The provider's own model id or endpoint, e.g. "kling-2.6/image-to-video" on kie. Required unless `recipe` is given. |
| offer_id | string|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. |
| provider | string | – | Provider key, e.g. "kie". See get_provider for what `model` means there. Required unless `recipe` is given. |
| recipe | string|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. |
| reuse | boolean|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. |
| vars | object|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.
| Name | Type | Req | Description |
|---|---|---|---|
| defaults | – | – | Shared by every job; items override provider, model, save_to and estimated_cost_usd, and merge their input over this input. |
| items | array|null | – | One entry per variant, e.g. the same prompt on several provider/model pairs (a bench). |
| label | string|null | – | Free text to recognise the batch by. |
| matrix | object|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. |
| recipe | string|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. |
| Name | Type | Req | Description |
|---|---|---|---|
| counts | object | yes | Jobs per status (`waiting`, `running`, `done`, `failed`). |
| created_at | integer | yes | – |
| hint | string | yes | – |
| id | string | yes | – |
| jobs | array | yes | In submission order. |
| label | string|null | – | – |
| outputs | array | yes | Every output of the batch's finished jobs, in job order; for a recipe run only the final steps' outputs. |
| recipe | string|null | – | The recipe this batch is one run of. |
| refused | array | yes | Jobs 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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | – |
| created_at | integer | yes | – |
| description | string | yes | Free text set with update_asset; searched together with prompt and tags. |
| duration_secs | number|null | – | Length of a video or audio file. |
| has_audio | boolean|null | – | Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed). |
| height | integer|null | – | – |
| id | string | yes | Content hash prefix; identical files share one id. |
| job_id | string|null | – | First job that produced this file; get_lineage shows every job around it. |
| mime | string|null | – | – |
| path | string | yes | Absolute path of the stored file. |
| preview | string|null | – | JPEG preview (scaled image or first video frame); null without ffmpeg or for audio. |
| prompt | string|null | – | – |
| rating | integer|null | – | 1-5, set with review_asset. |
| review_notes | string | yes | Reviewer's notes (what is wrong or right); searched like prompt, tags and description. |
| status | string | yes | Review gate: `draft` (default), `approved` or `rejected`; set with review_asset. |
| tags | string | yes | – |
| width | integer|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).
| Name | Type | Req | Description |
|---|---|---|---|
| batch_id | string | yes | – |
| wait_secs | integer|null | – | Block up to this many seconds (max 50) for every job to finish. Default 0. |
| Name | Type | Req | Description |
|---|---|---|---|
| counts | object | yes | Jobs per status (`waiting`, `running`, `done`, `failed`). |
| created_at | integer | yes | – |
| hint | string | yes | – |
| id | string | yes | – |
| jobs | array | yes | In submission order. |
| label | string|null | – | – |
| outputs | array | yes | Every output of the batch's finished jobs, in job order; for a recipe run only the final steps' outputs. |
| recipe | string|null | – | The recipe this batch is one run of. |
| refused | array | yes | Jobs 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.
| Name | Type | Req | Description |
|---|---|---|---|
| debug | boolean|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_id | string | yes | – |
| wait_secs | integer|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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| ancestors | array | yes | What the asset was made from, nearest first. |
| asset | – | yes | – |
| collections | array | yes | – |
| descendants | array | yes | What was made from it, nearest first. |
| hint | string | yes | – |
| references | array | yes | References 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.
| Name | Type | Req | Description |
|---|---|---|---|
| provider | string | yes | Provider key from list_providers, e.g. "fal". |
| Name | Type | Req | Description |
|---|---|---|---|
| catalog | array | yes | Provider names in the price catalog that this provider serves. |
| configured | boolean | yes | – |
| cost_unit | string|null | – | Unit of job `cost` for this provider, if known. |
| docs | string | yes | Where to look up model ids and input fields. |
| example | – | – | A complete generate call known to match this spec; adapt model and input. |
| key | string | yes | – |
| missing_env | array | yes | – |
| model_hint | string | yes | What to pass as `model` and `input` for this provider. |
| name | string | yes | – |
| notes | string|null | – | – |
| source | string | yes | `builtin` or `override`. |
| spec_path | string | yes | Spec file: `providers/<key>.toml` in the repo, or the override path. |
| upload | string|null | – | How references are uploaded: multipart, json, put, post_form, data_uri, or null if not supported. |
| upload_usage | string|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.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | Budget every run counts against unless the call names another. |
| created_at | integer | yes | – |
| description | string | yes | – |
| input | – | – | Generation input with `{{var:<name>}}` (and any other placeholders) left in place. |
| model | string|null | – | – |
| name | string | yes | – |
| offer_id | string|null | – | Offer from search_prices that prices every run; single-generation recipes only. |
| provider | string|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). |
| steps | array | yes | A chain started by one run_recipe, in order; run_recipe returns the last step's job. |
| updated_at | integer | yes | – |
| variables | object | yes | – |
No examples provided.
get_reference ~36
One reference by name or id, with its assets in order and their local paths.
| Name | Type | Req | Description |
|---|---|---|---|
| reference | string | yes | Reference name or id. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | yes | In order; `{{ref:<name>}}` in a string field uses the first one. |
| created_at | integer | yes | – |
| description | string | yes | – |
| id | string | yes | – |
| kind | – | yes | – |
| name | string | yes | – |
| tags | string | yes | – |
| updated_at | integer | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| provider | string | yes | Provider key from list_providers, e.g. "fal". |
| Name | Type | Req | Description |
|---|---|---|---|
| builtin_text | string|null | – | The built-in spec, when an override replaces it. |
| fixtures | array | yes | Recorded request/response fixtures replayed by check_spec. |
| key | string | yes | – |
| path | string | yes | – |
| source | string | yes | `builtin` or `override`. |
| text | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| collection | string|null | – | Only jobs that read from or wrote into this collection. |
| model | string|null | – | The provider's model id. |
| provider | string|null | – | Provider key, e.g. "kie". |
| Name | Type | Req | Description |
|---|---|---|---|
| hint | string | yes | – |
| models | array | yes | Per 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.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path of a local file. |
| prompt | string|null | – | Description used for search; defaults to the prompt stored in the file by ai-media-router. |
| tags | string|null | – | Space-separated tags, e.g. "character hero". |
| Name | Type | Req | Description |
|---|---|---|---|
| bytes | integer | yes | – |
| created_at | integer | yes | – |
| description | string | yes | Free text set with update_asset; searched together with prompt and tags. |
| duration_secs | number|null | – | Length of a video or audio file. |
| has_audio | boolean|null | – | Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed). |
| height | integer|null | – | – |
| hint | string|null | – | – |
| id | string | yes | Content hash prefix; identical files share one id. |
| job_id | string|null | – | First job that produced this file; get_lineage shows every job around it. |
| mime | string|null | – | – |
| missing_parents | array | yes | Parents named in the provenance that are not in this library; importing them links them up. |
| path | string | yes | Absolute path of the stored file. |
| preview | string|null | – | JPEG preview (scaled image or first video frame); null without ffmpeg or for audio. |
| prompt | string|null | – | – |
| provenance | – | – | Provenance found in the file (written by ai-media-router); null for other files. |
| rating | integer|null | – | 1-5, set with review_asset. |
| review_notes | string | yes | Reviewer's notes (what is wrong or right); searched like prompt, tags and description. |
| status | string | yes | Review gate: `draft` (default), `approved` or `rejected`; set with review_asset. |
| tags | string | yes | – |
| width | integer|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.
| Name | Type | Req | Description |
|---|---|---|---|
| budgets | array | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| collections | array | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| batch | string|null | – | Only jobs of this batch (generate_batch). |
| collection | string|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". |
| limit | integer|null | – | Default 20. |
| reference | string|null | – | Only jobs that used this reference (name or id) as input or filed outputs into it. |
| status | string|null | – | `running`, `done` or `failed`. |
| Name | Type | Req | Description |
|---|---|---|---|
| jobs | array | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| config_file | string | yes | – |
| hint | string | yes | – |
| keys | array | yes | – |
| warnings | array | yes | Things 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.
| Name | Type | Req | Description |
|---|---|---|---|
| providers | array | yes | – |
| spec_errors | array | yes | Override 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.
| Name | Type | Req | Description |
|---|---|---|---|
| recipes | array | yes | – |
No examples provided.
list_references ~62
List references, most recently changed first; filter by kind or a substring of name, description or tags.
| Name | Type | Req | Description |
|---|---|---|---|
| kind | – | – | – |
| limit | integer|null | – | Default 20. |
| query | string|null | – | Substring of name, description or tags. |
| Name | Type | Req | Description |
|---|---|---|---|
| references | array | yes | – |
No examples provided.
list_snippets ~15
List snippets with their text.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| snippets | array | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| audio_asset_id | string | yes | An 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_id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| asset | – | yes | – |
| hint | string | yes | – |
| job_id | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| base_asset_id | string | yes | Image or video to draw on (e.g. a generated plate). |
| overlay_asset_id | string | yes | Image drawn on top (e.g. a real packshot or a logo; PNG transparency is kept). |
| save_to | – | – | – |
| width | integer|null | – | Scale the overlay to this width in pixels, keeping its aspect. Default: its own size. |
| x | integer|null | – | Left edge in pixels of the base (get_asset shows its width and height). Default 0. |
| y | integer|null | – | Top edge in pixels of the base. Default 0. |
| Name | Type | Req | Description |
|---|---|---|---|
| asset | – | yes | – |
| hint | string | yes | – |
| job_id | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | With a recipe of steps, the sum of every step's estimate is checked against it. |
| estimated_cost_usd | number|null | – | – |
| input | object | – | As in generate. |
| model | string|null | – | As in generate; required unless `recipe` is given. |
| offer_id | string|null | – | – |
| provider | string|null | – | As in generate; required unless `recipe` is given. |
| recipe | string|null | – | Check a run_recipe instead: every step of the recipe, their summed estimate and the budget for the sum. |
| retry | – | – | – |
| reuse | boolean|null | – | As in generate: report (with cost 0) when the run would return an identical job's outputs. |
| save_to | – | – | – |
| vars | object|null | – | The recipe's variables, as in run_recipe. |
| Name | Type | Req | Description |
|---|---|---|---|
| checks | array | yes | – |
| estimate_usd | number|null | – | – |
| hint | string | yes | – |
| 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. |
| ready | boolean | yes | No check failed: generate with the same arguments would be submitted (or wait for its parent jobs). |
| requests | array | yes | The HTTP requests generate would send, secrets masked. |
| reuse | – | – | The job whose outputs generate would return at no cost instead of submitting (`reuse`). |
| uploads | array | yes | Library assets (or video frames) that would be uploaded to the provider first. |
| waits_on | array | yes | Running 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.
| Name | Type | Req | Description |
|---|---|---|---|
| aspect | string | yes | Target aspect ratio "W:H", e.g. "9:16", "1:1", "16:9", or a number like "1.91". |
| asset_id | string | yes | An image or video asset. |
| mode | – | – | `crop` (default): cut the edges away, centered. `pad`: add black bars. |
| save_to | – | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| asset | – | yes | – |
| hint | string | yes | – |
| job_id | string | yes | The 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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_ids | array | yes | – |
| collection | string | yes | Collection name; add_to_collection creates it when missing. |
| description | string|null | – | add_to_collection only: replaces the collection's description. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | integer | yes | – |
| created_at | integer | yes | – |
| description | string | yes | – |
| name | string | yes | – |
No examples provided.
remove_from_reference ~69
Remove assets from a reference; they stay in the library.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_ids | array | yes | – |
| reference | string | yes | Reference name or id. |
| role | string|null | – | add_to_reference only: role of these assets, e.g. "front", "side", "palette". |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | yes | In order; `{{ref:<name>}}` in a string field uses the first one. |
| created_at | integer | yes | – |
| description | string | yes | – |
| id | string | yes | – |
| kind | – | yes | – |
| name | string | yes | – |
| tags | string | yes | – |
| updated_at | integer | yes | – |
No examples provided.
reset_spec ~42
Delete a provider's local override so the built-in spec is used again.
| Name | Type | Req | Description |
|---|---|---|---|
| provider | string | yes | Provider key from list_providers, e.g. "fal". |
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | – |
| removed | string | yes | The override file that was removed. |
| source | string | yes | `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.
| Name | Type | Req | Description |
|---|---|---|---|
| asset_ids | array | yes | – |
| notes | string|null | – | What is right or wrong with it, e.g. "extra fingers, logo warped"; replaces earlier notes, searched by search_assets. |
| rating | integer|null | – | 1-5. |
| status | – | – | `approved` (ready to use), `rejected` (skipped by {{ref:…}} expansion) or `draft`. |
| Name | Type | Req | Description |
|---|---|---|---|
| assets | array | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | With steps, the sum of every step's estimate is admitted before anything is submitted. |
| estimated_cost_usd | number|null | – | With `budget` and no value, it is computed like estimate_cost. Not for a recipe with steps: set it per step. |
| name | string | yes | – |
| offer_id | string|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. |
| reuse | boolean|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). |
| vars | object|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.
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | Budget every run counts against unless the call names another. |
| chain | boolean|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… |
| description | string|null | – | – |
| from_asset | string|null | – | Like from_job, with the job that made this asset. |
| from_job | string|null | – | Start from this job's provider, model, input and save_to; other fields given here override them. |
| input | object|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… |
| model | string|null | – | Required unless from_job is given. |
| name | string | yes | Unique name; saving again replaces the recipe. |
| offer_id | string|null | – | Offer from search_prices that prices every run; single-generation recipes only. |
| provider | string|null | – | Required unless from_job is given. |
| save_to | – | – | With steps: where the final steps' outputs are filed. |
| steps | array|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… |
| variables | object|null | – | Declared variables; ones used in input but not listed here are added as required. |
| Name | Type | Req | Description |
|---|---|---|---|
| budget | string|null | – | Budget every run counts against unless the call names another. |
| created_at | integer | yes | – |
| description | string | yes | – |
| input | – | – | Generation input with `{{var:<name>}}` (and any other placeholders) left in place. |
| model | string|null | – | – |
| name | string | yes | – |
| offer_id | string|null | – | Offer from search_prices that prices every run; single-generation recipes only. |
| provider | string|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). |
| steps | array | yes | A chain started by one run_recipe, in order; run_recipe returns the last step's job. |
| updated_at | integer | yes | – |
| variables | object | yes | – |
No examples provided.
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
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.
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.