{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T17:57:40.606Z","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router","markdownUrl":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.md","server":{"slug":"jutsuhq-ai-media-router","name":"AI Media Router","registryName":"io.github.jutsuhq/ai-media-router","description":"Image and video generation across 40+ providers with your own keys, plus a local asset library.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"ghcr-io-jutsuhq-ai-media-router","type":"oci","identifier":"ghcr.io/jutsuhq/ai-media-router","withdrawn":false,"url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router","version":"v0.1.0","transport":"stdio","scoredAt":"2026-11-05T10:58:55.892Z"},"score":{"total":31,"tier":"low","status":"scored","weekDelta":null,"history":[{"date":"2026-11-05","total":31},{"date":"2026-11-04","total":31},{"date":"2026-11-03","total":31},{"date":"2026-11-02","total":41},{"date":"2026-11-01","total":40}]},"categories":[{"name":"Supply Chain Security","score":0,"verdict":"unverified","reasons":["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."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"ecosystem_unsupported"}},{"code":"cve.inconclusive","args":{"reason":"registry_unavailable"}},{"code":"installscript.inconclusive","args":{"reason":"no_install_concept"}},{"code":"dephealth.inconclusive","args":{"reason":"registry_unavailable"}}]},{"name":"Provenance & Transparency","score":0,"verdict":"fail","reasons":["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."],"codes":[{"code":"provenance.repo_http_error","args":{"status":"404"}},{"code":"provenance.inconclusive","args":{"reason":"registry_unreachable"}},{"code":"license.inconclusive","args":{"reason":"registry_unreachable"}},{"code":"maintenance.inconclusive","args":{"reason":"registry_unreachable"}},{"code":"disclosure.repo_inconclusive","args":{"reason":"repo_not_visible"}}]},{"name":"Schema Quality & AI Usability","score":80,"verdict":"fail","reasons":["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."],"codes":[{"code":"schema.descriptions","args":{"pct":"100"}},{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_lean","args":{"avg":"86","items":"99","tools":"55","tokens":"8591","resources":"44"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":95,"verdict":"partial","reasons":["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."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"81"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"name":"Tool Safety","score":75,"verdict":"fail","reasons":["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."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_undeclared","args":{"pct":"0","tool":"delete_asset","verb":"delete","declared":"none","annotated":"0","destructive":"8"}},{"code":"toolsafety.manipulation_clean","args":{"units":"57","judged":"57"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":["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.","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.","Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"malware":[],"components":[{"slug":"ghcr-io-jutsuhq-ai-media-router","type":"oci","identifier":"ghcr.io/jutsuhq/ai-media-router","withdrawn":false,"score":31,"current":true,"url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router","markdownUrl":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.md"}],"facts":[{"label":"Registry","value":"oci"},{"label":"Package","value":"ghcr.io/jutsuhq/ai-media-router"},{"label":"Version","value":"v0.1.0"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"add_to_collection","title":null,"description":"Add assets to a collection, creating it when missing.","inputs":[{"name":"asset_ids","type":"array","required":true,"description":null},{"name":"collection","type":"string","required":true,"description":"Collection name; add_to_collection creates it when missing."},{"name":"description","type":"string|null","required":false,"description":"add_to_collection only: replaces the collection's description."}],"outputs":[{"name":"assets","type":"integer","required":true,"description":null},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":63},{"name":"add_to_reference","title":null,"description":"Append assets to a reference, optionally with a role (e.g. \"side\").","inputs":[{"name":"asset_ids","type":"array","required":true,"description":null},{"name":"reference","type":"string","required":true,"description":"Reference name or id."},{"name":"role","type":"string|null","required":false,"description":"add_to_reference only: role of these assets, e.g. \"front\", \"side\", \"palette\"."}],"outputs":[{"name":"assets","type":"array","required":true,"description":"In order; `{{ref:<name>}}` in a string field uses the first one."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"kind","type":null,"required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"tags","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":74},{"name":"cancel_job","title":null,"description":"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.","inputs":[{"name":"job_id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":56},{"name":"check_spec","title":null,"description":"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.","inputs":[{"name":"input","type":"object|null","required":false,"description":"Generation input for the rendered requests."},{"name":"model","type":"string|null","required":false,"description":"With `model`, also render the exact HTTP requests a generation would send (nothing is sent)."},{"name":"provider","type":"string|null","required":false,"description":"Check the loaded spec of this provider. Omit when passing `spec`."},{"name":"spec","type":"string|null","required":false,"description":"TOML text of a candidate spec (not saved). Format: docs/provider-spec.md."},{"name":"vars","type":"object|null","required":false,"description":"Values for variables later steps capture from earlier responses (e.g. {\"id\": \"task-123\"})."}],"outputs":[{"name":"error","type":"string|null","required":false,"description":"Parse or validation error (TOML line/column, field, pointer or template variable)."},{"name":"fixtures","type":"array","required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"key","type":"string|null","required":false,"description":null},{"name":"requests","type":"array","required":true,"description":"Rendered requests, credentials shown as `<ENV_NAME>`; only when `model` is given."},{"name":"valid","type":"boolean","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":161},{"name":"concat","title":null,"description":"Join two or more video assets in order into one MP4 (first clip's size, 30 fps); returns the new asset.","inputs":[{"name":"asset_ids","type":"array","required":true,"description":"Two or more video assets in playback order. Output takes the first clip's size (others are\nletterboxed) at 30 fps; clips without sound get silence when any clip has sound."},{"name":"save_to","type":null,"required":false,"description":null}],"outputs":[{"name":"asset","type":null,"required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"job_id","type":"string","required":true,"description":"The local job that recorded this operation (provider `local`, model = operation, cost 0)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":86},{"name":"delete_asset","title":null,"description":"Delete an asset's file and library entry; it leaves every reference and collection. Jobs keep their record of it.","inputs":[{"name":"asset_id","type":"string","required":true,"description":null}],"outputs":[{"name":"bytes","type":"integer","required":true,"description":null},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":"Free text set with update_asset; searched together with prompt and tags."},{"name":"duration_secs","type":"number|null","required":false,"description":"Length of a video or audio file."},{"name":"has_audio","type":"boolean|null","required":false,"description":"Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed)."},{"name":"height","type":"integer|null","required":false,"description":null},{"name":"id","type":"string","required":true,"description":"Content hash prefix; identical files share one id."},{"name":"job_id","type":"string|null","required":false,"description":"First job that produced this file; get_lineage shows every job around it."},{"name":"mime","type":"string|null","required":false,"description":null},{"name":"path","type":"string","required":true,"description":"Absolute path of the stored file."},{"name":"preview","type":"string|null","required":false,"description":"JPEG preview (scaled image or first video frame); null without ffmpeg or for audio."},{"name":"prompt","type":"string|null","required":false,"description":null},{"name":"rating","type":"integer|null","required":false,"description":"1-5, set with review_asset."},{"name":"review_notes","type":"string","required":true,"description":"Reviewer's notes (what is wrong or right); searched like prompt, tags and description."},{"name":"status","type":"string","required":true,"description":"Review gate: `draft` (default), `approved` or `rejected`; set with review_asset."},{"name":"tags","type":"string","required":true,"description":null},{"name":"width","type":"integer|null","required":false,"description":"Pixels, from ffprobe; null for audio, or until ffprobe has read the file."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":39},{"name":"delete_budget","title":null,"description":"Delete a budget; its jobs stay in the history.","inputs":[{"name":"name","type":"string","required":true,"description":null}],"outputs":[{"name":"created_at","type":"integer","required":true,"description":null},{"name":"jobs","type":"integer","required":true,"description":null},{"name":"limit_usd","type":"number","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"remaining_usd","type":"number","required":true,"description":null},{"name":"spent_usd","type":"number","required":true,"description":"Reported USD cost of finished jobs, plus the estimate of running jobs and of jobs whose\nprovider reports no USD cost."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":26},{"name":"delete_recipe","title":null,"description":"Delete a recipe; jobs made from it stay in the history.","inputs":[{"name":"name","type":"string","required":true,"description":null}],"outputs":[{"name":"budget","type":"string|null","required":false,"description":"Budget every run counts against unless the call names another."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"input","type":null,"required":false,"description":"Generation input with `{{var:<name>}}` (and any other placeholders) left in place."},{"name":"model","type":"string|null","required":false,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices that prices every run; single-generation recipes only."},{"name":"provider","type":"string|null","required":false,"description":"Single-generation recipe: provider, model and input. Absent when the recipe has `steps`."},{"name":"save_to","type":null,"required":false,"description":"Where the outputs are filed; with steps, the outputs of the final steps (those no later step uses)."},{"name":"steps","type":"array","required":true,"description":"A chain started by one run_recipe, in order; run_recipe returns the last step's job."},{"name":"updated_at","type":"integer","required":true,"description":null},{"name":"variables","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":28},{"name":"delete_reference","title":null,"description":"Delete a reference; its assets stay in the library.","inputs":[{"name":"reference","type":"string","required":true,"description":"Reference name or id."}],"outputs":[{"name":"assets","type":"array","required":true,"description":"In order; `{{ref:<name>}}` in a string field uses the first one."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"kind","type":null,"required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"tags","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":30},{"name":"delete_snippet","title":null,"description":"Delete a snippet; inputs that still use it fail with the list of known snippets.","inputs":[{"name":"name","type":"string","required":true,"description":null}],"outputs":[{"name":"description","type":"string","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"text","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":33},{"name":"doctor","title":null,"description":"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.","inputs":[{"name":"online","type":"boolean|null","required":false,"description":"Also send one GET to every configured provider's base URL (any HTTP answer counts as reachable)."}],"outputs":[{"name":"checks","type":"array","required":true,"description":null},{"name":"ok","type":"boolean","required":true,"description":"No check failed."},{"name":"providers","type":"array","required":true,"description":"Configured providers and local overrides."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":94},{"name":"estimate_cost","title":null,"description":"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.","inputs":[{"name":"input","type":"object","required":false,"description":"Generation input. Seconds are read from duration, duration_seconds, duration_secs, seconds, video_length\nor length; the output count from num_images, n, num_outputs, image_count, number_of_images, sa…"},{"name":"model","type":"string|null","required":false,"description":"The provider's model id, as passed to generate. Required unless `recipe` is given."},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices to price; without it only the history median is used."},{"name":"provider","type":"string|null","required":false,"description":"Provider key, e.g. \"kie\". Required unless `recipe` is given."},{"name":"recipe","type":"string|null","required":false,"description":"Price a run_recipe instead: each step from its own estimated_cost_usd or offer_id (edits cost 0), and the sum."},{"name":"reuse","type":"boolean|null","required":false,"description":"As in generate: report (with cost 0) when the run would return an identical job's outputs."},{"name":"vars","type":"object|null","required":false,"description":"The recipe's variables, as in run_recipe."}],"outputs":[{"name":"estimate_usd","type":"number|null","required":false,"description":"Expected cost in USD; null when none could be computed (`note` says why)."},{"name":"formula","type":"string|null","required":false,"description":"How `estimate_usd` was computed."},{"name":"history","type":null,"required":false,"description":"Median USD cost of finished jobs on this provider and model that reported USD."},{"name":"note","type":"string|null","required":false,"description":null},{"name":"offer","type":null,"required":false,"description":"The offer priced, when `offer_id` was given."},{"name":"read","type":"object","required":true,"description":"Input fields the formula read, by path, with the values found."},{"name":"reuse","type":null,"required":false,"description":"The job whose outputs generate would return instead of submitting (`reuse`); the estimate is then 0."},{"name":"steps","type":"array","required":true,"description":"For a recipe with steps: each step's share of `estimate_usd`, in order."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":298},{"name":"export_collection","title":null,"description":"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.","inputs":[{"name":"collection","type":"string","required":true,"description":null},{"name":"only_approved","type":"boolean|null","required":false,"description":"Only assets approved with review_asset."}],"outputs":[{"name":"assets","type":"integer","required":true,"description":null},{"name":"bytes","type":"integer","required":true,"description":null},{"name":"path","type":"string","required":true,"description":"The ZIP file: `files/` (assets), `previews/`, and `collection.json` with metadata (review status,\nrating, notes), the job behind each asset (provider, model, input, cost) and its references."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":95},{"name":"extract_frame","title":null,"description":"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.","inputs":[{"name":"asset_id","type":"string","required":true,"description":"A video asset."},{"name":"at","type":null,"required":false,"description":"\"first\", \"last\", or seconds from the start (e.g. 1.5). Default \"first\"."},{"name":"save_to","type":null,"required":false,"description":"File the new asset into a collection and/or reference."}],"outputs":[{"name":"asset","type":null,"required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"job_id","type":"string","required":true,"description":"The local job that recorded this operation (provider `local`, model = operation, cost 0)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":97},{"name":"generate","title":null,"description":"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.","inputs":[{"name":"budget","type":"string|null","required":false,"description":"Count this job against a budget (set_budget); the job is refused if it would exceed it."},{"name":"estimated_cost_usd","type":"number|null","required":false,"description":"Expected cost in USD. With `budget` and no value, it is computed like estimate_cost."},{"name":"input","type":"object","required":true,"description":"Model input passed to the provider unchanged (prompt, image_urls, duration, ...). Library files go in\nas placeholders, uploaded through the provider before submit: \"{{asset:<id>}}\" or \"{{ref:<name>}}…"},{"name":"model","type":"string","required":false,"description":"The provider's own model id or endpoint, e.g. \"kling-2.6/image-to-video\" on kie. Required unless `recipe` is given."},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices this job buys; its price × the duration or image count in `input` becomes\nthe job's estimate when `estimated_cost_usd` is not given."},{"name":"provider","type":"string","required":false,"description":"Provider key, e.g. \"kie\". See get_provider for what `model` means there. Required unless `recipe` is given."},{"name":"recipe","type":"string|null","required":false,"description":"A saved single-generation recipe used as a preset: its provider, model, input (variables filled,\ndefaults applied), save_to, offer_id and budget are the defaults. Fields given here win; `input` merge…"},{"name":"retry","type":null,"required":false,"description":"Resubmit after a retryable failure (rate_limit, provider_error, network, timeout): {attempts: 1-5, delay_secs}.\nOff by default, since a provider may bill a failed attempt."},{"name":"reuse","type":"boolean|null","required":false,"description":"true: when a job with the same provider, model and input (library files compared by content) is done and\nits outputs are still in the library, or is still running, return those outputs as a new job a…"},{"name":"save_to","type":null,"required":false,"description":"File the outputs into a collection and/or an existing reference when the job finishes."},{"name":"vars","type":"object|null","required":false,"description":"The recipe's variables, as in run_recipe."}],"outputs":[],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":702},{"name":"generate_batch","title":null,"description":"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.","inputs":[{"name":"defaults","type":null,"required":false,"description":"Shared by every job; items override provider, model, save_to and estimated_cost_usd, and merge\ntheir input over this input."},{"name":"items","type":"array|null","required":false,"description":"One entry per variant, e.g. the same prompt on several provider/model pairs (a bench)."},{"name":"label","type":"string|null","required":false,"description":"Free text to recognise the batch by."},{"name":"matrix","type":"object|null","required":false,"description":"Top-level input fields to vary: {\"aspect_ratio\": [\"16:9\", \"9:16\"], \"seed\": [1, 2]}. Every item runs\nwith every combination. At most 100 jobs in total."},{"name":"recipe","type":"string|null","required":false,"description":"Run a saved recipe: its provider, model, input and save_to are the defaults, and `matrix` keys,\n`defaults.vars` and item `vars` fill its \"{{var:<name>}}\" variables instead of input fields."}],"outputs":[{"name":"counts","type":"object","required":true,"description":"Jobs per status (`waiting`, `running`, `done`, `failed`)."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"jobs","type":"array","required":true,"description":"In submission order."},{"name":"label","type":"string|null","required":false,"description":null},{"name":"outputs","type":"array","required":true,"description":"Every output of the batch's finished jobs, in job order; for a recipe run only the final steps' outputs."},{"name":"recipe","type":"string|null","required":false,"description":"The recipe this batch is one run of."},{"name":"refused","type":"array","required":true,"description":"Jobs that were never created (bad placeholder, unknown reference), by their position in the batch."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":251},{"name":"get_asset","title":null,"description":"Metadata and local path of one asset.","inputs":[{"name":"asset_id","type":"string","required":true,"description":null}],"outputs":[{"name":"bytes","type":"integer","required":true,"description":null},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":"Free text set with update_asset; searched together with prompt and tags."},{"name":"duration_secs","type":"number|null","required":false,"description":"Length of a video or audio file."},{"name":"has_audio","type":"boolean|null","required":false,"description":"Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed)."},{"name":"height","type":"integer|null","required":false,"description":null},{"name":"id","type":"string","required":true,"description":"Content hash prefix; identical files share one id."},{"name":"job_id","type":"string|null","required":false,"description":"First job that produced this file; get_lineage shows every job around it."},{"name":"mime","type":"string|null","required":false,"description":null},{"name":"path","type":"string","required":true,"description":"Absolute path of the stored file."},{"name":"preview","type":"string|null","required":false,"description":"JPEG preview (scaled image or first video frame); null without ffmpeg or for audio."},{"name":"prompt","type":"string|null","required":false,"description":null},{"name":"rating","type":"integer|null","required":false,"description":"1-5, set with review_asset."},{"name":"review_notes","type":"string","required":true,"description":"Reviewer's notes (what is wrong or right); searched like prompt, tags and description."},{"name":"status","type":"string","required":true,"description":"Review gate: `draft` (default), `approved` or `rejected`; set with review_asset."},{"name":"tags","type":"string","required":true,"description":null},{"name":"width","type":"integer|null","required":false,"description":"Pixels, from ffprobe; null for audio, or until ffprobe has read the file."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":24},{"name":"get_batch","title":null,"description":"A batch's jobs per status, each job's outputs, and every output file. wait_secs blocks until all finish (max 50).","inputs":[{"name":"batch_id","type":"string","required":true,"description":null},{"name":"wait_secs","type":"integer|null","required":false,"description":"Block up to this many seconds (max 50) for every job to finish. Default 0."}],"outputs":[{"name":"counts","type":"object","required":true,"description":"Jobs per status (`waiting`, `running`, `done`, `failed`)."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"jobs","type":"array","required":true,"description":"In submission order."},{"name":"label","type":"string|null","required":false,"description":null},{"name":"outputs","type":"array","required":true,"description":"Every output of the batch's finished jobs, in job order; for a recipe run only the final steps' outputs."},{"name":"recipe","type":"string|null","required":false,"description":"The recipe this batch is one run of."},{"name":"refused","type":"array","required":true,"description":"Jobs that were never created (bad placeholder, unknown reference), by their position in the batch."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":73},{"name":"get_job","title":null,"description":"Job status, provider progress and stored result files. wait_secs blocks until done (max 50); debug=true adds the raw provider exchanges.","inputs":[{"name":"debug","type":"boolean|null","required":false,"description":"Include `trace`: the exact request and raw provider response of each step. Use it when a job\nfailed or stays running, to see which pointer or URL in the spec is wrong."},{"name":"job_id","type":"string","required":true,"description":null},{"name":"wait_secs","type":"integer|null","required":false,"description":"Block up to this many seconds (max 50) for the job to finish. Default 0."}],"outputs":[],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":118},{"name":"get_lineage","title":null,"description":"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.","inputs":[{"name":"asset_id","type":"string","required":true,"description":null}],"outputs":[{"name":"ancestors","type":"array","required":true,"description":"What the asset was made from, nearest first."},{"name":"asset","type":null,"required":true,"description":null},{"name":"collections","type":"array","required":true,"description":null},{"name":"descendants","type":"array","required":true,"description":"What was made from it, nearest first."},{"name":"hint","type":"string","required":true,"description":null},{"name":"references","type":"array","required":true,"description":"References and collections that hold this asset."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":51},{"name":"get_provider","title":null,"description":"How to call one provider: model id format, an example generate call, docs link, upload support, known quirks.","inputs":[{"name":"provider","type":"string","required":true,"description":"Provider key from list_providers, e.g. \"fal\"."}],"outputs":[{"name":"catalog","type":"array","required":true,"description":"Provider names in the price catalog that this provider serves."},{"name":"configured","type":"boolean","required":true,"description":null},{"name":"cost_unit","type":"string|null","required":false,"description":"Unit of job `cost` for this provider, if known."},{"name":"docs","type":"string","required":true,"description":"Where to look up model ids and input fields."},{"name":"example","type":null,"required":false,"description":"A complete generate call known to match this spec; adapt model and input."},{"name":"key","type":"string","required":true,"description":null},{"name":"missing_env","type":"array","required":true,"description":null},{"name":"model_hint","type":"string","required":true,"description":"What to pass as `model` and `input` for this provider."},{"name":"name","type":"string","required":true,"description":null},{"name":"notes","type":"string|null","required":false,"description":null},{"name":"source","type":"string","required":true,"description":"`builtin` or `override`."},{"name":"spec_path","type":"string","required":true,"description":"Spec file: `providers/<key>.toml` in the repo, or the override path."},{"name":"upload","type":"string|null","required":false,"description":"How references are uploaded: multipart, json, put, post_form, data_uri, or null if not supported."},{"name":"upload_usage","type":"string|null","required":false,"description":"How to put an upload_asset result into `input`, when it is not a plain URL."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":52},{"name":"get_recipe","title":null,"description":"One recipe by name.","inputs":[{"name":"name","type":"string","required":true,"description":null}],"outputs":[{"name":"budget","type":"string|null","required":false,"description":"Budget every run counts against unless the call names another."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"input","type":null,"required":false,"description":"Generation input with `{{var:<name>}}` (and any other placeholders) left in place."},{"name":"model","type":"string|null","required":false,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices that prices every run; single-generation recipes only."},{"name":"provider","type":"string|null","required":false,"description":"Single-generation recipe: provider, model and input. Absent when the recipe has `steps`."},{"name":"save_to","type":null,"required":false,"description":"Where the outputs are filed; with steps, the outputs of the final steps (those no later step uses)."},{"name":"steps","type":"array","required":true,"description":"A chain started by one run_recipe, in order; run_recipe returns the last step's job."},{"name":"updated_at","type":"integer","required":true,"description":null},{"name":"variables","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":20},{"name":"get_reference","title":null,"description":"One reference by name or id, with its assets in order and their local paths.","inputs":[{"name":"reference","type":"string","required":true,"description":"Reference name or id."}],"outputs":[{"name":"assets","type":"array","required":true,"description":"In order; `{{ref:<name>}}` in a string field uses the first one."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"kind","type":null,"required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"tags","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":36},{"name":"get_spec","title":null,"description":"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.","inputs":[{"name":"provider","type":"string","required":true,"description":"Provider key from list_providers, e.g. \"fal\"."}],"outputs":[{"name":"builtin_text","type":"string|null","required":false,"description":"The built-in spec, when an override replaces it."},{"name":"fixtures","type":"array","required":true,"description":"Recorded request/response fixtures replayed by check_spec."},{"name":"key","type":"string","required":true,"description":null},{"name":"path","type":"string","required":true,"description":null},{"name":"source","type":"string","required":true,"description":"`builtin` or `override`."},{"name":"text","type":"string","required":true,"description":"The active spec (TOML). Edit it and pass it to check_spec, then save_spec."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":60},{"name":"get_stats","title":null,"description":"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.","inputs":[{"name":"collection","type":"string|null","required":false,"description":"Only jobs that read from or wrote into this collection."},{"name":"model","type":"string|null","required":false,"description":"The provider's model id."},{"name":"provider","type":"string|null","required":false,"description":"Provider key, e.g. \"kie\"."}],"outputs":[{"name":"hint","type":"string","required":true,"description":null},{"name":"models","type":"array","required":true,"description":"Per provider and model, most used first."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":102},{"name":"import_asset","title":null,"description":"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.","inputs":[{"name":"path","type":"string","required":true,"description":"Absolute path of a local file."},{"name":"prompt","type":"string|null","required":false,"description":"Description used for search; defaults to the prompt stored in the file by ai-media-router."},{"name":"tags","type":"string|null","required":false,"description":"Space-separated tags, e.g. \"character hero\"."}],"outputs":[{"name":"bytes","type":"integer","required":true,"description":null},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":"Free text set with update_asset; searched together with prompt and tags."},{"name":"duration_secs","type":"number|null","required":false,"description":"Length of a video or audio file."},{"name":"has_audio","type":"boolean|null","required":false,"description":"Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed)."},{"name":"height","type":"integer|null","required":false,"description":null},{"name":"hint","type":"string|null","required":false,"description":null},{"name":"id","type":"string","required":true,"description":"Content hash prefix; identical files share one id."},{"name":"job_id","type":"string|null","required":false,"description":"First job that produced this file; get_lineage shows every job around it."},{"name":"mime","type":"string|null","required":false,"description":null},{"name":"missing_parents","type":"array","required":true,"description":"Parents named in the provenance that are not in this library; importing them links them up."},{"name":"path","type":"string","required":true,"description":"Absolute path of the stored file."},{"name":"preview","type":"string|null","required":false,"description":"JPEG preview (scaled image or first video frame); null without ffmpeg or for audio."},{"name":"prompt","type":"string|null","required":false,"description":null},{"name":"provenance","type":null,"required":false,"description":"Provenance found in the file (written by ai-media-router); null for other files."},{"name":"rating","type":"integer|null","required":false,"description":"1-5, set with review_asset."},{"name":"review_notes","type":"string","required":true,"description":"Reviewer's notes (what is wrong or right); searched like prompt, tags and description."},{"name":"status","type":"string","required":true,"description":"Review gate: `draft` (default), `approved` or `rejected`; set with review_asset."},{"name":"tags","type":"string","required":true,"description":null},{"name":"width","type":"integer|null","required":false,"description":"Pixels, from ffprobe; null for audio, or until ffprobe has read the file."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":113},{"name":"list_budgets","title":null,"description":"Budgets with their limit, spent and remaining USD.","inputs":[],"outputs":[{"name":"budgets","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":21},{"name":"list_collections","title":null,"description":"List collections (projects) with their asset counts. search_assets {collection} lists one's assets.","inputs":[],"outputs":[{"name":"collections","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":28},{"name":"list_jobs","title":null,"description":"Generation history, newest first, with provider, model, input, cost, input assets and outputs. Filter by reference, collection, status or error_kind.","inputs":[{"name":"batch","type":"string|null","required":false,"description":"Only jobs of this batch (generate_batch)."},{"name":"collection","type":"string|null","required":false,"description":"Only jobs that read from or wrote into this collection."},{"name":"error_kind","type":null,"required":false,"description":"Only failed jobs of this kind, e.g. \"moderation\" or \"rate_limit\"."},{"name":"limit","type":"integer|null","required":false,"description":"Default 20."},{"name":"reference","type":"string|null","required":false,"description":"Only jobs that used this reference (name or id) as input or filed outputs into it."},{"name":"status","type":"string|null","required":false,"description":"`running`, `done` or `failed`."}],"outputs":[{"name":"jobs","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":151},{"name":"list_keys","title":null,"description":"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.","inputs":[],"outputs":[{"name":"config_file","type":"string","required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"keys","type":"array","required":true,"description":null},{"name":"warnings","type":"array","required":true,"description":"Things that would hide a key or expose the file, each with its fix."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":64},{"name":"list_providers","title":null,"description":"List providers, whether their API keys are set, and whether each runs the built-in spec or a local override.","inputs":[],"outputs":[{"name":"providers","type":"array","required":true,"description":null},{"name":"spec_errors","type":"array","required":true,"description":"Override files that failed to load (the built-in spec stays active). Fix them with check_spec."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":32},{"name":"list_recipes","title":null,"description":"List recipes with their provider, model, input or steps, and variables.","inputs":[],"outputs":[{"name":"recipes","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":24},{"name":"list_references","title":null,"description":"List references, most recently changed first; filter by kind or a substring of name, description or tags.","inputs":[{"name":"kind","type":null,"required":false,"description":null},{"name":"limit","type":"integer|null","required":false,"description":"Default 20."},{"name":"query","type":"string|null","required":false,"description":"Substring of name, description or tags."}],"outputs":[{"name":"references","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":62},{"name":"list_snippets","title":null,"description":"List snippets with their text.","inputs":[],"outputs":[{"name":"snippets","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":15},{"name":"mux_audio","title":null,"description":"Put an audio track (audio asset or another video's sound) under a video, replacing its sound; returns the new asset.","inputs":[{"name":"audio_asset_id","type":"string","required":true,"description":"An audio asset, or a video whose sound is taken. Replaces the video's sound; padded with\nsilence or cut to the video's length."},{"name":"save_to","type":null,"required":false,"description":null},{"name":"video_asset_id","type":"string","required":true,"description":null}],"outputs":[{"name":"asset","type":null,"required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"job_id","type":"string","required":true,"description":"The local job that recorded this operation (provider `local`, model = operation, cost 0)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":86},{"name":"overlay","title":null,"description":"Draw an image (packshot, logo) over an image or video at x, y pixels, optionally scaled to width; returns the new asset.","inputs":[{"name":"base_asset_id","type":"string","required":true,"description":"Image or video to draw on (e.g. a generated plate)."},{"name":"overlay_asset_id","type":"string","required":true,"description":"Image drawn on top (e.g. a real packshot or a logo; PNG transparency is kept)."},{"name":"save_to","type":null,"required":false,"description":null},{"name":"width","type":"integer|null","required":false,"description":"Scale the overlay to this width in pixels, keeping its aspect. Default: its own size."},{"name":"x","type":"integer|null","required":false,"description":"Left edge in pixels of the base (get_asset shows its width and height). Default 0."},{"name":"y","type":"integer|null","required":false,"description":"Top edge in pixels of the base. Default 0."}],"outputs":[{"name":"asset","type":null,"required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"job_id","type":"string","required":true,"description":"The local job that recorded this operation (provider `local`, model = operation, cost 0)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":166},{"name":"preflight","title":null,"description":"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.","inputs":[{"name":"budget","type":"string|null","required":false,"description":"With a recipe of steps, the sum of every step's estimate is checked against it."},{"name":"estimated_cost_usd","type":"number|null","required":false,"description":null},{"name":"input","type":"object","required":false,"description":"As in generate."},{"name":"model","type":"string|null","required":false,"description":"As in generate; required unless `recipe` is given."},{"name":"offer_id","type":"string|null","required":false,"description":null},{"name":"provider","type":"string|null","required":false,"description":"As in generate; required unless `recipe` is given."},{"name":"recipe","type":"string|null","required":false,"description":"Check a run_recipe instead: every step of the recipe, their summed estimate and the budget for the sum."},{"name":"retry","type":null,"required":false,"description":null},{"name":"reuse","type":"boolean|null","required":false,"description":"As in generate: report (with cost 0) when the run would return an identical job's outputs."},{"name":"save_to","type":null,"required":false,"description":null},{"name":"vars","type":"object|null","required":false,"description":"The recipe's variables, as in run_recipe."}],"outputs":[{"name":"checks","type":"array","required":true,"description":null},{"name":"estimate_usd","type":"number|null","required":false,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"input","type":null,"required":false,"description":"The input as the provider would receive it; uploads are shown as `<upload of asset …>`. For a recipe\nwith steps, each step's input by step name."},{"name":"ready","type":"boolean","required":true,"description":"No check failed: generate with the same arguments would be submitted (or wait for its parent jobs)."},{"name":"requests","type":"array","required":true,"description":"The HTTP requests generate would send, secrets masked."},{"name":"reuse","type":null,"required":false,"description":"The job whose outputs generate would return at no cost instead of submitting (`reuse`)."},{"name":"uploads","type":"array","required":true,"description":"Library assets (or video frames) that would be uploaded to the provider first."},{"name":"waits_on","type":"array","required":true,"description":"Running jobs named by `{{job:…}}` that the job would wait for."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":281},{"name":"reframe","title":null,"description":"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.","inputs":[{"name":"aspect","type":"string","required":true,"description":"Target aspect ratio \"W:H\", e.g. \"9:16\", \"1:1\", \"16:9\", or a number like \"1.91\"."},{"name":"asset_id","type":"string","required":true,"description":"An image or video asset."},{"name":"mode","type":null,"required":false,"description":"`crop` (default): cut the edges away, centered. `pad`: add black bars."},{"name":"save_to","type":null,"required":false,"description":null}],"outputs":[{"name":"asset","type":null,"required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"job_id","type":"string","required":true,"description":"The local job that recorded this operation (provider `local`, model = operation, cost 0)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":125},{"name":"remove_from_collection","title":null,"description":"Remove assets from a collection (not from the library); an emptied collection disappears.","inputs":[{"name":"asset_ids","type":"array","required":true,"description":null},{"name":"collection","type":"string","required":true,"description":"Collection name; add_to_collection creates it when missing."},{"name":"description","type":"string|null","required":false,"description":"add_to_collection only: replaces the collection's description."}],"outputs":[{"name":"assets","type":"integer","required":true,"description":null},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":68},{"name":"remove_from_reference","title":null,"description":"Remove assets from a reference; they stay in the library.","inputs":[{"name":"asset_ids","type":"array","required":true,"description":null},{"name":"reference","type":"string","required":true,"description":"Reference name or id."},{"name":"role","type":"string|null","required":false,"description":"add_to_reference only: role of these assets, e.g. \"front\", \"side\", \"palette\"."}],"outputs":[{"name":"assets","type":"array","required":true,"description":"In order; `{{ref:<name>}}` in a string field uses the first one."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"kind","type":null,"required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"tags","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":69},{"name":"reset_spec","title":null,"description":"Delete a provider's local override so the built-in spec is used again.","inputs":[{"name":"provider","type":"string","required":true,"description":"Provider key from list_providers, e.g. \"fal\"."}],"outputs":[{"name":"key","type":"string","required":true,"description":null},{"name":"removed","type":"string","required":true,"description":"The override file that was removed."},{"name":"source","type":"string","required":true,"description":"`builtin` if a built-in spec is active again, `none` if the provider no longer exists."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":42},{"name":"review_asset","title":null,"description":"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.","inputs":[{"name":"asset_ids","type":"array","required":true,"description":null},{"name":"notes","type":"string|null","required":false,"description":"What is right or wrong with it, e.g. \"extra fingers, logo warped\"; replaces earlier notes, searched by search_assets."},{"name":"rating","type":"integer|null","required":false,"description":"1-5."},{"name":"status","type":null,"required":false,"description":"`approved` (ready to use), `rejected` (skipped by {{ref:…}} expansion) or `draft`."}],"outputs":[{"name":"assets","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":144},{"name":"run_recipe","title":null,"description":"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.","inputs":[{"name":"budget","type":"string|null","required":false,"description":"With steps, the sum of every step's estimate is admitted before anything is submitted."},{"name":"estimated_cost_usd","type":"number|null","required":false,"description":"With `budget` and no value, it is computed like estimate_cost. Not for a recipe with steps: set it per step."},{"name":"name","type":"string","required":true,"description":null},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices; prices the run from the filled input. Not for a recipe with steps: set it per step."},{"name":"retry","type":null,"required":false,"description":"Resubmit after a retryable failure (rate_limit, provider_error, network, timeout): {attempts: 1-5, delay_secs}.\nOff by default, since a provider may bill a failed attempt."},{"name":"reuse","type":"boolean|null","required":false,"description":"true: when a job with the same provider, model and input (library files compared by content) is done and\nits outputs are still in the library, or is still running, return those outputs as a new job a…"},{"name":"save_to","type":null,"required":false,"description":"Replaces the recipe's save_to for this run (with steps: for the final steps)."},{"name":"vars","type":"object|null","required":false,"description":"Values for the recipe's variables, e.g. {\"language\": \"de\", \"duration\": 5}."}],"outputs":[],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":375},{"name":"save_recipe","title":null,"description":"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.","inputs":[{"name":"budget","type":"string|null","required":false,"description":"Budget every run counts against unless the call names another."},{"name":"chain","type":"boolean|null","required":false,"description":"With from_job / from_asset: also save the jobs that made its inputs ({{job:…}}, {{asset:…}} made by a\njob, asset ids of an edit), back to imported files and references, as earlier steps; their ids be…"},{"name":"description","type":"string|null","required":false,"description":null},{"name":"from_asset","type":"string|null","required":false,"description":"Like from_job, with the job that made this asset."},{"name":"from_job","type":"string|null","required":false,"description":"Start from this job's provider, model, input and save_to; other fields given here override them."},{"name":"input","type":"object|null","required":false,"description":"Generation input. \"{{var:<name>}}\" as a whole string becomes the variable's JSON value, inside a\nlonger string its text. Text and media placeholders ({{snippet:…}}, {{ref:…}}, {{asset:…}}) stay\nand r…"},{"name":"model","type":"string|null","required":false,"description":"Required unless from_job is given."},{"name":"name","type":"string","required":true,"description":"Unique name; saving again replaces the recipe."},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices that prices every run; single-generation recipes only."},{"name":"provider","type":"string|null","required":false,"description":"Required unless from_job is given."},{"name":"save_to","type":null,"required":false,"description":"With steps: where the final steps' outputs are filed."},{"name":"steps","type":"array|null","required":false,"description":"A chain instead of provider/model/input, run in order by one run_recipe: each step is a generation\n{name, provider, model, input} or an ffmpeg edit {name, op, input: <that tool's parameters>}. Later…"},{"name":"variables","type":"object|null","required":false,"description":"Declared variables; ones used in input but not listed here are added as required."}],"outputs":[{"name":"budget","type":"string|null","required":false,"description":"Budget every run counts against unless the call names another."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"input","type":null,"required":false,"description":"Generation input with `{{var:<name>}}` (and any other placeholders) left in place."},{"name":"model","type":"string|null","required":false,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"offer_id","type":"string|null","required":false,"description":"Offer from search_prices that prices every run; single-generation recipes only."},{"name":"provider","type":"string|null","required":false,"description":"Single-generation recipe: provider, model and input. Absent when the recipe has `steps`."},{"name":"save_to","type":null,"required":false,"description":"Where the outputs are filed; with steps, the outputs of the final steps (those no later step uses)."},{"name":"steps","type":"array","required":true,"description":"A chain started by one run_recipe, in order; run_recipe returns the last step's job."},{"name":"updated_at","type":"integer","required":true,"description":null},{"name":"variables","type":"object","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":514},{"name":"save_reference","title":null,"description":"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.","inputs":[{"name":"asset_ids","type":"array|null","required":false,"description":"When given, the reference holds exactly these assets in this order (first = default image)."},{"name":"description","type":"string|null","required":false,"description":"What must stay consistent, e.g. \"red-haired woman, cyberpunk jacket\"."},{"name":"kind","type":null,"required":false,"description":"Required when creating: character, style, product, environment, composition or brand."},{"name":"name","type":"string","required":true,"description":"Unique name, used as \"{{ref:<name>}}\" in generate input, e.g. \"main-character\"."},{"name":"tags","type":"string|null","required":false,"description":"Space-separated tags."}],"outputs":[{"name":"assets","type":"array","required":true,"description":"In order; `{{ref:<name>}}` in a string field uses the first one."},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"kind","type":null,"required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"tags","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":169},{"name":"save_snippet","title":null,"description":"Create or replace a snippet: a reusable prompt block (brand style, series paragraph, voice) used as \"{{snippet:<name>}}\" inside any string of generate input.","inputs":[{"name":"description","type":"string|null","required":false,"description":null},{"name":"name","type":"string","required":true,"description":"Used as \"{{snippet:<name>}}\" inside any string of generate input, e.g. \"brand-style\"."},{"name":"text","type":"string","required":true,"description":"The prompt block, e.g. \"soft window light, muted teal palette, 35mm\". May contain\n\"{{ref:<name>.description}}\" but not other snippets."}],"outputs":[{"name":"description","type":"string","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"text","type":"string","required":true,"description":null},{"name":"updated_at","type":"integer","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":121},{"name":"save_spec","title":null,"description":"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.","inputs":[{"name":"spec","type":"string","required":true,"description":"Full TOML text of the spec. Saved as `<home>/providers/<key>.toml`, active immediately in every process."}],"outputs":[{"name":"check","type":null,"required":true,"description":null},{"name":"key","type":"string","required":true,"description":null},{"name":"path","type":"string","required":true,"description":null},{"name":"replaced","type":"string","required":true,"description":"What the new file replaced: `builtin`, `override` or `nothing` (new provider)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":74},{"name":"search_assets","title":null,"description":"Search the local asset library by prompt, tags, description and review notes, optionally within one collection, by review status or minimum rating.","inputs":[{"name":"collection","type":"string|null","required":false,"description":"Only assets in this collection."},{"name":"limit","type":"integer|null","required":false,"description":"Default 20."},{"name":"min_rating","type":"integer|null","required":false,"description":"Only assets rated at least this (1-5)."},{"name":"query","type":"string|null","required":false,"description":"Words matched against the generation prompt, tags, description and review notes; omit to list the newest assets."},{"name":"status","type":null,"required":false,"description":"Only assets with this review status."}],"outputs":[{"name":"assets","type":"array","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":117},{"name":"search_prices","title":null,"description":"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.","inputs":[{"name":"configured_only","type":"boolean|null","required":false,"description":"Only offers from providers whose keys are set. Default: true when any key is set."},{"name":"kind","type":"string|null","required":false,"description":"`video` (USD per second) or `image` (USD per image); both when omitted, videos first."},{"name":"limit","type":"integer|null","required":false,"description":"Default 20."},{"name":"mode","type":"string|null","required":false,"description":"Video: `generate`, `video input`, `motion / avatar`; image: `generate`, `edit`, `generate + edit`."},{"name":"provider","type":"string|null","required":false,"description":"Substring of the provider name, e.g. \"kie\"."},{"name":"quality","type":"string|null","required":false,"description":"Image quality tier, e.g. \"high\"."},{"name":"query","type":"string|null","required":false,"description":"Substring of the model family or name, e.g. \"seedance\" or \"kling 2.6\"."},{"name":"res","type":"string|null","required":false,"description":"Resolution, e.g. \"720p\" or \"1080p\"."}],"outputs":[{"name":"hint","type":"string","required":true,"description":null},{"name":"offers","type":"array","required":true,"description":null},{"name":"total","type":"integer","required":true,"description":"Matches before `limit` was applied."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":239},{"name":"set_budget","title":null,"description":"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.","inputs":[{"name":"limit_usd","type":"number","required":true,"description":"Spending cap in USD."},{"name":"name","type":"string","required":true,"description":"Budget name, e.g. a session or project; passed as `budget` to generate."}],"outputs":[{"name":"created_at","type":"integer","required":true,"description":null},{"name":"jobs","type":"integer","required":true,"description":null},{"name":"limit_usd","type":"number","required":true,"description":null},{"name":"name","type":"string","required":true,"description":null},{"name":"remaining_usd","type":"number","required":true,"description":null},{"name":"spent_usd","type":"number","required":true,"description":"Reported USD cost of finished jobs, plus the estimate of running jobs and of jobs whose\nprovider reports no USD cost."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":82},{"name":"similar_assets","title":null,"description":"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.","inputs":[{"name":"asset_id","type":"string|null","required":false,"description":"Find assets similar to this one."},{"name":"collection","type":"string|null","required":false,"description":"Only assets in this collection."},{"name":"limit","type":"integer|null","required":false,"description":"Default 20."},{"name":"query","type":"string|null","required":false,"description":"Text to find similar assets for, e.g. \"red-haired woman in neon rain\". Or use asset_id."}],"outputs":[{"name":"assets","type":"array","required":true,"description":"Most similar first."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":121},{"name":"test_key","title":null,"description":"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.","inputs":[{"name":"provider","type":"string","required":true,"description":"Provider key from list_providers, e.g. \"fal\"."}],"outputs":[{"name":"detail","type":"string|null","required":false,"description":"Why a check that could not decide came back this way; the key is redacted."},{"name":"hint","type":"string","required":true,"description":null},{"name":"provider","type":"string","required":true,"description":null},{"name":"result","type":"string","required":true,"description":"`not_configured`, `not_supported`, `accepted`, `refused` or `inconclusive`."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":73},{"name":"trim","title":null,"description":"Cut a video or audio asset to start..end seconds; returns the new asset.","inputs":[{"name":"asset_id","type":"string","required":true,"description":"A video or audio asset."},{"name":"end","type":"number|null","required":false,"description":"Seconds; default the end of the file."},{"name":"save_to","type":null,"required":false,"description":null},{"name":"start","type":"number|null","required":false,"description":"Seconds; default 0."}],"outputs":[{"name":"asset","type":null,"required":true,"description":null},{"name":"hint","type":"string","required":true,"description":null},{"name":"job_id","type":"string","required":true,"description":"The local job that recorded this operation (provider `local`, model = operation, cost 0)."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":72},{"name":"update_asset","title":null,"description":"Replace an asset's tags and/or description (both are searched by search_assets).","inputs":[{"name":"asset_id","type":"string","required":true,"description":null},{"name":"description","type":"string|null","required":false,"description":"Replaces the description; searched like prompt and tags."},{"name":"tags","type":"string|null","required":false,"description":"Replaces the tags (space-separated)."}],"outputs":[{"name":"bytes","type":"integer","required":true,"description":null},{"name":"created_at","type":"integer","required":true,"description":null},{"name":"description","type":"string","required":true,"description":"Free text set with update_asset; searched together with prompt and tags."},{"name":"duration_secs","type":"number|null","required":false,"description":"Length of a video or audio file."},{"name":"has_audio","type":"boolean|null","required":false,"description":"Whether the file has an audio track; null until ffprobe has read it (needs ffmpeg installed)."},{"name":"height","type":"integer|null","required":false,"description":null},{"name":"id","type":"string","required":true,"description":"Content hash prefix; identical files share one id."},{"name":"job_id","type":"string|null","required":false,"description":"First job that produced this file; get_lineage shows every job around it."},{"name":"mime","type":"string|null","required":false,"description":null},{"name":"path","type":"string","required":true,"description":"Absolute path of the stored file."},{"name":"preview","type":"string|null","required":false,"description":"JPEG preview (scaled image or first video frame); null without ffmpeg or for audio."},{"name":"prompt","type":"string|null","required":false,"description":null},{"name":"rating","type":"integer|null","required":false,"description":"1-5, set with review_asset."},{"name":"review_notes","type":"string","required":true,"description":"Reviewer's notes (what is wrong or right); searched like prompt, tags and description."},{"name":"status","type":"string","required":true,"description":"Review gate: `draft` (default), `approved` or `rejected`; set with review_asset."},{"name":"tags","type":"string","required":true,"description":null},{"name":"width","type":"integer|null","required":false,"description":"Pixels, from ffprobe; null for audio, or until ffprobe has read the file."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":65},{"name":"upload_asset","title":null,"description":"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.","inputs":[{"name":"asset_id","type":"string","required":true,"description":null},{"name":"provider","type":"string","required":true,"description":"Provider key, e.g. \"kie\"."}],"outputs":[{"name":"kind","type":"string","required":true,"description":"`url`, `data_uri` or `id`."},{"name":"reference","type":null,"required":true,"description":"The value to put into generation `input` (URL, data URI, or provider file id)."},{"name":"usage","type":"string","required":true,"description":"Where `reference` goes in `input`."}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":77}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T10:58:55.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"inconclusive","label":"Inconclusive","reason":"no_trust_root","reasonLabel":"No trust root","discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-11-01","recent":[{"id":"chg_01a1a10e-f0ca-7437-a345-c6cfdf92febf","kind":"check.verdict","summary":"Source repository (pass → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0ca-7437-a345-c6cfdf92febf"},{"id":"chg_01a1a10e-f0cb-7d62-bd4b-2c948d1c514e","kind":"check.unverifiable","summary":"Provenance (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0cb-7d62-bd4b-2c948d1c514e"},{"id":"chg_01a1a10e-f0cc-7321-b543-72c74870ca99","kind":"check.unverifiable","summary":"Stability (0.03 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0cc-7321-b543-72c74870ca99"},{"id":"chg_01a1a10e-f0cc-76e7-b24a-6698128deeb9","kind":"check.unverifiable","summary":"License (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0cc-76e7-b24a-6698128deeb9"},{"id":"chg_01a1a10e-f0cc-7ab3-8a2c-ab866605e802","kind":"check.unverifiable","summary":"Security disclosure (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0cc-7ab3-8a2c-ab866605e802"},{"id":"chg_01a1a10e-f0ce-7f31-80cc-39ec5dd9f04d","kind":"check.unverifiable","summary":"Maintenance (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0ce-7f31-80cc-39ec5dd9f04d"},{"id":"chg_01a1a10e-f0cf-7477-bf02-49bd8a869813","kind":"license.changed","summary":"Licence (MIT)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0cf-7477-bf02-49bd8a869813"},{"id":"chg_01a1a10e-f0cf-7a16-bfcd-4f334590ecd5","kind":"score.total_changed","summary":"Trust score (41 → 31)","materiality":"functional","direction":"regression","scoreDelta":-10,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a1a10e-f0cf-7a16-bfcd-4f334590ecd5"},{"id":"chg_01a19b97-d67c-796f-be3b-60533d6350c2","kind":"score.total_changed","summary":"Trust score (40 → 41)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a19b97-d67c-796f-be3b-60533d6350c2"},{"id":"chg_01a19704-b0c4-72b9-bb5b-95689ebb944b","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a19704-b0c4-72b9-bb5b-95689ebb944b"},{"id":"chg_01a196ff-107d-7b4e-820a-361c05f3c74f","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router#chg-chg_01a196ff-107d-7b4e-820a-361c05f3c74f"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router/changelog.json"},"links":{"html":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router","markdown":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.md","changelogJson":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router/changelog.json","changelogRss":"https://verifymcp.io/servers/jutsuhq-ai-media-router/ghcr-io-jutsuhq-ai-media-router.xml","external":[{"label":"GitHub Container Registry","href":"https://ghcr.io/jutsuhq/ai-media-router"}]}}