VisoMaster MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@VisoMaster MCPdetect faces in uploads/interview.mp4 and send me the face crops"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
VisoMaster MCP
An MCP server that drives an existing VisoMaster Fusion installation on a Linux GPU workstation. Claude Code, Claude Desktop and Codex run the same Python stdio server on the client machine. The server sends commands to the workstation over SSH, where they run as durable background GPU jobs. It returns progress, face crops, previews and finished media.
See DESIGN.md for the architecture and VERIFICATION.md for recorded evidence and its limits.
Supported platforms
Side | Supported | Notes |
Workstation | Linux x86-64 with an NVIDIA GPU and driver | Needs |
Client | macOS (tested), Linux (expected, not verified) | Python 3.11 or newer with uv, an OpenSSH client with key authentication. Windows is not supported |
All recorded GPU evidence comes from a single installation with Maxwell-generation GPUs (compute capability 5.2, 24 GB class). Other GPUs, drivers and CUDA stacks have not been qualified.
Related MCP server: Codex Desktop Bridge
Prerequisites and optional features
Required: a Fusion checkout at the pinned revision with its Python environment, the detector, recognition and swapper models (Yolov8, Inswapper128 and its ArcFace recognizer by default), FFmpeg/FFprobe, and SSH key access from the client.
Optional: face restoration (GFPGAN-v1.4 was qualified), expression restoration (LivePortrait models), and Fusion's sequential tracking (ByteTrack and landmark smoothing, off by default). These only need their Fusion models to be present.
Fusion revision guard
The adapter imports Fusion's own processing classes, so it is tied to one Fusion commit: f2d6f5ebe190b631ee5c8972332083cf7f8a3e72 (declared as REVISION in remote/common.py). GPU jobs refuse to run if the checkout is at another commit or has tracked local changes under app/, and health_check reports compatible: false.
To qualify another revision, inspect the installed pipeline at that revision (the processors, worker and layout definitions the adapter calls), run the test suite, run scripts/smoke_gpu.py on the target hardware, record the evidence in VERIFICATION.md, and only then change REVISION. Never relax or bypass the guard without that qualification.
Setup
The examples below use placeholders. Replace each one with your own value.
Placeholder | Meaning |
| Absolute path of your clone on the client machine |
| SSH alias of the GPU workstation |
| Workstation media root: every media file and job artifact lives below it |
| Fusion checkout |
| Deployment directory ( |
| Job state, uploads and logs |
| Runner that starts Fusion's Python |
Clone and install the client.
git clone https://github.com/<owner>/visomaster-mcp.git <checkout> cd <checkout> uv sync --lockedThe server runs from this clone (an editable install).
health_checkcompares the deployed workstation files with the clone'sremote/directory, and reportscode_matches: nullif those files are absent.Configure SSH. Add a
Host gpu-hostentry with key authentication to~/.ssh/config, then confirm that noninteractive access works without a prompt:ssh -T -o BatchMode=yes gpu-host trueInstall Fusion at the pinned revision on the workstation, following Fusion's README at that commit ("Non-Portable Installation"): clone it, check out the revision, create its Python 3.12 environment, install its requirements file for your GPU generation, and run
python download_models.py, which downloads the models listed inapp/processors/models_data.py.git clone https://github.com/VisoMasterFusion/VisoMaster-Fusion /srv/visomaster/fusion git -C /srv/visomaster/fusion checkout f2d6f5ebe190b631ee5c8972332083cf7f8a3e72Confirm that Fusion itself can use your GPU before continuing.
Install FFmpeg and FFprobe on the workstation, for example
sudo apt install ffmpeg. They must be on thePATHof noninteractive SSH sessions and of the runner.Create the runner. Copy config/fusion-runner.example.sh to
/srv/visomaster/bin/fusion-runner, adapt it, and make it executable. See Runner.Create the remote configuration. Copy config/remote-config.example.json to
/srv/visomaster/mcp/remote-config.jsonand adapt it (see Remote configuration). Deployment never writes this file.Deploy the workstation files from the clone:
export VISOMASTER_HOST=gpu-host VISOMASTER_REMOTE=/srv/visomaster/mcp scripts/deploy.shThe script validates these variables exactly as the server does, uploads the three standard-library files into a new directory under
releases/, runs the new release's health check againstremote-config.json, and only then points theremotesymlink at it. It keeps the five newest releases. Jobs keep the release they were submitted with. It refuses to run while jobs are queued or running; wait for them rather than using--force, because pruning can remove a release a queued job still needs.Register the client. Every registration must set
VISOMASTER_HOSTandVISOMASTER_REMOTE; there are no defaults.Claude Code:
claude mcp add --scope user --transport stdio visomaster \ -e VISOMASTER_HOST=gpu-host -e VISOMASTER_REMOTE=/srv/visomaster/mcp \ -- <checkout>/.venv/bin/visomaster-mcp claude mcp get visomasterPut the server name before the
-eoptions;-eaccepts several values and would otherwise consume the name.Codex: run
codex mcp add visomaster --env VISOMASTER_HOST=gpu-host --env VISOMASTER_REMOTE=/srv/visomaster/mcp -- <checkout>/.venv/bin/visomaster-mcp, or adapt config/codex.toml. Codex MCP documentationClaude Desktop: merge the entry from config/claude-desktop.json into
mcpServersin its configuration file, keeping your other entries, and restart it. The example files contain placeholders and do not work unmodified. Claude Code MCP documentationCheck the installation. In a new client session, call
health_checkandget_settings. Expectconfig_error: null,compatible: true,code_matches: true, your GPU ingpus, and every entry incheckstrue.Run a first job. Upload or choose a short clip and a reference image, run
detect_faces, viewcontact.jpg, submit apreview, inspect it, then render about 12 frames (see Typical workflow).scripts/smoke_gpu.pyautomates this check.
Upgrading an existing installation
Earlier versions had built-in defaults for the SSH host, deployment directory, media root and runner, and read VM_BASE, VM_APP, VM_STATE and VM_GPU on the workstation. Now nothing is assumed. Upgrade in this order, so that new client sessions keep working throughout:
Record
health_checkoutput (app,state,input_root,gpu) and back up your client registration files.Add
VISOMASTER_HOSTandVISOMASTER_REMOTEwith your current values to every client registration. The old version reads the same variables, so nothing changes yet.Write
<VISOMASTER_REMOTE>/remote-config.jsonwith the values from step 1:media_root=input_root,fusion_dir=app,state_dir=state,gpu=gpu, andrunner= your existing launcher. Leave outlock_dirso the GPU lock stays where it was. The old release ignores this file.Update the clone, run
uv sync --locked, wait untillist_jobsshows nothing queued or running, then runscripts/deploy.sh. Its preflight refuses to switch if the new release rejects your configuration.Check that
health_checkshows the same paths and GPU,config_error: nullandcode_matches: true, thatlist_jobsstill lists earlier jobs, and that a short smoke run completes.
To roll back, point remote at the previous release on the workstation (cd <VISOMASTER_REMOTE> && ln -sfn releases/<previous> remote.next && mv -T remote.next remote), check out the previous client version, and restore the registration backups if needed. The old release ignores remote-config.json, so it can stay.
Configuration reference
Client environment
Set these in the MCP client registration. They are validated on the first tool call, so tool discovery works even before they are set.
Variable | Required | Default | Meaning and validation |
| yes | none | SSH alias or host name; letters, digits and |
| yes | none | Absolute workstation deployment directory; letters, digits and |
| no |
| Workstation interpreter for control commands: a command name or an absolute path |
| no |
| Client SSH program |
| no |
| Local directory for |
SSH calls use BatchMode=yes and share one multiplexed connection through ~/.ssh/visomaster-%C, which persists for 120 seconds after the last call. Nothing relies on SSH environment forwarding or remote shell profiles.
Remote configuration
<VISOMASTER_REMOTE>/remote-config.json is read by every workstation process: control commands, detached supervisors and GPU workers. Each process finds it relative to its own code, so all clients and reconnects see the same settings. VM_CONFIG (an absolute path) overrides the location; it exists for tests and unusual layouts. Unknown keys are rejected.
Key | Required | Default | Rules |
| yes |
| |
| yes | Existing absolute directory. Media paths and references must resolve inside it | |
| no |
| Fusion checkout containing |
| no |
| Inside |
| no |
| GPU index as a string, without leading zeros. Sets |
| yes | Path, or list of arguments, whose first element is an absolute executable. Never passed through a shell | |
| no |
| Existing writable directory for |
Several deployments on one host that share a GPU must use the same lock_dir and the same gpu index, so their jobs serialize on one lock file. A deployment with its own lock_dir does not coordinate with others. The legacy VM_BASE, VM_APP, VM_STATE and VM_GPU variables are no longer read; if one is set to a different value, the workstation reports an error instead of ignoring it.
Each job records the SHA-256 of the effective configuration. If the file is changed, made invalid or removed while a job is queued, the job fails with an error asking you to resubmit, rather than running with different settings.
Runner
The supervisor starts each GPU job as <runner...> <release>/engine.py <job directory>, with CUDA_VISIBLE_DEVICES and the job's configuration identity in the environment. The runner prepares Fusion's environment and must:
execFusion's Python interpreter, so the worker remains the supervisor's direct child (otherwise jobs fail with "The configured runner must exec the Fusion Python interpreter")not call
setsid,setpgidor daemonize. Cancellation signals the worker's process group, which any helper process must stay inkeep inherited file descriptors (the GPU lock) and the environment, and leave
CUDA_VISIBLE_DEVICESunchangedexit with the worker's status
config/fusion-runner.example.sh adds the CUDA libraries installed as wheels inside Fusion's environment to LD_LIBRARY_PATH. If Fusion's environment needs nothing extra, the interpreter itself is a valid runner: "runner": ["/srv/visomaster/fusion/.venv/bin/python"].
Tools
Tool | Behavior |
| Configuration, installed revision, deployed release and code match, GPU inventory, runner and dependency checks |
| Supported Fusion settings with effective defaults and limits |
| Stream a local image/video into private workstation storage, reusing identical uploads |
| FFprobe metadata for a workstation file |
| Queue detection at a selected frame and produce reference crops, or sample up to 64 frames ( |
| Queue a frame/image preview or a video render with explicit face mappings |
| Queue a CPU-only FFmpeg conversion to a render-ready video (CFR, zero start, even dimensions, rotation applied); does not wait for the GPU |
| State, frame progress and result manifest; |
| Recent job summaries shared across clients (kind, media, frames, timing, status, progress), filterable by |
| Request cancellation, then poll for terminal state |
| Permanently remove a terminal job's directory, logs and artifacts |
| Report (dry run, default) or delete old terminal jobs, unused uploads and crash leftovers |
| Return a completed job's PNG/JPEG as an inline MCP image, such as a detection's |
| Stream a completed artifact to the client |
Multi-frame detection embeds every detected face with the configured recognition model and groups faces greedily, largest first, into identities. A face joins the identity whose mean embedding scores highest on Fusion's similarity scale (50 + 50 × cosine similarity, the scale SimilarityThresholdSlider uses) if that score reaches the slider's default of 60. Two faces from the same frame never share an identity. Each identity reports its appearances, frames, up to five sample boxes and a representative crop: the largest of its five largest faces whose crop re-detects as exactly one face (reference_verified).
Typical workflow
Call
health_checkandget_settings.Use an absolute workstation media path under
media_root, or upload a local file withupload_media.Call
detect_faceson a representative frame, or withsample_frames(for example 16) to find everyone who appears across a video. Calljob_statuswithwait_seconds: 50untilcompleted, then inspect the returned crops withview_artifact;contact.jpgshows them all in one labelled grid.Use the selected crop's or identity's
reference_pathastarget_face. Supply one or more reference images of the replacement identity assource_faces. Each reference image must contain exactly one detected face.Submit a
preview, inspect its image, then submit a shortrender. After reviewing that clip, submit the full frame range.Follow the job with
job_statusandwait_seconds, then downloadresult.mp4orresult.pngafter completion.
Renders reject variable frame rate video, video whose timestamps do not start at zero, odd frame dimensions and rotation metadata. When a render fails for one of these reasons, call normalize_media with the same media_path (optionally fps, such as 25 or "30000/1001"), wait for the job, and use its result's media_path (the job's normalized.mp4 artifact) for detection, preview and rendering. Frame indices then refer to the normalized timeline.
Example submit_swap arguments:
{
"job_id": "shot01-preview-v1",
"media_path": "/srv/visomaster/media/clip.mp4",
"mode": "preview",
"frame": 24,
"mappings": [
{
"target_face": "/srv/visomaster/runtime/mcp/jobs/detection01/artifacts/face-0.png",
"source_faces": ["/srv/visomaster/media/replacement.png"],
"parameters": {
"SwapModelSelection": "Inswapper128",
"SimilarityThresholdSlider": 60,
"FaceRestorerEnableToggle": false,
"FaceExpressionEnableBothToggle": false
}
}
]
}For video, use mode="render", start_frame and max_frames. A null max_frames processes through the end. Frame indices start at zero. Give each intended job a stable job_id so a retried submission returns the same job. Reusing an ID with changed settings is rejected. Submit a new ID to retry a failed or cancelled job.
Storage
Job state, logs and artifacts live in <state_dir>/jobs/JOB_ID. Uploaded media lives in <state_dir>/uploads, named by SHA-256 so identical uploads share one file. Terminal jobs remain until delete_job or prune_storage removes them. prune_storage deletes terminal jobs finished more than older_than_days ago (default 30), uploads untouched for that long that no queued or running job references, staging and trash directories left by crashes, and partial uploads idle for over an hour. It reports byte totals and is a dry run unless dry_run is false. Partial files from cancelled or failed jobs remain for diagnosis, and artifact tools expose only completed jobs. Each downloaded artifact has its own job subdirectory. Repeating the same download atomically replaces that local copy.
MCP GPU jobs share a process lock across all client sessions. Fusion's desktop GUI has its own GPU workload, so coordinate large GUI renders with MCP renders.
Troubleshooting
Message | Fix |
| Add both variables to the client registration (setup step 8) and start a new session |
| The alias does not resolve or key authentication failed; run the printed command until it succeeds without a prompt |
| Create |
| Fix the named key in the named file; |
| Remove the variable from the workstation environment and put the value in |
| Check out the pinned revision, or qualify the new one (see Fusion revision guard) |
| End the runner with |
| Fix the runner path or its permissions |
| The file changed while the job was queued; resubmit |
| The new release rejects |
| Install it, or put it on the |
Development
uv sync --locked
uv run --locked pytest -q
uv run --locked ruff check .
uv run --locked ruff format --check .
uv run --locked python scripts/privacy_audit.pyThe suite runs locally with temporary job backends, stdio clients and an SSH shim that clears the environment, as real SSH does. Linux-only behavior (the parent-death signal and the mv -T release switch) is exercised only on a workstation. There is no CI.
The opt-in GPU check needs a short workstation video and a single-face replacement image. It creates persistent jobs, runs detection, preview and a short render, checks idempotent submission, reconnects with a new session and cancels a running job. It uses the first detected face as its target.
uv run --locked python scripts/smoke_gpu.py \
--media /srv/visomaster/media/clip.mp4 \
--source /srv/visomaster/media/face.png \
--frames 24Pass --parameters '{"FaceRestorerEnableToggle":true,"FaceExpressionEnableBothToggle":true}' to exercise restoration.
Privacy audit
scripts/privacy_audit.py scans tracked files for home paths, email addresses, private network addresses, token formats, credential URLs, media, model weights, key files, large files and identifying Beads metadata. Install-specific values (your host alias, paths, hardware names) go in an untracked pattern file at $(git rev-parse --git-common-dir)/info/privacy-patterns, one literal or re: regex per line, shared by all worktrees of the clone; VISOMASTER_AUDIT_PATTERNS overrides the location. Findings show the file, line and rule, never the matched value. --staged scans the index and suits a pre-commit hook; --history counts matching commits. A clean result means no findings for these categories, not proof that nothing identifying remains.
Ignore rules in .gitignore keep local configuration, secrets, runtime output, media and model weights out of commits, but git add -f bypasses them; the audit catches such files. git ls-files -i -c --exclude-standard should print nothing.
License
The code in this repository is available under the MIT License.
That license covers only this repository. It does not cover and does not change the terms of anything this project uses. VisoMaster Fusion is licensed under the GNU General Public License v3.0 (see the LICENSE file in its repository). FFmpeg, PyTorch, ONNX Runtime, CUDA and the other components of Fusion's environment have their own licenses. This project does not include or redistribute Fusion, its models or FFmpeg; you obtain them yourself under their own terms.
remote/engine.py imports Fusion's modules into the same Python process on the workstation. The MIT License is compatible with the GPL, but if you distribute this adapter together with Fusion as a combined work, review the GPL's requirements for that distribution.
Model weights carry separate terms that Fusion's model list does not record. In particular, InsightFace states that models trained on its annotated data are available for non-commercial research purposes only; the Inswapper and ArcFace recognition models used here come from InsightFace. Check the terms of every model you download before using its output.
Responsible use
Face swapping can be used to deceive or to harm the people depicted. Use this project only with media you have the right to use and with the consent of the people whose likeness you process. Label synthetic media where appropriate, and follow the laws on synthetic media, privacy and likeness that apply to you. Fusion's README includes a fuller disclaimer that also applies here.
Available Tools
14 toolscancel_jobA
Request cancellation of a queued/running job. Poll until its state is terminal.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only but non-destructive, closed-world mutation. The description adds real context beyond that: cancellation is a *request* (asynchronous/graceful), not an immediate kill, and the caller must poll until a terminal state. It does not say whether a running job's in-flight work is aborted or what happens if cancellation is refused, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action leading and workflow guidance second. Every clause carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary. For a single-parameter async mutation the description covers the action, the applicable state scope, and the required follow-up behavior. It is only slightly short of complete in not clarifying the relationship to job_status and delete_job.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one required parameter with 0% schema description coverage, but the tool name and description fully explain what it is: the identifier of the job being cancelled. No format, source, or lookup guidance is provided, so the description neither compensates for the coverage gap nor adds much beyond the obvious.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Request cancellation of a queued/running job') and scopes it to jobs in non-terminal states, which implicitly separates it from delete_job and job_status. It does not explicitly name the sibling it differs from, so an agent must infer the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'queued/running job' implies the applicable condition, and the second sentence gives workflow guidance ('Poll until its state is terminal'). However, it never names job_status as the polling tool or explains when to use delete_job instead for removing a job permanently, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_jobADestructive
Permanently delete a completed, failed or cancelled job with its logs and artifacts.
Queued and running jobs are refused; cancel them and wait for a terminal state first.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's job is to add context — and it does: it names the collateral damage (logs and artifacts) and the permanence, which annotations cannot express. It also discloses a runtime refusal mode for non-terminal jobs, though it says nothing about behavior for a nonexistent or already-deleted job_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the destructive effect front-loaded before the precondition. The line break between them is slightly odd for such short text but costs nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with an output schema (so return values need no explanation), the description covers effect, permanence, and preconditions adequately. The remaining gap is error behavior outside the queued/running case, which an agent will only discover at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single job_id parameter has 0% schema description coverage, so the schema contributes nothing and the description must carry the load. It only indirectly constrains the value (must reference a terminal-state job) and gives no format, source, or idempotency guidance — an agent must infer that IDs come from list_jobs or job_status.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete), resource (job), and effect scope (with its logs and artifacts), then narrows it to terminal jobs (completed/failed/cancelled). That state qualifier alone separates it from cancel_job and list_jobs without requiring the agent to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use (jobs in a terminal state) and an explicit when-not (queued/running jobs, which are refused), plus the correct alternative path: cancel them and wait for a terminal state. This is the full when/when-not/alternative triad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
detect_facesA
Queue face detection. Poll job_status, then inspect crops with view_artifact.
Single-frame detection (frame, zero based) returns faces with crop reference paths
usable as FaceMapping.target_face. To find who appears across a video, pass
sample_frames (N evenly spaced frames) or explicit frames (at most 64) instead: faces
are grouped into identities by recognition-embedding similarity at Fusion's default
similarity threshold. Each identity lists its appearances, frames, sample boxes and a
representative crop (reference_path, verified to re-detect as one face) usable as
target_face. Both modes write contact.jpg, one grid of every crop labelled "face N" or
"id N: x" (* marks an unverified reference); view it first.
| Name | Required | Description | Default |
|---|---|---|---|
| frame | No | ||
| frames | No | ||
| job_id | No | ||
| controls | No | ||
| media_path | Yes | ||
| sample_frames | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive, closed-world call; the description goes well beyond that by disclosing the asynchronous job model, the side effect of writing contact.jpg, the grid labelling convention ('face N' / 'id N: <appearances>x', '*' for unverified references), and that reference crops are verified to re-detect as one face. That is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and next steps, then mode selection, then the shared artifact output — a logical order. It is dense with parentheticals and backticks but each clause carries information; the trailing 'view it first' instruction is slightly tacked on but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully explains the `faces` vs `identities` return shapes and the crop-reference contract for FaceMapping.target_face. It falls short only on the unexplained `job_id` and `controls` parameters, which matter for a six-parameter job-oriented tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate — and it does for `frame` (zero-based), `sample_frames` (N evenly spaced) and `frames` (explicit, at most 64). However `job_id` and `controls` are never mentioned anywhere, leaving a third of the parameters with no semantics at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Queue face detection') and immediately distinguishes two operating modes: single-frame detection returning `faces`, versus multi-frame detection (`sample_frames`/`frames`) returning grouped `identities`. An agent can tell exactly what this produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Prescribes an explicit workflow — queue, then poll `job_status`, then inspect crops via `view_artifact` — naming the sibling tools in order. It also states the selecting condition between modes: use `frame` for a single frame, use `sample_frames`/`frames` 'to find who appears across a video', with the 64-frame cap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_artifactA
Download a completed artifact into the configured local downloads directory.
Returns its absolute Mac path. Large videos stream directly to disk.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | result.mp4 | |
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=false; the description adds real context on top: it writes into a configured downloads directory, returns an absolute local path, and streams large videos to disk rather than buffering. It does not cover overwrite behavior or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and destination, then return behavior and the streaming nuance. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Return value is covered by an output schema, and the description still helpfully previews the absolute path, but with two undocumented parameters and no guidance on job state requirements or filename control, an agent lacks enough to call it confidently in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the description carries the full burden, yet it never mentions job_id or the 'name' parameter (whose default 'result.mp4' strongly implies a filename choice). An agent must guess whether 'name' sets the output filename or the artifact identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a completed artifact') and names the destination ('configured local downloads directory'), which separates it from view_artifact by implying a persisted local file rather than an in-place preview. It stops short of explicitly contrasting with view_artifact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The qualifier 'completed' implies a precondition (the job must be finished), which is useful, but there is no explicit when-to-use versus view_artifact or upload_media, and no statement about what happens if the job is still running.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settingsARead-only
Return supported Fusion parameter names, defaults, choices and numeric limits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data. The description adds only the list of what is returned, which the existing output schema already carries, and says nothing about auth requirements, caching, or whether the set is static or environment-dependent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource scope stated immediately and zero filler. Every clause (names, defaults, choices, limits) contributes distinct information about the return payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only introspection tool with a full output schema and clear annotations, the description covers what is needed to select and invoke it correctly. The only missing piece is any hint about how the returned parameter metadata relates to the other Fusion tools that consume it, which would help an agent decide when to reach for it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter meaning to add and the baseline of 4 applies. Nothing in the description misleads about inputs, and it correctly implies the call needs no arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ("Return") and enumerates the exact resource content: Fusion parameter names, defaults, choices and numeric limits. That makes the tool's output scope unambiguous and distinguishes it from the job/media/storage siblings, none of which touch parameter metadata. It stops short of 5 only because "Fusion parameter" is not defined or tied to any consumer tool in the set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use statement and no named alternatives or exclusions. The intent is strongly implied — call this to discover valid parameter names, defaults and limits before invoking other Fusion tools — but the agent must infer that discovery purpose from the content list rather than read it directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkARead-only
Check installed revision, deployed release, GPU, memory use and media/state paths.
code_matches compares deployed worker hashes with this checkout, or is null if unknown.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, non-destructive, closed-world operation. The description adds useful behavioral context by listing the checked subsystems and explaining that code_matches may be null when unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded, and free of redundant wording. Every sentence provides relevant diagnostic or output-semantics information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter diagnostic tool with an output schema, the description is complete enough: it states what is checked and clarifies the nullable code_matches field. The output schema can carry the remaining return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so parameter semantics are not applicable; the baseline for zero parameters is 4. There is no additional parameter meaning needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific diagnostic verb and enumerates the resources checked: installed revision, deployed release, GPU, memory use, and media/state paths. It is clearly a health/diagnostic tool, but it does not explicitly contrast itself with siblings such as get_settings or job_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The diagnostic purpose implies when to use it, but there is no explicit guidance on when to choose health_check versus get_settings or other sibling tools. No exclusions or preconditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_mediaARead-only
Read video/audio codec, frame rate, dimensions and duration from a workstation file.
| Name | Required | Description | Default |
|---|---|---|---|
| media_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered by structured data and the description need not repeat it. The description adds the concrete metadata fields extracted, which is useful behavioral context, but says nothing about handling of unsupported or corrupt files, and the presence of an output schema means return shape needs no explanation here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb and extracted fields up front and no filler words. It is efficient, though the metadata field list is packed into one clause without further structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-parameter inspection tool with an output schema and full annotation coverage, the description supplies enough to call it correctly. The remaining gap, support for various container or codec formats and the local-file constraint, is minor at this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter media_path, so the description must compensate and only partially does: "workstation file" implies a local filesystem path rather than a URL, job ID or artifact reference. It adds no information about path format, accepted extensions or codec support.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ("Read") with a precise resource and enumerates the exact fields returned: codec, frame rate, dimensions and duration. That clearly separates it from siblings such as normalize_media, upload_media or detect_faces, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "from a workstation file" implicitly scopes usage to local files on the machine, which hints at when the tool applies versus remote or artifact-oriented siblings. However, there is no explicit statement of when to prefer this over normalize_media, detect_faces or view_artifact, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_statusARead-only
Read durable queued/running/completed/failed/cancelled state, progress and results.
With wait_seconds > 0 the call blocks on the workstation until the job's status or progress stage differs from its value at call time, the job is terminal, or the wait elapses, then returns the current state. Frame counts advancing within a stage do not end the wait. The worker log tail is returned when include_log is true or the job failed.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| include_log | No | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only, non-destructive, closed-world safety; the description adds genuinely non-obvious behavior: blocking semantics of wait_seconds, the three conditions that end the wait, the subtlety that advancing frame counts do not end the wait, and that a log tail is returned on failure. That is exactly the extra context annotations cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the wait contract, then the log behavior, with no redundant restatement of the name or schema. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need not be explained, and the description covers the only risky behavior (blocking up to wait_seconds). For a three-parameter, read-only tool this is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has to carry the burden, and it does explain the two non-trivial parameters' semantics (wait_seconds blocking behavior, include_log triggering the log tail). Only job_id format/expectations are left unexplained, which is a minor residual gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') with a precise resource enumeration (durable queued/running/completed/failed/cancelled state, progress, results), which is far beyond a tautology. It doesn't explicitly name the sibling it differs from (list_jobs for enumeration, cancel_job for mutation), which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the wait_seconds and include_log conditions, but there is no explicit when-to-use-this-vs-list_jobs guidance or statement of preconditions (e.g., valid job_id ownership). The description doesn't route the agent to cancel_job or list_jobs as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_jobsARead-only
List the most recently updated jobs, including jobs submitted by another client.
Each summary has kind, status, media_path, frame (start_frame/max_frames for renders, fps for normalization), created/started/finished timestamps, elapsed_seconds since submission (until finish), error and progress. Use job_status for results and logs.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | ||
| limit | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, destructiveHint false, closed-world), so the description's added value is the cross-client visibility note and the summary field inventory including elapsed_seconds and progress. It does not state ordering guarantees beyond "most recently updated" or how many jobs exist before truncation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then a compact field list; every sentence is short and purposeful. The field enumeration is somewhat redundant given an output schema exists, but it reads efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the return-value inventory is largely duplicated effort, while the more consequential gap — how the three optional filters behave and whether they combine — goes unaddressed. The definition is serviceable but incomplete for a filtered listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, yet it never explains the kind, status, or limit parameters as filters. The mention of "kind" and "status" describes fields in the returned summary, not the input filters, which risks being misread as if these parameters merely echo results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the most recently updated jobs") plus a scope qualifier ("including jobs submitted by another client") that no sibling covers. It also distinguishes itself from job_status, which handles single-job results and logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to job_status "for results and logs," establishing list_jobs as the discovery/browsing tool. It lacks an explicit statement of when not to use it (e.g., for a known job ID) and does not mention pagination or recency-window limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
normalize_mediaA
Queue conversion of a video into a render-ready copy. Runs on CPU without the GPU lock.
Output is CFR H.264 (CRF 18, yuv420p) starting at zero, with rotation applied, metadata removed and odd dimensions padded by one pixel. The first audio stream becomes AAC aligned to the first video frame. Without fps, the source average rate is used, snapped to a standard rate within 2%. The completed result's media_path is usable in submit_swap.
| Name | Required | Description | Default |
|---|---|---|---|
| fps | No | Output rate such as 25, 29.97 or '30000/1001'; default from the source | |
| job_id | No | ||
| media_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (not read-only, not destructive, closed-world), while the description supplies substantial behavioral context: CPU-only execution avoiding the GPU lock, exact output codec/rate/color/pixel-format, rotation normalization, metadata stripping, odd-dimension padding, and audio stream handling. The remaining gap is that it never says whether the job is queued asynchronously and how completion is observed (presumably via job_status), which matters for a queueing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action in the first sentence, followed by a dense but entirely informative paragraph on output characteristics and the downstream consumer. Every sentence carries call-relevant information; nothing is redundant with the annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be restated, and the safety annotations cover the mutation profile. The description is complete on output format and downstream use, but the unexplained job_id parameter and unstated async/completion mechanics leave a small gap for a queued job tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description compensates only partially: it explains fps behavior in depth (source average rate default, snapped to a standard rate within 2%), which adds meaning beyond the schema's format examples. media_path and especially job_id receive no explanation at all, leaving the idempotency/resume semantics of job_id undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Queue conversion of a video') plus the shape of the result ('render-ready copy'). It also implicitly separates itself from GPU-bound siblings by noting it runs on CPU without the GPU lock, so an agent can distinguish it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the pipeline note that the result's media_path is 'usable in submit_swap', which tells an agent where this sits relative to a sibling. However, there is no explicit when-to-use/when-not guidance and no mention of inspect_media or upload_media as upstream steps, so the agent must infer the workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prune_storageADestructive
Report or delete old terminal jobs, unused uploads and files left by crashed transfers.
Removes terminal jobs finished more than older_than_days ago and uploads untouched for
that long that no queued/running job references. Dry run by default; returns the paths,
jobs and byte totals that were (or would be) deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | ||
| older_than_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false; the description adds real value on top by stating the default is a non-destructive dry run, precisely what would be removed, and what the response contains (paths, jobs, byte totals). The description is consistent with the annotations: it is a destructive tool that defaults to a safe preview.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the report-vs-delete distinction and the selection criteria, with no redundant restatement of the name, schema defaults, or annotation flags.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is destructive with only two optional parameters and an output schema, so the description's job is criteria and safety profile, both of which are covered. An agent can decide whether to call it and predict the effect without further reading.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter meaning, and it does: `older_than_days` is defined as the age since job completion and since upload last-touch, and `dry_run` is characterized as report-only versus actually deleting. It does not restate defaults or unit bounds (0-36500) that the schema already encodes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb pair and resource scope: report-or-delete of old terminal jobs, unused uploads, and orphaned transfer files. The age/terminal-state criteria make it clearly a bulk cleanup tool, distinguishable from single-item siblings like delete_job and cancel_job without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear selection conditions for what qualifies (jobs finished more than `older_than_days` ago; uploads untouched that long with no queued/running job referencing them) and states dry run is the default. It does not explicitly say when to prefer this over delete_job or cancel_job for individual items, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_swapA
Queue an image/frame preview or CFR video render using explicit identity mappings.
Preview processes frame. Render processes start_frame and at most max_frames
(None means through the end). Outputs are new job artifacts. Video output is H.264,
with the selected interval's first audio stream encoded to AAC. Preview defaults to
Inswapper128. Consult get_settings before changing parameters. GPU jobs run one at a time.
Renders reject VFR, nonzero start times, odd dimensions and rotation; use normalize_media.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| frame | No | ||
| job_id | No | ||
| controls | No | ||
| mappings | Yes | ||
| max_frames | No | ||
| media_path | Yes | ||
| start_frame | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, destructiveHint=false and openWorldHint=false; the description adds substantial context beyond that: outputs are new job artifacts (non-destructive by construction), H.264 video with AAC first-audio-stream encoding, the Inswapper128 preview default, and a real operational constraint that GPU jobs run one at a time. It does not say whether submission returns immediately with a job handle or blocks, nor what identifiers come back, which is why it stops short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well front-loaded: purpose first, then mode semantics, then output behavior, then constraints. Every sentence carries information, though the run of constraints at the end is terse to the point of feeling compressed and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose, and for an 8-parameter write tool the description covers purpose, mode semantics, output format, concurrency and rejection conditions well. The remaining gap is the trio of undocumented inputs (job_id, controls, media_path) for a schema with zero description coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden and it only partly does. It explains the mode-dependent meaning of `frame`, `start_frame` and `max_frames` (including that None means through the end), but `media_path`, `job_id`, `controls` and the structure of `mappings` receive no explanation in either place.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Queue an image/frame preview or CFR video render') and immediately splits the two modes, so an agent knows exactly which operation it is committing to. It is clearly distinct from inspection siblings like inspect_media or detect_faces, which analyze rather than queue work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly distinguishes when to use preview ('processes `frame`') versus render ('processes `start_frame` and at most `max_frames`'), names the prerequisite tool ('Consult get_settings before changing parameters'), and routes unsupported inputs elsewhere ('Renders reject VFR, nonzero start times, odd dimensions and rotation; use normalize_media'). Both the when-to-use and when-not-to-use paths are covered with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaA
Stream a Mac image/video to private workstation storage and return its remote path.
Accepts PNG, JPEG, WebP, MP4, MKV and MOV up to 20 GiB. Use this path in other tools. Uploads are content-addressed: re-uploading identical media returns the existing path.
| Name | Required | Description | Default |
|---|---|---|---|
| local_path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false, so the write-locality profile is covered. The description adds genuinely non-obvious behavior: a 20 GiB ceiling, a closed set of accepted formats, and content-addressed dedupe where re-uploading identical media returns the existing path (idempotency semantics). It does not say what happens on format/size rejection or whether uploads can be undone, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool does and its return value, then the acceptance constraints, then dedupe semantics. No sentence is redundant and constraints are grouped where an agent would look for them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter, an output schema present, and annotations covering safety, the remaining burden is behavioral, and the description covers formats, size limit, dedupe, and downstream use. The only material omission is the failure path for oversize or unsupported files, which is a minor gap given the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single required parameter local_path, so the description must carry the meaning. It partially compensates by implying the file lives on the Mac and constraining the media types that the pointed-to file may be, but never clarifies whether the path must be absolute, supports ~ expansion, or may point to a non-media file.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Stream a Mac image/video to private workstation storage and return its remote path" gives a concrete verb (stream/upload), a concrete resource (image/video media), a destination (private workstation storage), and a result (remote path). This is easily separable from siblings such as inspect_media, normalize_media, and download_artifact, which operate on already-stored media rather than ingesting it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this path in other tools" states the downstream purpose clearly, telling the agent this is the ingestion step that produces a handle for later calls. It stops short of explicit routing guidance — it does not say when NOT to use it (e.g., for already-remote URLs) or name a specific alternative sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_artifactARead-only
Show a completed job's PNG/JPEG crop or preview inline in Claude or Codex.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | preview.jpg | |
| job_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive/closed-world, so the bar is lower. The description still adds real value: the artifact is rendered inline into the conversation rather than written to a file, it targets Claude/Codex surfaces, and it only applies to completed jobs. It omits failure behavior for missing/incomplete artifacts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the key constraint ('completed job') and the output mode ('inline') both appear early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with no output schema, the description covers purpose and rendering mode adequately. It leaves the artifact-naming parameter and error cases undocumented, which matters given 0% schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It hints that 'crop or preview' variants exist (likely tied to the 'name' parameter, defaulting to preview.jpg) but never explains what 'name' should contain, whether it is a filename or key, or what job_id expects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Show ... inline') plus resource ('a completed job's PNG/JPEG crop or preview'), which distinguishes it from download_artifact (saves to disk) and inspect_media. It doesn't name a sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'a completed job's' implies the precondition that the job must be finished, which is useful gating. However, there is no explicit statement of when to pick this over download_artifact or inspect_media, and no note on what happens if the job is still running.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
cancel_job - First observed
delete_job - First observed
detect_faces - First observed
download_artifact - First observed
get_settings - First observed
health_check - First observed
inspect_media - First observed
job_status - First observed
list_jobs - First observed
normalize_media - First observed
prune_storage - First observed
submit_swap - First observed
upload_media - First observed
view_artifact
TDQS
Scored across 14 tools
Each tool targets a distinct stage of the media pipeline (upload → detect → swap → artifact) or a distinct job-lifecycle action, and the descriptions actively disambiguate near-neighbours like list_jobs vs job_status and view_artifact vs download_artifact. The only real friction is the three-way cleanup surface (cancel_job / delete_job / prune_storage), where an agent must reason about job state and age to pick correctly.
Nearly all names are snake_case verb_noun (upload_media, detect_faces, submit_swap, normalize_media, cancel_job, delete_job, prune_storage). Two exceptions — health_check and job_status — invert into noun_verb/noun_noun, but they remain readable and unambiguous.
14 tools is well inside the healthy range and each one earns its place: one entry point per pipeline stage plus a small, coherent job-control and storage-maintenance set. Nothing feels padded or missing at the count level.
Coverage is strong for the stated domain: media ingestion and inspection, face detection with identity grouping, preview and full render submission, normalization, full job lifecycle (submit/list/status/cancel/delete), and artifact viewing/downloading. Minor gaps remain — there is no per-file upload listing or deletion (only age-based prune_storage), no way to manage or persist face mappings across sessions, and no standalone job-log or artifact-listing operation outside job_status.
Maintenance
Related MCP Connectors
Render video and run AI media tasks from a single declarative JSON request.
Hosted MCP server for task-first delegation to remote workstations and workers.
Hosted MCP tools for FFmpeg-style video and audio processing through FFMPEG API.
Run multi-step AI pipelines for video, image, audio and text: upload media, run, poll results.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables MCP-compatible AI clients to remotely manage a Linux server via SSH, supporting file operations, Docker control, Git pulls, and arbitrary command execution.15,194 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients on Linux to drive the official Codex Computer Use and Browser Use runtime on a remote Windows PC over SSH, operating in the logged-in Windows desktop session.1MIT
- FlicenseNot gradedqualityBmaintenanceEnables remote management of HyperFrames video projects over Streamable HTTP, including project creation, file authoring, linting, validation, composition inspection, rendering, transcription, TTS, catalog access, documentation, and CLI operations.-
- AlicenseNot gradedqualityBmaintenanceEnables managing multiple Linux SSH servers from MCP clients, with structured filesystem operations, shell commands, durable long-running jobs, process listing, and CPU/RAM/disk/GPU status.MIT