# 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.

- Trust score: 31/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- oci · `ghcr.io/jutsuhq/ai-media-router`: 31/100 (this document), [markdown](https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.md), [page](https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/jutsuhq/ai-media-router`
- Version: `v0.1.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 0/100
  - 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 could not be checked: we could not reach the registry to check. This is a gap on our side.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: we could not reach the registry to check. This is a gap on our side.
- **Provenance & Transparency**: 0/100
  - Repository check failed: the declared repository URL returned HTTP 404.
  - Build provenance not yet verified.
  - License not yet determined.
  - Maintenance history not yet determined.
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 80/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 8591 tokens (~86/item across 99 items; 55 tools + 44 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 95/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 81% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 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.
  - An AI judge read all 57 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**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.

## 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.

### Claude

```bash
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.

### Cursor

```json
{
  "mcpServers": {
    "jutsuhq-ai-media-router": {
      "command": "docker",
      "args": [
        "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.

### VS Code

```json
{
  "servers": {
    "jutsuhq-ai-media-router": {
      "command": "docker",
      "args": [
        "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.

### Codex

```bash
codex 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.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jutsuhq-ai-media-router": {
      "type": "local",
      "command": [
        "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"
      ],
      "enabled": true
    }
  }
}
```

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.

### Hermes

```yaml
mcp_servers:
  jutsuhq-ai-media-router:
    command: "docker"
    args: ["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.

### Netclaw

```json
{
  "McpServers": {
    "jutsuhq-ai-media-router": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "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.

### Other

```json
{
  "mcpServers": {
    "jutsuhq-ai-media-router": {
      "command": "docker",
      "args": [
        "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.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-03 (score 31, −10)

- [security regression] Provenance: fail → unverified
- [security regression] Stability: 0.03 → unverified
- [security regression] Source repository: pass → fail
- [functional regression] License: pass → unverified
- [functional regression] Security disclosure: pass → unverified
- [functional regression] Maintenance: pass → unverified
- [functional] Licence: MIT

### 2026-11-02 (score 41, +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.

### 2026-11-01 (score 40)

First indexed and scored.

## MCP tools (55)

### `add_to_collection` (~63 tokens)

Add assets to a collection, creating it when missing.

Input parameters:

- `asset_ids` (array, required)
- `collection` (string, required): Collection name; add_to_collection creates it when missing.
- `description` (string|null): add_to_collection only: replaces the collection's description.

Output parameters:

- `assets` (integer)
- `created_at` (integer)
- `description` (string)
- `name` (string)

### `add_to_reference` (~74 tokens)

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

Input parameters:

- `asset_ids` (array, required)
- `reference` (string, required): Reference name or id.
- `role` (string|null): add_to_reference only: role of these assets, e.g. "front", "side", "palette".

Output parameters:

- `assets` (array): In order; `{{ref:<name>}}` in a string field uses the first one.
- `created_at` (integer)
- `description` (string)
- `id` (string)
- `kind`
- `name` (string)
- `tags` (string)
- `updated_at` (integer)

### `cancel_job` (~56 tokens)

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.

Input parameters:

- `job_id` (string, required)

### `check_spec` (~161 tokens)

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.

Input parameters:

- `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"}).

Output parameters:

- `error` (string|null): Parse or validation error (TOML line/column, field, pointer or template variable).
- `fixtures` (array)
- `hint` (string)
- `key` (string|null)
- `requests` (array): Rendered requests, credentials shown as `<ENV_NAME>`; only when `model` is given.
- `valid` (boolean)

### `concat` (~86 tokens)

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

Input parameters:

- `asset_ids` (array, required): 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`

Output parameters:

- `asset`
- `hint` (string)
- `job_id` (string): The local job that recorded this operation (provider `local`, model = operation, cost 0).

### `delete_asset` (~39 tokens)

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

Input parameters:

- `asset_id` (string, required)

Output parameters:

- `bytes` (integer)
- `created_at` (integer)
- `description` (string): 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): 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): 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): Reviewer's notes (what is wrong or right); searched like prompt, tags and description.
- `status` (string): Review gate: `draft` (default), `approved` or `rejected`; set with review_asset.
- `tags` (string)
- `width` (integer|null): Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

### `delete_budget` (~26 tokens)

Delete a budget; its jobs stay in the history.

Input parameters:

- `name` (string, required)

Output parameters:

- `created_at` (integer)
- `jobs` (integer)
- `limit_usd` (number)
- `name` (string)
- `remaining_usd` (number)
- `spent_usd` (number): Reported USD cost of finished jobs, plus the estimate of running jobs and of jobs whose provider reports no USD cost.

### `delete_recipe` (~28 tokens)

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

Input parameters:

- `name` (string, required)

Output parameters:

- `budget` (string|null): Budget every run counts against unless the call names another.
- `created_at` (integer)
- `description` (string)
- `input`: Generation input with `{{var:<name>}}` (and any other placeholders) left in place.
- `model` (string|null)
- `name` (string)
- `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): A chain started by one run_recipe, in order; run_recipe returns the last step's job.
- `updated_at` (integer)
- `variables` (object)

### `delete_reference` (~30 tokens)

Delete a reference; its assets stay in the library.

Input parameters:

- `reference` (string, required): Reference name or id.

Output parameters:

- `assets` (array): In order; `{{ref:<name>}}` in a string field uses the first one.
- `created_at` (integer)
- `description` (string)
- `id` (string)
- `kind`
- `name` (string)
- `tags` (string)
- `updated_at` (integer)

### `delete_snippet` (~33 tokens)

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

Input parameters:

- `name` (string, required)

Output parameters:

- `description` (string)
- `name` (string)
- `text` (string)
- `updated_at` (integer)

### `doctor` (~94 tokens)

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.

Input parameters:

- `online` (boolean|null): Also send one GET to every configured provider's base URL (any HTTP answer counts as reachable).

Output parameters:

- `checks` (array)
- `ok` (boolean): No check failed.
- `providers` (array): Configured providers and local overrides.

### `estimate_cost` (~298 tokens)

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.

Input parameters:

- `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.

Output parameters:

- `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): 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): For a recipe with steps: each step's share of `estimate_usd`, in order.

### `export_collection` (~95 tokens)

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.

Input parameters:

- `collection` (string, required)
- `only_approved` (boolean|null): Only assets approved with review_asset.

Output parameters:

- `assets` (integer)
- `bytes` (integer)
- `path` (string): 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.

### `extract_frame` (~97 tokens)

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.

Input parameters:

- `asset_id` (string, required): 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.

Output parameters:

- `asset`
- `hint` (string)
- `job_id` (string): The local job that recorded this operation (provider `local`, model = operation, cost 0).

### `generate` (~702 tokens)

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.

Input parameters:

- `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, required): 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.

### `generate_batch` (~251 tokens)

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.

Input parameters:

- `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.

Output parameters:

- `counts` (object): Jobs per status (`waiting`, `running`, `done`, `failed`).
- `created_at` (integer)
- `hint` (string)
- `id` (string)
- `jobs` (array): In submission order.
- `label` (string|null)
- `outputs` (array): 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): Jobs that were never created (bad placeholder, unknown reference), by their position in the batch.

### `get_asset` (~24 tokens)

Metadata and local path of one asset.

Input parameters:

- `asset_id` (string, required)

Output parameters:

- `bytes` (integer)
- `created_at` (integer)
- `description` (string): 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): 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): 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): Reviewer's notes (what is wrong or right); searched like prompt, tags and description.
- `status` (string): Review gate: `draft` (default), `approved` or `rejected`; set with review_asset.
- `tags` (string)
- `width` (integer|null): Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

### `get_batch` (~73 tokens)

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

Input parameters:

- `batch_id` (string, required)
- `wait_secs` (integer|null): Block up to this many seconds (max 50) for every job to finish. Default 0.

Output parameters:

- `counts` (object): Jobs per status (`waiting`, `running`, `done`, `failed`).
- `created_at` (integer)
- `hint` (string)
- `id` (string)
- `jobs` (array): In submission order.
- `label` (string|null)
- `outputs` (array): 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): Jobs that were never created (bad placeholder, unknown reference), by their position in the batch.

### `get_job` (~118 tokens)

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

Input parameters:

- `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, required)
- `wait_secs` (integer|null): Block up to this many seconds (max 50) for the job to finish. Default 0.

### `get_lineage` (~51 tokens)

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.

Input parameters:

- `asset_id` (string, required)

Output parameters:

- `ancestors` (array): What the asset was made from, nearest first.
- `asset`
- `collections` (array)
- `descendants` (array): What was made from it, nearest first.
- `hint` (string)
- `references` (array): References and collections that hold this asset.

### `get_provider` (~52 tokens)

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

Input parameters:

- `provider` (string, required): Provider key from list_providers, e.g. "fal".

Output parameters:

- `catalog` (array): Provider names in the price catalog that this provider serves.
- `configured` (boolean)
- `cost_unit` (string|null): Unit of job `cost` for this provider, if known.
- `docs` (string): 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)
- `missing_env` (array)
- `model_hint` (string): What to pass as `model` and `input` for this provider.
- `name` (string)
- `notes` (string|null)
- `source` (string): `builtin` or `override`.
- `spec_path` (string): 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.

### `get_recipe` (~20 tokens)

One recipe by name.

Input parameters:

- `name` (string, required)

Output parameters:

- `budget` (string|null): Budget every run counts against unless the call names another.
- `created_at` (integer)
- `description` (string)
- `input`: Generation input with `{{var:<name>}}` (and any other placeholders) left in place.
- `model` (string|null)
- `name` (string)
- `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): A chain started by one run_recipe, in order; run_recipe returns the last step's job.
- `updated_at` (integer)
- `variables` (object)

### `get_reference` (~36 tokens)

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

Input parameters:

- `reference` (string, required): Reference name or id.

Output parameters:

- `assets` (array): In order; `{{ref:<name>}}` in a string field uses the first one.
- `created_at` (integer)
- `description` (string)
- `id` (string)
- `kind`
- `name` (string)
- `tags` (string)
- `updated_at` (integer)

### `get_spec` (~60 tokens)

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.

Input parameters:

- `provider` (string, required): Provider key from list_providers, e.g. "fal".

Output parameters:

- `builtin_text` (string|null): The built-in spec, when an override replaces it.
- `fixtures` (array): Recorded request/response fixtures replayed by check_spec.
- `key` (string)
- `path` (string)
- `source` (string): `builtin` or `override`.
- `text` (string): The active spec (TOML). Edit it and pass it to check_spec, then save_spec.

### `get_stats` (~102 tokens)

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.

Input parameters:

- `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".

Output parameters:

- `hint` (string)
- `models` (array): Per provider and model, most used first.

### `import_asset` (~113 tokens)

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.

Input parameters:

- `path` (string, required): 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".

Output parameters:

- `bytes` (integer)
- `created_at` (integer)
- `description` (string): 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): 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): Parents named in the provenance that are not in this library; importing them links them up.
- `path` (string): 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): Reviewer's notes (what is wrong or right); searched like prompt, tags and description.
- `status` (string): Review gate: `draft` (default), `approved` or `rejected`; set with review_asset.
- `tags` (string)
- `width` (integer|null): Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

### `list_budgets` (~21 tokens)

Budgets with their limit, spent and remaining USD.

Output parameters:

- `budgets` (array)

### `list_collections` (~28 tokens)

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

Output parameters:

- `collections` (array)

### `list_jobs` (~151 tokens)

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

Input parameters:

- `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`.

Output parameters:

- `jobs` (array)

### `list_keys` (~64 tokens)

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.

Output parameters:

- `config_file` (string)
- `hint` (string)
- `keys` (array)
- `warnings` (array): Things that would hide a key or expose the file, each with its fix.

### `list_providers` (~32 tokens)

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

Output parameters:

- `providers` (array)
- `spec_errors` (array): Override files that failed to load (the built-in spec stays active). Fix them with check_spec.

### `list_recipes` (~24 tokens)

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

Output parameters:

- `recipes` (array)

### `list_references` (~62 tokens)

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

Input parameters:

- `kind`
- `limit` (integer|null): Default 20.
- `query` (string|null): Substring of name, description or tags.

Output parameters:

- `references` (array)

### `list_snippets` (~15 tokens)

List snippets with their text.

Output parameters:

- `snippets` (array)

### `mux_audio` (~86 tokens)

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

Input parameters:

- `audio_asset_id` (string, required): 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, required)

Output parameters:

- `asset`
- `hint` (string)
- `job_id` (string): The local job that recorded this operation (provider `local`, model = operation, cost 0).

### `overlay` (~166 tokens)

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

Input parameters:

- `base_asset_id` (string, required): Image or video to draw on (e.g. a generated plate).
- `overlay_asset_id` (string, required): 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.

Output parameters:

- `asset`
- `hint` (string)
- `job_id` (string): The local job that recorded this operation (provider `local`, model = operation, cost 0).

### `preflight` (~281 tokens)

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.

Input parameters:

- `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.

Output parameters:

- `checks` (array)
- `estimate_usd` (number|null)
- `hint` (string)
- `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): No check failed: generate with the same arguments would be submitted (or wait for its parent jobs).
- `requests` (array): 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): Library assets (or video frames) that would be uploaded to the provider first.
- `waits_on` (array): Running jobs named by `{{job:…}}` that the job would wait for.

### `reframe` (~125 tokens)

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.

Input parameters:

- `aspect` (string, required): Target aspect ratio "W:H", e.g. "9:16", "1:1", "16:9", or a number like "1.91".
- `asset_id` (string, required): An image or video asset.
- `mode`: `crop` (default): cut the edges away, centered. `pad`: add black bars.
- `save_to`

Output parameters:

- `asset`
- `hint` (string)
- `job_id` (string): The local job that recorded this operation (provider `local`, model = operation, cost 0).

### `remove_from_collection` (~68 tokens)

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

Input parameters:

- `asset_ids` (array, required)
- `collection` (string, required): Collection name; add_to_collection creates it when missing.
- `description` (string|null): add_to_collection only: replaces the collection's description.

Output parameters:

- `assets` (integer)
- `created_at` (integer)
- `description` (string)
- `name` (string)

### `remove_from_reference` (~69 tokens)

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

Input parameters:

- `asset_ids` (array, required)
- `reference` (string, required): Reference name or id.
- `role` (string|null): add_to_reference only: role of these assets, e.g. "front", "side", "palette".

Output parameters:

- `assets` (array): In order; `{{ref:<name>}}` in a string field uses the first one.
- `created_at` (integer)
- `description` (string)
- `id` (string)
- `kind`
- `name` (string)
- `tags` (string)
- `updated_at` (integer)

### `reset_spec` (~42 tokens)

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

Input parameters:

- `provider` (string, required): Provider key from list_providers, e.g. "fal".

Output parameters:

- `key` (string)
- `removed` (string): The override file that was removed.
- `source` (string): `builtin` if a built-in spec is active again, `none` if the provider no longer exists.

### `review_asset` (~144 tokens)

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.

Input parameters:

- `asset_ids` (array, required)
- `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`.

Output parameters:

- `assets` (array)

### `run_recipe` (~375 tokens)

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.

Input parameters:

- `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, required)
- `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}.

### `save_recipe` (~514 tokens)

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.

Input parameters:

- `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, required): 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.

Output parameters:

- `budget` (string|null): Budget every run counts against unless the call names another.
- `created_at` (integer)
- `description` (string)
- `input`: Generation input with `{{var:<name>}}` (and any other placeholders) left in place.
- `model` (string|null)
- `name` (string)
- `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): A chain started by one run_recipe, in order; run_recipe returns the last step's job.
- `updated_at` (integer)
- `variables` (object)

### `save_reference` (~169 tokens)

Create or update a reference: a named, typed set of assets (character, style, product, environment, composition, brand) plus a description, reused in generate input as "{{ref:<name>}}". asset_ids, when given, replaces its assets.

Input parameters:

- `asset_ids` (array|null): When given, the reference holds exactly these assets in this order (first = default image).
- `description` (string|null): What must stay consistent, e.g. "red-haired woman, cyberpunk jacket".
- `kind`: Required when creating: character, style, product, environment, composition or brand.
- `name` (string, required): Unique name, used as "{{ref:<name>}}" in generate input, e.g. "main-character".
- `tags` (string|null): Space-separated tags.

Output parameters:

- `assets` (array): In order; `{{ref:<name>}}` in a string field uses the first one.
- `created_at` (integer)
- `description` (string)
- `id` (string)
- `kind`
- `name` (string)
- `tags` (string)
- `updated_at` (integer)

### `save_snippet` (~121 tokens)

Create or replace a snippet: a reusable prompt block (brand style, series paragraph, voice) used as "{{snippet:<name>}}" inside any string of generate input.

Input parameters:

- `description` (string|null)
- `name` (string, required): Used as "{{snippet:<name>}}" inside any string of generate input, e.g. "brand-style".
- `text` (string, required): The prompt block, e.g. "soft window light, muted teal palette, 35mm". May contain "{{ref:<name>.description}}" but not other snippets.

Output parameters:

- `description` (string)
- `name` (string)
- `text` (string)
- `updated_at` (integer)

### `save_spec` (~74 tokens)

Save a spec as a local override in <home>/providers/ (or add a new provider). Active immediately in every AI Media Router process; returns the check result.

Input parameters:

- `spec` (string, required): Full TOML text of the spec. Saved as `<home>/providers/<key>.toml`, active immediately in every process.

Output parameters:

- `check`
- `key` (string)
- `path` (string)
- `replaced` (string): What the new file replaced: `builtin`, `override` or `nothing` (new provider).

### `search_assets` (~117 tokens)

Search the local asset library by prompt, tags, description and review notes, optionally within one collection, by review status or minimum rating.

Input parameters:

- `collection` (string|null): Only assets in this collection.
- `limit` (integer|null): Default 20.
- `min_rating` (integer|null): Only assets rated at least this (1-5).
- `query` (string|null): Words matched against the generation prompt, tags, description and review notes; omit to list the newest assets.
- `status`: Only assets with this review status.

Output parameters:

- `assets` (array)

### `search_prices` (~239 tokens)

Find video (USD per second) and image (USD per image) generation offers across providers, cheapest first; kind filters one of them. Offers carry provider_key and offer_id for generate.

Input parameters:

- `configured_only` (boolean|null): Only offers from providers whose keys are set. Default: true when any key is set.
- `kind` (string|null): `video` (USD per second) or `image` (USD per image); both when omitted, videos first.
- `limit` (integer|null): Default 20.
- `mode` (string|null): Video: `generate`, `video input`, `motion / avatar`; image: `generate`, `edit`, `generate + edit`.
- `provider` (string|null): Substring of the provider name, e.g. "kie".
- `quality` (string|null): Image quality tier, e.g. "high".
- `query` (string|null): Substring of the model family or name, e.g. "seedance" or "kling 2.6".
- `res` (string|null): Resolution, e.g. "720p" or "1080p".

Output parameters:

- `hint` (string)
- `offers` (array)
- `total` (integer): Matches before `limit` was applied.

### `set_budget` (~82 tokens)

Create a spending cap in USD, or change its limit. Jobs started with generate {budget, estimated_cost_usd} count against it and are refused when they would exceed it.

Input parameters:

- `limit_usd` (number, required): Spending cap in USD.
- `name` (string, required): Budget name, e.g. a session or project; passed as `budget` to generate.

Output parameters:

- `created_at` (integer)
- `jobs` (integer)
- `limit_usd` (number)
- `name` (string)
- `remaining_usd` (number)
- `spent_usd` (number): Reported USD cost of finished jobs, plus the estimate of running jobs and of jobs whose provider reports no USD cost.

### `similar_assets` (~121 tokens)

Find assets similar in meaning to a text query or to another asset (embeddings of prompt, tags and description). Needs EMBEDDINGS_API_KEY or EMBEDDINGS_URL in config; search_assets is the keyword search.

Input parameters:

- `asset_id` (string|null): Find assets similar to this one.
- `collection` (string|null): Only assets in this collection.
- `limit` (integer|null): Default 20.
- `query` (string|null): Text to find similar assets for, e.g. "red-haired woman in neon rain". Or use asset_id.

Output parameters:

- `assets` (array): Most similar first.

### `test_key` (~73 tokens)

Check one provider's key with the spec's free [auth_check] request (account, balance or model list): accepted, refused, not_configured, not_supported or inconclusive. Spends nothing and never returns the key.

Input parameters:

- `provider` (string, required): Provider key from list_providers, e.g. "fal".

Output parameters:

- `detail` (string|null): Why a check that could not decide came back this way; the key is redacted.
- `hint` (string)
- `provider` (string)
- `result` (string): `not_configured`, `not_supported`, `accepted`, `refused` or `inconclusive`.

### `trim` (~72 tokens)

Cut a video or audio asset to start..end seconds; returns the new asset.

Input parameters:

- `asset_id` (string, required): A video or audio asset.
- `end` (number|null): Seconds; default the end of the file.
- `save_to`
- `start` (number|null): Seconds; default 0.

Output parameters:

- `asset`
- `hint` (string)
- `job_id` (string): The local job that recorded this operation (provider `local`, model = operation, cost 0).

### `update_asset` (~65 tokens)

Replace an asset's tags and/or description (both are searched by search_assets).

Input parameters:

- `asset_id` (string, required)
- `description` (string|null): Replaces the description; searched like prompt and tags.
- `tags` (string|null): Replaces the tags (space-separated).

Output parameters:

- `bytes` (integer)
- `created_at` (integer)
- `description` (string): 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): 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): 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): Reviewer's notes (what is wrong or right); searched like prompt, tags and description.
- `status` (string): Review gate: `draft` (default), `approved` or `rejected`; set with review_asset.
- `tags` (string)
- `width` (integer|null): Pixels, from ffprobe; null for audio, or until ffprobe has read the file.

### `upload_asset` (~77 tokens)

Upload a library asset to a provider; returns the reference (URL, file id or data URI) and where to put it in generate input. Usually not needed: "{{asset:<id>}}" in generate input does this automatically.

Input parameters:

- `asset_id` (string, required)
- `provider` (string, required): Provider key, e.g. "kie".

Output parameters:

- `kind` (string): `url`, `data_uri` or `id`.
- `reference`: The value to put into generation `input` (URL, data URI, or provider file id).
- `usage` (string): Where `reference` goes in `input`.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#diagnostics

## Score history

- 2026-11-05: 31
- 2026-11-04: 31
- 2026-11-03: 31
- 2026-11-02: 41
- 2026-11-01: 40

## 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.

## Links

- GitHub Container Registry: https://ghcr.io/jutsuhq/ai-media-router
- Changelog RSS feed: https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.xml
- Changelog JSON feed: https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.json
- HTML version of this page: https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router
