Skip to main content
Glama

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 nvidia-smi, system python3 (3.9 or newer, standard library only), git, tar, GNU coreutils, FFmpeg and FFprobe on PATH, an OpenSSH server, and a Fusion environment with a working CUDA provider

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

<checkout>

Absolute path of your clone on the client machine

gpu-host

SSH alias of the GPU workstation

/srv/visomaster

Workstation media root: every media file and job artifact lives below it

/srv/visomaster/fusion

Fusion checkout

/srv/visomaster/mcp

Deployment directory (VISOMASTER_REMOTE)

/srv/visomaster/runtime/mcp

Job state, uploads and logs

/srv/visomaster/bin/fusion-runner

Runner that starts Fusion's Python

  1. Clone and install the client.

    git clone https://github.com/<owner>/visomaster-mcp.git <checkout>
    cd <checkout>
    uv sync --locked

    The server runs from this clone (an editable install). health_check compares the deployed workstation files with the clone's remote/ directory, and reports code_matches: null if those files are absent.

  2. Configure SSH. Add a Host gpu-host entry with key authentication to ~/.ssh/config, then confirm that noninteractive access works without a prompt:

    ssh -T -o BatchMode=yes gpu-host true
  3. Install 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 in app/processors/models_data.py.

    git clone https://github.com/VisoMasterFusion/VisoMaster-Fusion /srv/visomaster/fusion
    git -C /srv/visomaster/fusion checkout f2d6f5ebe190b631ee5c8972332083cf7f8a3e72

    Confirm that Fusion itself can use your GPU before continuing.

  4. Install FFmpeg and FFprobe on the workstation, for example sudo apt install ffmpeg. They must be on the PATH of noninteractive SSH sessions and of the runner.

  5. Create the runner. Copy config/fusion-runner.example.sh to /srv/visomaster/bin/fusion-runner, adapt it, and make it executable. See Runner.

  6. Create the remote configuration. Copy config/remote-config.example.json to /srv/visomaster/mcp/remote-config.json and adapt it (see Remote configuration). Deployment never writes this file.

  7. Deploy the workstation files from the clone:

    export VISOMASTER_HOST=gpu-host VISOMASTER_REMOTE=/srv/visomaster/mcp
    scripts/deploy.sh

    The 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 against remote-config.json, and only then points the remote symlink 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.

  8. Register the client. Every registration must set VISOMASTER_HOST and VISOMASTER_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 visomaster

    Put the server name before the -e options; -e accepts 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 documentation

    Claude Desktop: merge the entry from config/claude-desktop.json into mcpServers in its configuration file, keeping your other entries, and restart it. The example files contain placeholders and do not work unmodified. Claude Code MCP documentation

  9. Check the installation. In a new client session, call health_check and get_settings. Expect config_error: null, compatible: true, code_matches: true, your GPU in gpus, and every entry in checks true.

  10. Run a first job. Upload or choose a short clip and a reference image, run detect_faces, view contact.jpg, submit a preview, inspect it, then render about 12 frames (see Typical workflow). scripts/smoke_gpu.py automates 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:

  1. Record health_check output (app, state, input_root, gpu) and back up your client registration files.

  2. Add VISOMASTER_HOST and VISOMASTER_REMOTE with your current values to every client registration. The old version reads the same variables, so nothing changes yet.

  3. Write <VISOMASTER_REMOTE>/remote-config.json with the values from step 1: media_root = input_root, fusion_dir = app, state_dir = state, gpu = gpu, and runner = your existing launcher. Leave out lock_dir so the GPU lock stays where it was. The old release ignores this file.

  4. Update the clone, run uv sync --locked, wait until list_jobs shows nothing queued or running, then run scripts/deploy.sh. Its preflight refuses to switch if the new release rejects your configuration.

  5. Check that health_check shows the same paths and GPU, config_error: null and code_matches: true, that list_jobs still 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

VISOMASTER_HOST

yes

none

SSH alias or host name; letters, digits and ._@:%[]-, no leading -

VISOMASTER_REMOTE

yes

none

Absolute workstation deployment directory; letters, digits and _./-, no ..

VISOMASTER_REMOTE_PYTHON

no

python3

Workstation interpreter for control commands: a command name or an absolute path

VISOMASTER_SSH

no

ssh

Client SSH program

VISOMASTER_DOWNLOADS

no

~/Downloads/visomaster-mcp

Local directory for download_artifact

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

version

yes

1

media_root

yes

Existing absolute directory. Media paths and references must resolve inside it

fusion_dir

no

<media_root>/tools/visomaster-fusion

Fusion checkout containing .git and its layout definition files

state_dir

no

<media_root>/runtime/visomaster-mcp

Inside media_root (uploads and artifacts are reused as inputs), not inside fusion_dir; created with mode 0700

gpu

no

"0"

GPU index as a string, without leading zeros. Sets CUDA_VISIBLE_DEVICES (with CUDA_DEVICE_ORDER=PCI_BUS_ID) and names the lock gpu-<index>.lock

runner

yes

Path, or list of arguments, whose first element is an absolute executable. Never passed through a shell

lock_dir

no

state_dir

Existing writable directory for gpu-<index>.lock

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:

  • exec Fusion'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, setpgid or daemonize. Cancellation signals the worker's process group, which any helper process must stay in

  • keep inherited file descriptors (the GPU lock) and the environment, and leave CUDA_VISIBLE_DEVICES unchanged

  • exit 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

health_check

Configuration, installed revision, deployed release and code match, GPU inventory, runner and dependency checks

get_settings

Supported Fusion settings with effective defaults and limits

upload_media

Stream a local image/video into private workstation storage, reusing identical uploads

inspect_media

FFprobe metadata for a workstation file

detect_faces

Queue detection at a selected frame and produce reference crops, or sample up to 64 frames (sample_frames or frames) and group faces into identities with one reference crop each

submit_swap

Queue a frame/image preview or a video render with explicit face mappings

normalize_media

Queue a CPU-only FFmpeg conversion to a render-ready video (CFR, zero start, even dimensions, rotation applied); does not wait for the GPU

job_status

State, frame progress and result manifest; wait_seconds (≤ 50) long-polls for the next change; log tail on request or failure

list_jobs

Recent job summaries shared across clients (kind, media, frames, timing, status, progress), filterable by status and kind, limit up to 200

cancel_job

Request cancellation, then poll for terminal state

delete_job

Permanently remove a terminal job's directory, logs and artifacts

prune_storage

Report (dry run, default) or delete old terminal jobs, unused uploads and crash leftovers

view_artifact

Return a completed job's PNG/JPEG as an inline MCP image, such as a detection's contact.jpg grid of labelled crops

download_artifact

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

  1. Call health_check and get_settings.

  2. Use an absolute workstation media path under media_root, or upload a local file with upload_media.

  3. Call detect_faces on a representative frame, or with sample_frames (for example 16) to find everyone who appears across a video. Call job_status with wait_seconds: 50 until completed, then inspect the returned crops with view_artifact; contact.jpg shows them all in one labelled grid.

  4. Use the selected crop's or identity's reference_path as target_face. Supply one or more reference images of the replacement identity as source_faces. Each reference image must contain exactly one detected face.

  5. Submit a preview, inspect its image, then submit a short render. After reviewing that clip, submit the full frame range.

  6. Follow the job with job_status and wait_seconds, then download result.mp4 or result.png after 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

VISOMASTER_HOST and VISOMASTER_REMOTE not set

Add both variables to the client registration (setup step 8) and start a new session

Check VISOMASTER_HOST (...) with: ssh ...

The alias does not resolve or key authentication failed; run the printed command until it succeeds without a prompt

Remote configuration not found at ...

Create remote-config.json in the deployment directory (setup step 6)

...: <key> ... from the configuration

Fix the named key in the named file; health_check shows config_path and config_error

VM_... is no longer read

Remove the variable from the workstation environment and put the value in remote-config.json

Fusion revision changed to ... or compatible: false

Check out the pinned revision, or qualify the new one (see Fusion revision guard)

The configured runner must exec the Fusion Python interpreter

End the runner with exec "$FUSION_PYTHON" "$@"

Cannot start the configured runner ...

Fix the runner path or its permissions

Remote configuration changed after submission ...

The file changed while the job was queued; resubmit

Preflight refused release ... from deploy.sh

The new release rejects remote-config.json; the error names the problem, and the active release is unchanged

checks shows nvidia-smi, ffmpeg or ffprobe false

Install it, or put it on the PATH of noninteractive SSH sessions

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

The 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 24

Pass --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 tools
cancel_jobA

Request cancellation of a queued/running job. Poll until its state is terminal.

NameRequiredDescriptionDefault
job_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_jobA
Destructive

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.

NameRequiredDescriptionDefault
job_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
frameNo
framesNo
job_idNo
controlsNo
media_pathYes
sample_framesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
nameNoresult.mp4
job_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_settingsA
Read-only

Return supported Fusion parameter names, defaults, choices and numeric limits.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_checkA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_mediaA
Read-only

Read video/audio codec, frame rate, dimensions and duration from a workstation file.

NameRequiredDescriptionDefault
media_pathYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_statusA
Read-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.

NameRequiredDescriptionDefault
job_idYes
include_logNo
wait_secondsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_jobsA
Read-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.

NameRequiredDescriptionDefault
kindNo
limitNo
statusNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
fpsNoOutput rate such as 25, 29.97 or '30000/1001'; default from the source
job_idNo
media_pathYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_storageA
Destructive

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.

NameRequiredDescriptionDefault
dry_runNo
older_than_daysNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
modeNopreview
frameNo
job_idNo
controlsNo
mappingsYes
max_framesNo
media_pathYes
start_frameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
local_pathYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_artifactA
Read-only

Show a completed job's PNG/JPEG crop or preview inline in Claude or Codex.

NameRequiredDescriptionDefault
nameNopreview.jpg
job_idYes

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 14 tool updatesv0.1.0
    • First observedcancel_job
    • First observeddelete_job
    • First observeddetect_faces
    • First observeddownload_artifact
    • First observedget_settings
    • First observedhealth_check
    • First observedinspect_media
    • First observedjob_status
    • First observedlist_jobs
    • First observednormalize_media
    • First observedprune_storage
    • First observedsubmit_swap
    • First observedupload_media
    • First observedview_artifact

TDQS

A3.9/5.0

Scored across 14 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables 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.
    -