Skip to main content
Glama

场记 / Continuity

A DeepSeek Harness plugin that gives an agent local image / speech / music / SFX generation, the transcription to hear its own output back, and a memory of what it made — the same character stays the same character across every call, and a failed generation is never allowed to pass as a success.

Runs locally. Models are lazy-loaded per request and released when idle, so when you are not using it the GPU is untouched — 0.21 GiB resident, measured. You can play a game on the same card.

Or keep only the half you want local: image generation speaks any OpenAI-shaped /v1/images/* API and transcription any OpenAI-shaped /v1/audio/transcriptions, and telling continuity-setup so means that half's engine and weights are never downloaded — the 8 GiB VRAM gate leaves with the image half. See Bring your own backend.

场记 is the continuity supervisor on a film set. Their entire job is two things: make sure the costume, hair and props match between takes, and catch the mistake on set before it is cut into the film. That is exactly this plugin's job.

What it looks like

One create_character call fixed this face. Everything after it is a single subject_image call carrying nothing but a scene — no reference image passed by hand, no re-describing the character, no retouching. These are the files the tools returned.

The blind right eye, the scar through the brow, the bone pendant and the brass gauntlet come through all seven. That is the entire point: the same description through generate_image gives you a different woman every time, which is how a game ends up with three protagonists.

Two things it did not do, kept here because a demo that only shows the wins teaches you nothing about the tool:

  • Style requests only partly take. The woodcut landed. "Pixel-art sprite" was asked for twice and ignored both times — the reference image dominates the style of the output, which is exactly the mechanism that makes the face hold.

  • The armour is layered, not swapped. The face and the gauntlet held, but the red plate went on over the grey coat instead of replacing it.

The same for voices

create_actor once, then one actor_tts call per line. Each line comes back as its own 24 kHz mono WAV; they are joined here into one clip because GitHub will not play a .wav inline.

Kestrel — three lines, one voice

Play the 19-second clip — GitHub strips <video> out of a README, so the picture above is a still and the link opens GitHub's own player.

别碰那扇门。上一个碰它的人,我埋在山下第三棵松树底下。

我这只眼睛看不见,可另一只看得比你清楚。

拿上灯,跟紧我。这条路我走过十七次,没有哪一次是一样的。

Three different lines, three different lengths, one voice. Through generate_speech — the same voice description, no actor — those three lines are three different people; the measurement behind that claim is in Two things it actually does.

Related MCP server: Voice-AGI MCP Server

What it can do

tools

Look

create_character create_animal create_object import_subject subject_image

pin a character, animal or prop once; every later image is that one

Voice

create_actor import_actor actor_tts

cast a voice once; every later line is that voice

Hearing

transcribe

read a WAV back as text — including one this plugin just made

Music

generate_music

Stable Audio, up to 120 s, no loop points — score a scene, not a BGM loop

SFX

gen_sfx sfx_presets

procedural sfxr: milliseconds, byte-identical for a given seed, no model and no VRAM at all

One-offs

generate_image generate_speech

for things that never recur; their own descriptions say so and point back at the pinning tools

Post

remove_bg slice_sheet

real RGBA cutout (CPU), and a grid sheet cut into single frames

State

continuity_status

which engines are up, which capabilities are on, where the assets live

Two of these read in rather than write out, and they are the ones people miss:

  • import_actor / import_subject pin something you already have — a real actor's recording, a character sheet drawn elsewhere — and everything downstream is identical to a natively cast one (measured: an imported actor tracks a native one to 11 Hz).

  • transcribe closes the loop. A cloned line that swallowed its last two words sounds completely normal; it is only visible once you read it back and compare it to the script. That is also what fills in an imported recording's transcript when you don't have one (the ASR model loads on demand and unloads with the rest — 3.05 GB while resident, 0.4 s for 9.5 s of audio).

The table above is the short version — all 21 tools, grouped, are in Tools.

Install

uvx --from dsh-continuity continuity-setup

That one command does the whole backend: preflight → build the engines → fetch only the weights this machine can use → start them.

The PyPI distribution is dsh-continuity (the import name stays continuity_mcp). It is not continuity-mcp — that name on PyPI belongs to an unrelated project, so do not uvx continuity-mcp.

To run from source instead: uvx --from git+https://github.com/linxuhao/Deepseek-Continuity continuity-setup

Then add the plugin to your dsh profile. dsh plugin shells out to pnpm, so install that first if you have not (corepack enable pnpm); without it the command stops at pnpm not found on PATH:

dsh plugin --profile <your-profile> add dsh-plugin-continuity

Add it to a profile that already has an app bundle. If you point it at a new profile, dsh creates one containing only @deepseek-ai/dsh-base plus this plugin — no app, so booting it does nothing and hangs. Add the app yourself in ~/.dsh/profiles/<name>/package.json:

"dsh": { "profile": { "bundles": [
  "@deepseek-ai/dsh-base", "@deepseek-ai/dsh-headless", "dsh-plugin-continuity"
] } }

The bundle reads its settings from the environment, so export what continuity-setup printed for your machine before booting the profile:

export CONTINUITY_STATE_DIR=~/.continuity
export CONTINUITY_SD_SERVER=http://127.0.0.1:9020
export CONTINUITY_AUDIO_SERVER=http://127.0.0.1:9021

To wire it by hand instead — continuity-setup prints this block filled in for your machine:

- insert:
    - id: continuity
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: continuity
        transport: stdio
        command: uvx
        args: ['--from', 'dsh-continuity', 'continuity-mcp']
        env:
          CONTINUITY_STATE_DIR: !!js process.env.CONTINUITY_STATE_DIR ?? ''
          SD_SERVER: !!js process.env.CONTINUITY_SD_SERVER ?? ''
          AUDIO_SERVER: !!js process.env.CONTINUITY_AUDIO_SERVER ?? ''

(the complete row, with every passthrough documented: bundle/cordis.patch.yml)

continuity-setup checks the machine before it downloads anything, and sizes the install to what it finds. Run continuity-setup --check first to see what it would do — that reads hardware and changes nothing:

体检结果:
  GPU     AMD Radeon RX 7800 XT (RADV NAVI32)  (16.0 GiB, 此刻可用 15.8 GiB, DISCRETE_GPU, vulkan device 1)
          未选 AMD Radeon RX 7900 XTX (RADV NAVI31) (24.0 GiB, 此刻可用 1.4 GiB)
          跳过 llvmpipe —— 软件渲染, 不是真显卡
  内存    30.9 GiB
  磁盘    3118.4 GiB 可用 / 需要 34 GiB
  生图    启用
  音频    启用
  抠图默认档  best

Two details in there that exist because the naive version is wrong:

  • It skips llvmpipe. The software rasterizer advertises 30.9 GiB of "VRAM" (it is your system RAM) and would win any "pick the biggest card" contest. Everything would then run on the CPU — working, looking completely normal, and unusably slow.

  • It picks by free VRAM, gates by total VRAM. On the machine above the 24 GiB card has 1.4 GiB actually free because another process holds it; picking by size would select it and then OOM. But "is this card good enough" is a hardware question, so that one uses the total — otherwise a 16 GiB card would be rejected for having a game open.

Minimum requirements

Minimum

Notes

GPU

8 GiB VRAM

Peak is 6.80 GiB (measured). Requests are serialized, so peak is one model, not the sum.

GPU API

Vulkan 1.2+

No CUDA, no ROCm. Kernels are SPIR-V compiled at runtime.

Disk

34 GiB during install, 21.8 GiB after

19.7 weights + 2.1 runtime image + 8.5 build layers (reclaimable) + 4 headroom.

Host RAM

16 GiB (8 GiB workable — see below)

Driven by transient peaks, not idle.

CPU

any x86-64

Background removal runs on CPU.

Audio-only installs (see below) need 20 GiB during install, 9.5 GiB after.

Every row above is about the halves you run locally. --image-api-server (or --sd-server) drops the GPU row to the 4 GiB the audio half needs and leaves 10.1 GiB of weights undownloaded, --asr-server another 2.3 GiB, and --audio-server the rest — see Bring your own backend.

All VRAM/RAM figures on this page are GiB (2³⁰ bytes), which is what rocm-smi and vulkaninfo report. An earlier version of this README labelled them GB; that was wrong and made the headroom look tighter than it is.

Vulkan instead of CUDA is not a preference — it is why this runs at all. ROCm miscomputes VAE decode on this GPU class (ROCm#6633): five decodes of identical input returned five mutually uncorrelated results. Vulkan/RADV compiles SPIR-V at runtime instead of looking up a per-arch kernel table, and is correct and faster here. The side effect is portability across all three vendors.

GPU vendors

How the container gets the GPU

Status

AMD

/dev/dri + mesa RADV inside the image

Tested (RX 7800 XT, RX 7900 XTX)

Intel

/dev/dri + mesa ANV inside the image — same mechanism

Untested

NVIDIA

nvidia-container-toolkit injects the host driver (docker-compose.nvidia.yml)

Untested

I only have AMD cards, so I will not claim more than that. Nothing in the code is AMD-specific — no CUDA, no ROCm, no HIP, no /dev/kfd, no gfx targets — and ggml's Vulkan backend is widely run on NVIDIA. But "widely run" is not "I verified it".

The NVIDIA path is a genuinely different wiring, not just a different card: NVIDIA's Vulkan ICD lives in the host driver and must be injected by nvidia-container-toolkit, with NVIDIA_DRIVER_CAPABILITIES including graphics — the default compute,utility gives you working CUDA and an empty device list in Vulkan. continuity-setup detects NVIDIA, uses the right compose overlay, and tells you the path is unverified. Reports either way are welcome.

Host RAM in detail

Idle is negligible; the peaks are what sizes the machine.

operation

peak RSS

idle

0.52 GiB

music

0.50 GiB

speech

1.63 GiB

image (1024²)

4.94 GiB

remove_bg quality="best"

7.74 GiB

remove_bg quality="fast"

1.33 GiB

Background removal is the ceiling, and its cost is independent of input size — 256 / 512 / 1024 px all peak at ~6.8 GiB, because BiRefNet runs at a fixed internal resolution.

On 16 GiB everything works. Below 12 GiB, continuity-setup sets the default to quality="fast" (u2netp): peak drops to 1.33 GiB and it runs in 0.6 s instead of 7.2 s. On a typical game sprite the two are hard to tell apart by eye — checked side by side over a magenta backdrop with the edges zoomed. best remains the default where there is room, because the models do differ in principle on fine edges (hair, semi-transparent fringes), but treat fast as a legitimate choice rather than a degraded fallback.

One rule, not a tier list

Jobs are serialized, so at any moment exactly one model is needed. Everything else is released before the job starts. That is the whole VRAM policy. (The one exception is a split deployment: if the image backend is on a different host from the audio one, they are not competing for a card, so nothing is released — freeing local VRAM for a remote job buys nothing and costs a reload.)

It buys a property worth more than a few saved seconds: peak VRAM is a constant 6.80 GiB regardless of what you call, in what order. Measured over an alternating speech→image→speech→image sequence:

peak

speech

image

6 calls

keep models resident

10.94 GiB

2.8 s avg

11.5 s

42.9 s

release what isn't needed

6.79 GiB

4.8 s

11.6 s

49.2 s

Keeping them resident is 16% faster and does not fit an 8 GiB card — and "voice a line, then draw something" is the most ordinary sequence there is. An earlier version of this README quoted 7.84 GiB for that overlap; that came from a lighter sequence I happened to test, and using it as the ceiling was wrong. A cloned voice keeps its reference audio resident too, which is where the rest comes from.

What the reload actually costs: 4.8 s instead of 1.2 s, and only on the first call after switching away. Ten dialogue lines in a row pay it once:

第 1 句 4.63s   之后九句平均 1.19s   十句合计 15.4s

So there is no VRAM tier list, and no 12 GiB threshold. Above 8 GiB every card behaves identically. Below 8 GiB the installer explains why image generation will not fit and asks whether to install the audio half alone — it does not quietly substitute a different product:

  生图    显存不足
          Fake GTX 1060 只有 6.0 GiB, 而生图实测峰值 6.80 GiB, 需要 8 GiB。
          换更小的生图模型省不下这部分 (Q4 与 Q8 峰值相同 6.60 / 6.59), 降分辨率也不行
          —— 瓶颈是那个 8 GiB 不量化的文本编码器。
          音频那半仍然可以装: 铸声/配音/听写/音乐/音效/抠图都能用, 4 GiB 就够。

  ⚠️ 这张卡装不了生图那半。
     只装音频那半 (铸声/配音/听写/音乐/音效/抠图)? [y/N]

The audio-only install is a real product, not a consolation prize: casting voices, dialogue, music, SFX and cutout all work in 4 GiB.

What does not adapt at all: the image model. Quantizing it does not move VRAM — Q4_0 (2.29 GiB of weights) peaks at 6.60 GiB, Q8_0 (4.01 GiB) at 6.59 GiB, identical. Lowering resolution does not help either (512 / 768 / 1024 all peak the same; only time changes). The bottleneck is the 8 GiB unquantized 4B text encoder. So there is no "medium" image tier to offer, only installed or not. (Q4_0 ships anyway — same VRAM, 1.7 GiB less disk.)

Going below 8 GiB for images means changing the text encoder or the model family. That is possible, but it moves identity pinning from native ref_images to IP-Adapter, which is not verified here — and identity pinning is the whole point.

The one thing that does still key off a resource is host RAM, and it is a different resource: below 12 GiB RAM the cutout default drops to quality="fast" (see above).

Zero residency

Measured on an RX 7800 XT with nothing else on the card:

GPU

idle

0.21 GiB

during image generation

6.80 GiB

2 s after it finishes

0.21 GiB

during TTS

2.39 GiB

120 s after TTS

0.21 GiB

Images are free: the engine streams weights per request and never keeps them resident. Audio is released by an idle timer — not immediately, because someone voicing ten lines in a row should not pay a reload each time. Reload costs nothing measurable: the same TTS request took 3.0 s both cold and warm, because weights are mmap'd and sit in page cache.

The idle timer lives in the engine, not here (idle_unload_ms in audio_server.json, default 120 000 ms). It used to be a thread in this process, and that version had a hole worth naming: it timed from its own last job, so any model loaded by anyone else — another client talking to the engine directly, or a previous process of this server that was SIGKILLed — was invisible to it forever. Measured: load a model by calling the engine directly, leave this server running, wait past the timeout, and the VRAM does not move. The engine's timer keys on whether a session is actually resident, so it does not care who loaded the model.

Requests are serialized and everything unneeded is released first, so peak = the single largest model, always. The idle timer covers the one case that rule cannot: after the last job there is no next job to trigger a release. Closing the agent releases the VRAM immediately — this server still unloads on exit, because the timer only guarantees eventually and someone quitting to go play a game should not wait two minutes for their card.

Two things it actually does

1. Identity survives across calls. Generation backends are stateless: ask for the same character twice and you get two people who merely resemble each other. Measured on Qwen3-TTS as pitch spread across four lines of one character — same voice description, same lines, the only variable being whether a reference was pinned:

voice under test

straight to the model

through Continuity

a bright narrator

125 Hz

5 Hz

an elderly gravelly voice

74 Hz

29 Hz

Two different voices, two different magnitudes, same direction. Read the ratio, not the headline number — how far a description drifts depends on the description. And treat f0 spread as a proxy, not the verdict: autocorrelation pitch tracking makes octave errors on low gravelly voices (an earlier run of the table above reported 76 Hz where the octave-corrected figure is 29), so the numbers above anchor each line's search range to the reference. The real acceptance test is listening to the audition clip, which is why create_actor hands you one.

What the number cannot show is the part that matters most: the drift is not random.

pitch spread across 4 lines

default sampling

125 Hz

greedy decoding

242 Hz — worse

pinned reference

5 Hz

Under greedy decoding the seed is provably inert — seeds 5 / 99 / 777 produced one identical sha256 — so randomness was fully eliminated, and it still drifted 242 Hz. Identity is a function of the input text, not of the random draw. temperature=0 and top_k=1 cannot fix it. Only pinning to a reference artifact can.

create_actor(name, voice)          -> audition clip; listen before you commit
actor_tts(actor, text)             -> same timbre every line

create_character / create_animal / create_object (name, appearance)
subject_image(subject, scene)      -> same look, new scene / angle / outfit

Identity and wardrobe are separate: pin the face and build, then change clothes in the scene prompt. A reference in an indigo robe, asked for wearing heavy red armor, comes back in armor with the same face.

Already cast your character somewhere else? import_actor and import_subject pin an artifact you supply — a real voice recording, an ElevenLabs clip, a character sheet from another tool — and everything downstream behaves identically. Audio is normalized to 24 kHz mono for you (44.1 kHz stereo in, verified: reference f0 identical, and an imported actor tracks a natively-cast one to 11 Hz).

import_actor needs to know what the recording says — the clone aligns audio to text, and a wrong transcript is heard as a wrong voice. If you leave it out, it is transcribed for you and the result comes back flagged as machine-heard, so you can check the one line everything else depends on. The same tool is exposed on its own as transcribe, which is worth pointing at a line you just generated: a clone that swallowed the last two words sounds completely normal and only becomes visible once you read it back. (Both go through the ASR model, which loads on demand and is released with everything else — 3.05 GB while loaded, 0.4 s for 9.5 s of audio.)

Looking at what it made

The pinning tools tell the agent to look at the reference before committing to it. So they return the image, not just its path — a 512 px JPEG (~35 KB) alongside the text, as MCP image content. There is no VLM in this plugin and there will not be one: a vision model wants its own VRAM, which would destroy the property that peak = the single largest model, and the 8 GiB floor rests on that. The harness already has a model; hand it the picture instead of running a second one.

Verified end to end on dsh 0.1.1-rc.1 with the vision model — plain deepseek-v4-flash does not accept images and answers INVALID_REQUEST: This model does not support image:

- id: agent-default-model
  config:
    provider: deepseek-official
    model: deepseek-v4-flash-vision-exp

Asked to pin "a square metal lantern with EXACTLY FIVE blue glass panels and a green handle" and then check the render against that description item by item, the agent answered:

面板数量 — 不符合。 图中实际可见的是 4 块蓝色面板(正面 2 + 右侧面 2),并非 5 块。 而且从"每面 2 块"的网格规律看,若其余两面同规格,总数应为 8 块。

It counted, it disagreed with the prompt it had just been given, and it said what it actually saw. That is the loop the statistical checks cannot close: they catch a grey PNG, this catches "that is not the thing I asked for."

On a model without image input the block degrades to [image unavailable] and the run continues normally — observed on dsh, not assumed; the agent then says it received no image rather than guessing from appearance. CONTINUITY_INLINE_IMAGES=0 sends text only.

One older caveat, corrected: an earlier experiment here had a self-hosted 27B VLM score 9/9/10 on chest renders whose lids were visibly the wrong shape, and I had written that off as "VLM judges are blind to geometry". The panel-counting result above is evidence that was a statement about that model, not a general law. Writing geometry explicitly into appearance is still the cheaper fix, but the check is now worth running.

2. Degenerate output is refused. A backend that miscomputes returns a perfectly well-formed all-zero WAV, or a flat grey PNG, with HTTP 200. Every artifact is checked (image standard deviation, audio RMS, non-finite samples) and the call fails loudly rather than reporting success over garbage. Cutouts additionally get a quality report — mostly transparent, nothing removed, subject shattered into fragments, holes eaten through the subject — each with a specific warning instead of a silent pass.

Plus remove_bg: diffusion models draw "transparent background" as an opaque checkerboard; this turns it into a real RGBA cutout, which sprites require. And gen_sfx, which synthesizes sfxr-style game SFX procedurally — bit-identical for a given seed, milliseconds, no GPU — because a diffusion model is the wrong instrument for a 40 ms coin pickup.

Tools

21 tools. Everything returns absolute local file paths, not URLs — the agent and the engines are on the same machine, so a path can go straight into your game project without a download step, and there is no file server to run or misconfigure.

voice

create_actor import_actor actor_tts transcribe list_actors delete_actor generate_speech

look

create_character create_animal create_object import_subject subject_image list_subjects delete_subject generate_image

audio

generate_music gen_sfx

post

remove_bg slice_sheet

meta

continuity_status

generate_image and generate_speech exist for one-offs and say so in their own descriptions: they explicitly tell the agent that what they produce will not come back on the next call, and point at the pinning tools for anything recurring.

Two audiences per result

Every tool returns two descriptions of the same call:

who reads it

what it is

content

the LLM

the Chinese prose, ⚠️ warnings and all — unchanged, it is the prompt

structuredContent

your program

a typed object; the model is in results.py, its JSON Schema is the tool's outputSchema

// generate_image
{"ok": true, "error": null, "warnings": [],
 "path": "/home/you/.continuity/generated/img_1787322514_9a3f.png",
 "width": 1024, "height": 1024, "seed": null, "clamped": false}

// remove_bg, on a bad cutout — the ⚠️ is in both halves, never only in the prose
{"ok": true, "warnings": ["抠图结果很可能不对: 被去掉的区域细节密度是主体的 68% …"],
 "path": "…/cut_1787322526_5381.png", "mode_used": "rembg", "model": "u2netp",
 "transparent_ratio": 0.551}

// any failure — the prose stays the instructive Chinese message that tells the LLM what to do next
{"ok": false, "error": "actor '郭靖' 不存在 —— 先调 create_actor(…) 铸声, 再用它说台词。", "warnings": []}

Do not regex the prose for paths. That prose is a prompt: it gets reworded whenever the agent's behaviour needs it to be, and a regex that stops matching fails silently — you get an empty path, not an error. ok and path are the contract; the Chinese is not.

The shape is uniform. ok is always present and is the only field worth branching on first: when it is false, only ok / error / warnings are meaningful and everything else is null. Every ⚠️ in the prose has a matching string in warnings. Paths are always absolute.

Casting and pinning (create_character / create_animal / create_object / import_subject) return the reference image inline and structured content — those four are annotated Annotated[CallToolResult, …], which is the one form mcp 2.0 accepts for "several content blocks plus a declared output schema". The models are validated on every call, so a field that drifts away from what the prose says raises instead of shipping.

Limits, and why each one exists

Every number here is a measured failure boundary, not a policy.

limit

value

what happens past it

line length

200 chars

600 chars wedged the GPU: amdgpu GPU reset(6), device lost, an unrelated process on the other card killed. 200 is half the largest known-safe value.

reference audio

15 s

~0.19 GiB VRAM per second: 15 s → 6.59 GiB, 30 s → 9.04 GiB. 15 s is the last value that stays under the image peak, so voice never becomes the ceiling. One value for every card — 3–10 s is already enough to pin a timbre, so a bigger cap on bigger cards would only mean "this clip imports on my machine and not on yours".

casting script

45 chars

It produces the reference audio, which is then re-read on every later line. Char count is a bad proxy (60 chars measured 19.1 s, not the 13.7 s the ratio predicts), so the real duration is checked after casting and reported.

image size

1024 px

1280 pushed VRAM to 14.5/16.4 GiB; 2048 sent the driver into restore_userptr_worker thrashing with the process stuck in uninterruptible D state — worse than a clean OOM.

music length

120 s

Not a safety limit: the engine silently truncates at 120 s and reports success. The limit turns that into an explicit clamped field.

Imported audio below 24 kHz is accepted but flagged: upsampling cannot restore the octave that was thrown away, so the clone comes out duller than the file you gave it. That is worth a warning rather than a silent pass — it is the same failure shape as everything else this plugin exists to catch.

Oversized inputs are handled differently by type, on purpose. An image that is too large is resized and the result is reported back to you (原图 2400x1600 → 存为 1024x682) — a scaled picture still depicts the same thing. Reference audio that is too long is rejected, not trimmed: cutting the tail off the audio would leave the transcript describing something the audio no longer says, and that alignment is exactly what the cloning depends on. Trimming it silently would hand you an actor that imported successfully and sounds like someone else.

How dsh runs it

Not lazily on first tool call — at profile boot. dsh-mcp-client's apply() awaits the connection and the tool listing before the fiber activates, so the tools exist the moment the agent starts. Two consequences worth knowing:

  • failOnStartupError defaults to false. If the MCP server cannot start, the boot succeeds with zero tools registered and nothing draws attention to it — the agent simply reports that the tools do not exist. (Ask me how I know.) Set it to true in the row if you would rather the profile refuse to boot.

  • Reconnect is on by default: 500 ms, doubling to a 30 s cap, 10 attempts, then it gives up and unregisters the tools. Each attempt spawns a fresh server process.

Shutdown is a three-step ladder owned by the MCP SDK, and it is why the VRAM claim above holds:

step

budget

what we do

close our stdin

2 s

server loop ends, normal exit, atexit releases the models

SIGTERM

2 s

signal handler releases, then os._exit — Python would not run atexit here

SIGKILL

nothing runs; the idle timer in the engine still frees it later

Measured: 0.16 s on the stdin path, 0.11 s on SIGTERM, both releasing. The unload call is capped at 1.5 s precisely because the budget is 2 — a slow engine must not push us into the SIGTERM step, where the release would not happen at all. And it fires unconditionally rather than consulting this process's own bookkeeping: VRAM belongs to the engine, which outlives any one server generation, so a reconnected generation has an empty ledger and would otherwise skip the release entirely.

Running it without dsh (streamable-http)

Default transport is stdio and nothing about the dsh path changes — continuity-mcp with no arguments behaves exactly as before. For a caller that is not spawning the process itself (an HTTP shell, a second machine, several clients sharing one loaded model), run it as a long-lived streamable-http server:

continuity-mcp --http                                   # 127.0.0.1:9030/mcp
continuity-mcp --http --host 127.0.0.1 --port 9030 --path /mcp   # same, spelled out
CONTINUITY_TRANSPORT=streamable-http continuity-mcp     # env instead of flags

flag

env

default

--transport {stdio,sse,streamable-http} (--http is shorthand for the last)

CONTINUITY_TRANSPORT

stdio

--host

CONTINUITY_HTTP_HOST

127.0.0.1

--port

CONTINUITY_HTTP_PORT

9030

--path

CONTINUITY_HTTP_PATH

/mcp

Point an MCP client at http://127.0.0.1:9030/mcp.

It binds loopback by default and you should leave it there. There is no authentication of any kind, and the tools write files to this machine's disk and delete actors and subjects. Binding 0.0.0.0 hands that to anyone on the segment — put a reverse proxy in front if you need it reachable. Port 9030 stays clear of the two engines (9020 / 9021).

The VRAM guarantee is unchanged over HTTP: image generation and TTS still share one process-wide lock, so several clients connecting at once means they queue, not that two models sit on the card together. What HTTP does change is the shutdown ladder above — a long-lived server is not being reaped by dsh, so the models stay loaded until the engine's own idle_unload_ms (default 120 000 ms idle) frees them, or until you stop the process.

Bring your own backend (optional)

There are two independent backend URLs, so you can move one capability off-box and keep the other local:

env var

what it must be

image

SD_SERVER

a stable-diffusion.cpp sd-server (/sdcpp/v1/img_gen + poll, accepts ref_images)

audio

AUDIO_SERVER (+ optional AUDIO_API_KEY)

an audio.cpp audiocpp_server (/v1/audio/speech, /v1/audio/transcriptions, /v1/tasks/run, /v1/tasks/unload_models) serving qwen3-tts / qwen3-tts-base / stable-audio / qwen3-asr

asr

ASR_SERVER + ASR_API_KEY

anything OpenAI-shaped: multipart file + model on /v1/audio/transcriptions, returning {"text": ...}. Defaults to AUDIO_SERVER. Give the root URL, no /v1 — the path is appended.

image via API

IMAGE_API_SERVER + IMAGE_API_KEY

anything OpenAI-shaped: /v1/images/generations, plus /v1/images/edits when a reference image is involved; either b64_json or url in the response is accepted. Setting it wins over SD_SERVER — unlike the ASR knob it selects a protocol, not just an address, because our own engine speaks sd.cpp's /sdcpp/v1/img_gen and nothing else does.

Pointing image generation at a hosted API is the biggest saving on offer — 10.1 GiB of weights and the whole 8 GiB VRAM gate — but it is the capability that loses the most in translation, and every loss is reported in the tool's own warnings rather than left for you to discover:

  • seed does not exist in the standard shape. It is dropped, and the result reports seed: null rather than echoing back a number that reproduces nothing.

  • Sizes are a fixed enum, and which one differs by provider (IMAGE_API_SIZES). The request is snapped to the nearest aspect; generate_image then resizes down to what you asked for, while a pinned subject's reference image is stored at the provider's size.

  • steps / cfg_scale have nowhere to go.

  • Reference images go through /v1/images/edits, where providers differ the most — mask editing, multi-image reference, style transfer are all spelled this way. Identity pinning therefore becomes a property of that backend rather than something this package delivers.

Tested against shape, not against a provider. This path was built against the documented OpenAI shape and exercised end-to-end on a local mock (both b64_json and url responses, generations and edits, key header, seed correctly absent from the wire). No live hosted service was called. Try generate_image once before trusting a new backend with a pinning run.

Only ASR gets its own row, and the reason is the endpoint, not the model: transcription is the one capability with an industry-standard shape, so someone else's ASR is a real thing you can point at — vLLM, a hosted API, another box. Speech and music have no such option: cloning posts voice_ref as inline base64 with a reference_text alongside it, and music goes through /v1/tasks/run — both are audio.cpp's own shapes, which no third party speaks. Their "BYO" can only ever mean another audiocpp_server, and that is what AUDIO_SERVER already is.

Another audiocpp_server on another machine is almost always behind a gateway that wants a token, so AUDIO_API_KEY sends Authorization: Bearer <key> on every request to AUDIO_SERVER — speech, music, local transcription, unloading and the health probe alike. Unset, no header is sent and the requests are exactly what they were. It does not follow transcription elsewhere: when ASR_SERVER points at a different backend, that backend's key is ASR_API_KEY.

The two paths do not share assumptions, and the code keeps them apart. For our own engine we picked the model, so we know it runs at 16 kHz and we downsample to it — nothing is lost, the upload shrinks by a third, and the local VRAM dance applies. For a backend we did not pick we know none of that, so the audio goes as-is: deciding whether to resample is that service's business, and pre-downsampling for one whose model wants wideband audio throws away the very thing it was trained on.

That leaves the servers which are themselves picky. vLLM's /v1/audio/transcriptions rejects 22.05 kHz and 24 kHz with 400 Invalid or unsupported audio file and says nothing about sample rates — and reference audio here is 24 kHz, because that is what the cloning model wants. So a 400 on the standard path is retried once at 16 kHz (a 400 means the request was refused, and the audio is the only thing we can vary). Set ASR_SEND_RATE=16000 for a backend known to be in this camp and skip the wasted round trip.

Tell the installer which half is yours and it skips that half entirely — no weights, no engine, no VRAM gate — while the tools stay registered:

continuity-setup --sd-server http://your-box:9020      # 生图你自己供; 本地只装音频
continuity-setup --audio-server http://your-box:9021   # 反过来
continuity-setup --asr-server http://your-box:9000 \
                 --asr-api-key sk-...                  # 只把听写挪出去, 那 2.3 GiB 不下
continuity-setup --image-api-server https://api.openai.com \
                 --image-api-key sk-...                # 生图整半交给标准 API, 10.1 GiB 不下

That matters more than it sounds: without it, BYO-ing the image half still downloaded 10.1 GiB of image weights and started a local sd-server nobody would ever call, then refused to enable image tools because the local card was too small. On a 5.3 GiB integrated GPU, --sd-server turns "生图 显存不足" into "生图(BYO)" and downloads nothing.

Note the deliberate split from --no-image: that one means "I don't want this capability" (tools unregistered); --sd-server means "I supply this capability" (tools work normally).

Upgrading a BYO audio engine to 0.4.0: the ASR model is new, and BYO means the installer never touches your engine — so transcribe (and import_actor without a transcript) will fail against an engine that predates it. Add the qwen3-asr entry from deploy/audio_server.json.tmpl to your engine's config and fetch Qwen3-ASR-1.7B-GGUF/qwen3-asr-1.7b-q8_0.gguf (2.3 GiB) from audio-cpp/audio.cpp-gguf. A local install re-running continuity-setup gets both for free. Nothing else changes: the other tools do not know the model exists.

Every one of these also works as a plain runtime env var, whether you installed from PyPI or wired the dsh plugin. Through the plugin they are named CONTINUITY_ASR_SERVER, CONTINUITY_IMAGE_API_SERVER and so on — cordis.patch.yml lists each key explicitly, because that env block is a fixed dictionary rather than a passthrough: a key that is not listed there does not exist on the server side, so setting it has no effect and nothing reports that. continuity_status names whichever side is unreachable. gen_sfx needs no backend at all.

Be clear about what "your own backend" means here: the same engine, elsewhere. It is not a provider abstraction. The client speaks sd.cpp's and audio.cpp's specific HTTP shapes, so you cannot point SD_SERVER at an OpenAI-compatible endpoint, a ComfyUI instance, or a bare IP-Adapter server and expect it to work. What it is good for: running the engines on a beefier box, or sharing one backend between several agents. (An earlier version of this README implied any reference-image-capable backend would do. That was never true of the code.)

One constraint if you go remote: identity pinning needs the image backend to accept a reference image. sd.cpp's ref_images is what the code uses; without it there is no pinning, which is the whole point.

Reference audio used to be a second constraint — the engine was handed a filesystem path and opened the file itself, so a remote audio backend meant casting succeeded and every line after it failed. That was not an engine limitation, it was the wrong endpoint: /v1/audio/speech takes the reference inline as base64 (5 MiB cap; a 15 s reference is ~720 KB), exactly the way the image path had always passed ref_images. Both halves are symmetric now and nothing has to share a directory.

Prior art

A survey of the current MCP ecosystem — MiniMax-MCP, openrouter-mcp-multimodal, AtlasCloud, the dsh vision/draw plugins, and four game-asset servers — found voice cloning in several, visual subject pinning in none, and output verification in none.

Layout

package.json + cordis.patch.yml   the dsh bundle (npm) — one plugin row, at the repo root
                                  so `dsh plugin add github:...` works, not just the npm name
src/continuity_mcp/               the MCP server: pinning, guardrails, verification, cutout,
                                  VRAM lifecycle
src/continuity_mcp/deploy/        compose + engine Dockerfile + weight manifest
pyproject.toml                    the PyPI distribution (dsh-continuity)

License

MIT

Available Tools

21 tools
actor_ttsA

让某个已铸声的角色说一句台词, 音色与他之前每一句都一致。

做游戏 NPC 对白用这个, 不要用 generate_speech —— 后者每句音色会漂。 角色不存在会告诉你先去 create_actor。

参数: actor: 角色名(create_actor 时定的) text: 台词, 上限 200 字(约 45 秒), 超出截断 speaking_rate: 语速倍率(可选) seed: 随机种子(可选)

返回: 24 kHz 单声道 WAV 的本机路径

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
textYes
actorYes
speaking_rateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
actorNo
errorNo
voiceNo
warningsNo
max_charsNo
truncatedNo
consistentNo
error_codeNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden and does well: it discloses the consistency guarantee, text truncation at 200 chars (~45s), the actor-not-found error behavior routing to create_actor, and the return format (24 kHz mono WAV path). It does not mention latency, cost, or concurrency, which keeps it short of 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?

Front-loaded with purpose and the key routing decision, then parameters and return value in clearly delineated sections. Every line earns its place; no filler.

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?

Output schema exists, so return-value detail is optional (though provided). With no annotations and 0% schema coverage, the description successfully covers purpose, routing, all params, error behavior, and output format. Minor gaps around speaking_rate/seed ranges and operational limits prevent a 5.

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 must document params and it does all four: actor (name from create_actor), text (200-char cap, truncation), speaking_rate (rate multiplier), seed (random seed). The last two are thin — no valid ranges — so it compensates well but not exhaustively.

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+resource ('make an already-cast actor speak a line') and a distinctive property (timbre consistency across every line). It explicitly names and contrasts with the sibling generate_speech, so an agent can distinguish it without opening 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 explicit when-to-use ('game NPC dialogue'), when-not ('don't use generate_speech — its timbre drifts per line'), and a prerequisite path (if the actor doesn't exist, it tells you to create_actor first). Alternatives and conditions are fully specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

continuity_statusA

本插件当前的状态: 两个引擎在不在、哪些能力开着、资产存在哪。

某个工具"不存在"时先看这里 —— 显存不够的机器上生图那半是被安装脚本关掉的, 不是坏了。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
audioNo
errorNo
imageNo
actorsNo
subjectsNo
warningsNo
state_dirNo
engines_okNo
error_codeNo
engines_downNo
setup_neededNo
idle_unload_sNo
cutout_qualityNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

无 annotations,描述承担行为说明责任;它说明了状态涵盖引擎、能力和资产位置,并主动解释“工具不存在”可能是被安装脚本关闭而非故障。这提供了有用诊断上下文,但未明说只读/无副作用等安全属性。

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?

两句话,先总述状态内容,再给出故障排查指引;信息前置,无冗余,每句都有明确作用。

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?

存在输出 schema,因此无需描述返回值;工具无参数且用途简单。描述已覆盖状态范围与关键使用场景,信息完整。

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 为空且覆盖率为 100%。无参数工具的参数语义基线为 4,描述无需补充参数含义。

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?

明确说明这是本插件当前状态工具,并列出返回内容:两个引擎是否存在、哪些能力启用、资产存放位置。它与所有创建/生成/导入类兄弟工具在用途上明显不同,代理可据此区分。

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?

给出明确使用时机:当某个工具“不存在”时先查这里;还解释了常见原因(显存不足导致生图能力被安装脚本关闭)。但没有列出何时不用或替代工具,故非满分。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_actorA

给一个角色铸声(定妆), 之后用 actor_tts 让他说任意台词都保持同一个音色。

为什么要有这一步: 直接用文字描述合成语音, 那段描述只圈定一个大致的音色区间, 区间内每句台词各漂各的 —— 实测同 voice 同 seed 四句台词基频极差 125 Hz, 关掉采样走贪心反而涨到 242 Hz(音色是文本的函数, 不是采样随机性, 锁 seed 或 temperature 都锁不住)。本工具先用 voice 描述生成一段参考音, 之后所有台词 改由克隆模型照着这段参考音说, 音色与台词内容无关。实测极差降到 5 Hz。

重要: 铸完请先听那段试音, 确认是不是你要的那个人。铸砸了会把整个角色锁死在 错的音色上, 而且它之后每一句都错得很一致。不满意就 force=true 重铸。

参数: name: 角色名(字母/数字/下划线/连字符/中文, 1~40 字), 之后 actor_tts 用它指代 voice: 声音的自然语言描述, 英文效果最佳。写年龄/性别/音色/语速/情绪, 例如 "An elderly Chinese man, gravelly chest voice, commanding" sample_text: 铸声用的台词(可选)。默认用一段覆盖面较广的中文 seed: 随机种子(可选) force: 覆盖已有角色。会让该角色之前所有台词的音色对不上, 慎用

返回: 试音片段的本机路径 —— 先听再用

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
seedNo
forceNo
voiceYes
sample_textNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
seedNo
errorNo
voiceNo
warningsNo
truncatedNo
error_codeNo
transcriptNo
ref_secondsNo
imported_fromNo
source_formatNo
reference_pathNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the output (a local path to the audition clip) and the consequential side effect of force=true (previously generated lines no longer match). It stops short of stating what happens if name already exists without force (error vs. reuse), so one behavioral gap remains.

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?

The purpose sentence and the parameter block are front-loaded and tight. The middle 'why' paragraph justifies the tool's existence but spends several sentences on 125 Hz/242 Hz/5 Hz measurements, which is more evidence than an agent needs to make a selection decision.

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?

An output schema exists, so return values need not be explained in prose (the description still notes the audition path usefully). For a 5-parameter mutation tool with zero schema coverage and no annotations, the description supplies the operational context needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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 entirely – and it does. All five parameters are explained: name with charset/length constraints, voice with a concrete English example and content guidance, sample_text with its default, seed, and force with its destructive consequence.

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+resource ('给一个角色铸声(定妆)' – mint/cast a voice for a character) and immediately distinguishes itself from the sibling it feeds into ('之后用 actor_tts 让他说任意台词'). An agent can tell this apart from actor_tts, import_actor, or generate_speech without opening a 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?

Clearly states when to use it: before actor_tts, to lock a stable timbre, and force=true to re-cast. It gives a clear workflow position but doesn't name alternative casting routes (import_actor, create_character) or say when those would be preferred instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_animalA

给一只动物/坐骑/灵兽定妆, 之后每张图它都是同一只。

appearance 里必须写死这几样:

  • 物种 + 体型比例(腿长/身长/头身比)

  • 毛色/羽色 + 花纹的分布位置(不是只说"有斑点", 要说斑点在哪)

  • 耳朵、尾巴、翅膀的形状

  • 显著特征(独角/断尾/眼色) 鞍具、缰绳这类可穿卸的东西和人物的服装同理: 写进 appearance 只是默认值, scene 里可以换掉。不要写场景和动作。

定完先看定妆图, 不满意 force=true 重定。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
seedNo
forceNo
widthNo
heightNo
appearanceYes
guidance_scaleNo
num_inference_stepsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
seedNo
errorNo
resizedNo
warningsNo
appearanceNo
error_codeNo
source_sizeNo
stored_sizeNo
imported_fromNo
reference_pathNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it explains that appearance values are hardcoded defaults that can be overridden in scene (for removable gear and clothing), and that force=true triggers a re-design. It omits persistence/side-effect details (does this register a reusable subject that list_subjects/subject_image later reference?) and does not mention deterministic seeding behavior.

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 purpose, then an efficient bulleted list of required appearance fields, then the override rule and the force workflow. Every line contributes, though the removable-gear/clothing aside adds slight length.

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 described, and the appearance/override/force semantics are well covered. Gaps remain around the image-generation parameters and whether the created animal becomes a reusable referenced subject, but the core workflow is complete.

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. It thoroughly explains 'appearance' (exactly which attributes to specify) and 'force', but leaves seed, width, height, guidance_scale, and num_inference_steps entirely undocumented in both schema and description. Partial compensation warrants a 3.

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 states a specific action (create/lock the design of an animal, mount, or spirit beast) and the concrete outcome (every subsequent image shows the same creature), which is a distinct purpose from the animal/character/object siblings. An agent can tell this is the animal-design tool 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear workflow guidance: design first, inspect the resulting design image, and rerun with force=true if unsatisfied. It also implicitly scopes out scene/action content ('不要写场景和动作'). It stops short of explicitly naming which sibling to use for scenes or characters, so not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_characterA

给一个人物定妆(生成并存下参考图), 之后 subject_image 出的每张图长相都一致。

为什么要有这一步: generate_image 每次给的是"长得不一样的人"。同一个角色的头像 / 战斗立绘 / 地图小人, 直接用文字描述生成出来是三个人。

appearance 分两部分, 分清楚很重要:

(1) 身份 —— 必须写死, 漏掉的每一项模型都会自己编, 而且每张编得不一样:

  • 年龄段 + 体型(高瘦/魁梧/矮壮)

  • 脸: 脸型、显著特征(疤/须/眉眼)

  • 发型 + 发色 + 束发方式

  • 辨识物: 跟着这个人走、换装也不摘的东西(独眼罩/佩剑/护腕/胎记)

(2) 默认服装 —— 只是个基线, 不是身份的一部分。照样写进 appearance, 但 subject_image 的 scene 里写新衣服就能换掉(实测: 定妆穿布袍, scene 写 "wearing heavy red armor" 能换成甲胄而脸不变)。所以一个角色不需要按套装 定妆很多次。

不要写场景、动作、表情 —— 那些留给 subject_image 的 scene。

定完先看返回的定妆图确认是不是你要的人; 定砸了会把整个角色锁死在错的长相上, 不满意就 force=true 重定。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
seedNo
forceNo
widthNo
heightNo
appearanceYes
guidance_scaleNo
num_inference_stepsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
seedNo
errorNo
resizedNo
warningsNo
appearanceNo
error_codeNo
source_sizeNo
stored_sizeNo
imported_fromNo
reference_pathNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and largely meets it: it discloses that this persists a locked-in appearance that governs all future subject_image output, that a bad result locks the whole character into the wrong look, and that force=true is the re-roll escape hatch, plus an instruction to verify the returned reference image. It is silent on the non-appearance generation knobs (seed, guidance_scale, steps, size) and on collision behavior when a name already exists.

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?

Well front-loaded – the one-line purpose precedes the rationale and the field guidance – and structured into clearly labeled sub-sections that an agent can scan. It is on the long side, and the illustrative anecdote about the robe-to-armor swap could be trimmed, but essentially every sentence carries usable instruction.

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 explanation is not owed, and the description correctly just tells the agent to inspect the returned reference image. Combined with the purpose, usage and appearance guidance, an agent can call this correctly; the gaps are the undocumented generation parameters and name-collision behavior rather than anything blocking.

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 coverage is 0%, so the description must compensate. It does so richly for the two most important parameters: `appearance` is decomposed into identity vs. default clothing with a concrete list of what must be pinned down, and `force` is defined as the re-create/override switch. The other five parameters (seed, width, height, guidance_scale, num_inference_steps) receive no semantics at all, leaving a substantial documentation hole.

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 opening sentence names a specific verb and resource ('给一个人物定妆' – generate and persist a character reference) and immediately contrasts it with generate_image and subject_image, so the agent knows it is not a one-off image generator. It does not, however, differentiate itself from the parallel siblings create_actor / create_animal / create_object, which is the one ambiguity left.

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?

Explicit about when to use it (whenever a character must stay visually consistent across many images), what to use instead for one-offs (generate_image), and what NOT to put in this call ('不要写场景、动作、表情' – leave those to subject_image's scene). It even gives a worked example of swapping clothing via scene without re-creating the character, which is exactly the when/when-not guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_objectC

给一件道具/物件定妆, 之后每张图它都长一个样, 换角度也不变。

物件最容易漂的是几何, 不是材质配色 —— 实测一个宝箱, 材质配色五金件都对得上, 盖子却一会儿是平的方的、一会儿是拱的圆的, 因为原始描述里压根没写盖子什么形状。

appearance 里必须写死这几样:

  • 整体轮廓 + 比例(长方/立方/圆桶, 宽高比)

  • 关键几何: 盖子平的还是拱的、边角方的还是圆的、侧面直的还是弧的、有没有底座

  • 材质 + 主次配色

  • 五金件/纹饰及其位置(锁扣、包角、铆钉在哪) 不要写场景和角度 —— 角度留给 subject_image 的 scene。

定完先看定妆图, 不满意 force=true 重定。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
seedNo
forceNo
widthNo
heightNo
appearanceYes
guidance_scaleNo
num_inference_stepsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
seedNo
errorNo
resizedNo
warningsNo
appearanceNo
error_codeNo
source_sizeNo
stored_sizeNo
imported_fromNo
reference_pathNo

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It does disclose a real behavioral trait: consistency of the object across images and angles, and that geometry drifts most. It also mentions rerolling with force. But it omits key mechanics: whether this is persistent/long-lived (only 'continuity_status' hints at that), idempotency, cost, or that seed/guidance_scale/steps control determinism.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The appearance checklist is genuinely useful and front-loaded, and the scene/angle exclusion is a strong, earned sentence. But the opening anecdote about the treasure chest lid is long and the overall text is padded; it leans more persuasion than spec. Structure is reasonable but not tight.

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?

An output schema exists, so return-value explanation isn't required. For an 8-param generation tool with no annotations, the description focuses almost entirely on the appearance field and lacks behavioral detail on persistence, determinism, and the many unlabeled generation parameters. Adequate for the creative how-to but thin as a full tool contract.

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% across 8 parameters, so the description must compensate. It only meaningfully covers 'appearance' (extensively, with required content), and touches 'force' for rerolls. It says nothing about name, seed, width, height, guidance_scale, or num_inference_steps — six of eight parameters unexplained in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description describes the goal in domain-specific terms ('定妆' = locking in a canonical look for a prop/object so every subsequent image matches it), which clarifies the purpose as creating a persistent object reference. However, it never explicitly states it is the object-creation tool relative to siblings like create_character or create_animal, and the framing is heavily tutorial-flavored rather than naming the operation. The intent is inferable but not crisply stated.

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?

It gives strong guidance on WHAT to put in appearance and what to exclude ('不要写场景和角度 —— 角度留给 subject_image 的 scene'), effectively routing scene/angle work to a sibling. But it gives no guidance on when to use this tool vs. create_character/create_animal, no prerequisites, and the 'force=true' reroll note is the only invocation condition described.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_actorB

删掉一个已铸声的角色。不可逆: 参考音不可复现, 重铸出来是另一个人。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
errorNo
warningsNo
error_codeNo
files_removedNo

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full disclosure burden and does so well: it explicitly warns that the operation is irreversible (不可逆) and explains the concrete consequence that the reference voice cannot be reproduced and a re-created actor would be a different person. It omits permission/auth requirements, but the destructive consequence is unusually well articulated.

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 clauses, front-loaded with the action and immediately followed by the risk. Every word earns its place with no redundancy.

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 described. For a destructive single-parameter tool with no annotations, the description adequately covers purpose, irreversibility and consequence; the main gap is any guidance on how to identify the actor via the name parameter.

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?

There is one required parameter (name) with 0% schema description coverage, and the description adds no information about it whatsoever – no format, matching rule, or identifier guidance. With coverage this low the description should compensate and does not.

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 (删掉/delete) and a qualified resource (一个已铸声的角色 – a voice-cast actor), which is more precise than a bare 'delete actor'. It does not explicitly distinguish itself from the sibling delete_subject, so it falls 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 Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives such as delete_subject or list_actors, and no preconditions for invoking it. The agent must infer usage from the verb alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_subjectA

删掉一个已定妆的角色或物件。不可逆: 定妆图不可复现, 重定出来是另一个。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
errorNo
warningsNo
error_codeNo
files_removedNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does disclose the key destructive trait: the operation is irreversible and the finalized image cannot be reproduced, so re-finalizing yields a different subject. It omits confirmation requirements, permission needs, and whether dependent assets (images, sheets) are also removed.

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, no filler, with the destructive/irreversibility warning front-loaded right after the action statement. Every clause earns its place.

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?

An output schema exists so return values need not be explained, and the irreversibility warning covers the most important behavior. However, for a destructive tool with no annotations and no parameter documentation, the description should say more about what else is destroyed and how it relates to delete_actor.

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 the single 'name' parameter, and the description adds nothing about it — it never clarifies whether 'name' is a subject name, an ID, or whether it must match exactly. For a destructive identifier parameter, leaving it undocumented is a real 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?

States a specific verb (删掉/delete) and resource (一个已定妆的角色或物件 – a finalized character or object), with scope that implicitly distinguishes it from delete_actor by covering subjects of both kinds. Sibling differentiation is only implicit, though; it never names delete_actor or explains why a 'subject' differs from an 'actor'.

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 '已定妆的' implies a precondition (only subjects whose look has been finalized) and '重定出来是另一个' hints that re-creation is an option, but there is no explicit when-to-use/when-not guidance and no routing to alternatives such as delete_actor. Usage must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_imageA

生成一张一次性图片 —— 不保证与任何其它图一致。

会重复出现的角色/物件请先 create_character / create_object 定妆, 再用 subject_image 出图。这个工具适合背景板、UI 底图这类只出现一次的东西。

参数: prompt: 图片描述(英文效果最佳) width/height: 上限 1024 seed: 随机种子(可选) reference_image_path: 参考图的本机路径(可选), 传了就是图生图 num_inference_steps: 采样步数(可选, 不传用引擎默认)。多了更精细也更慢 guidance_scale: 提示词贴合度(可选, 不传用引擎默认)。高了更贴提示词但更容易糊

返回: 本机路径

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
widthNo
heightNo
promptYes
guidance_scaleNo
num_inference_stepsNo
reference_image_pathNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
seedNo
errorNo
sceneNo
widthNo
heightNo
clampedNo
subjectNo
warningsNo
error_codeNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the non-deterministic/one-off nature of the output, that reference_image_path switches to image-to-image mode, and the speed/quality tradeoffs of num_inference_steps and guidance_scale. It stops short of covering permission needs, rate limits, cost, or resolution failure modes, 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?

Front-loads the defining distinction, then the sibling routing, then a compact parameter list, then the return value. Given the 0% schema coverage the parameter section is earned, and there is no filler.

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?

Despite having no annotations and a 7-param schema with no descriptions, the definition covers scope, alternatives, per-parameter semantics, and even the return value (a local path). An output schema exists, so return details are not strictly required, making this fully sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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: every one of the 7 parameters is explained with meaning beyond type, including the 1024 cap on width/height, the optional seed, the img2img behavior triggered by reference_image_path, and the quality/latency and adherence/artifact tradeoffs of the two sampling params.

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 (生成一张一次性图片) and immediately defines the key scope constraint: the output is not guaranteed consistent with any other image. It explicitly distinguishes itself from create_character, create_object, and subject_image, so an agent can route correctly without opening 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 both when-not and when-to-use: recurring characters/objects should go to create_character/create_object then subject_image, while this tool is for backgrounds, UI base images, and other one-off assets. The alternative is named with the condition that selects it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_musicA

生成一段背景音乐(Stable Audio), 返回 WAV 的本机路径。

参数: prompt: 音乐描述(风格/乐器/情绪, 英文效果最佳) seed: 随机种子(可选) duration: 秒数, 上限 120 num_inference_steps: 推理步数(默认 100, 越多越慢)

注意: 出来的是一段有头有尾的音乐, 没有做无缝循环点。要循环播放的 BGM 请自己在编辑器里找循环点, 或把它当作一次性过场音乐。

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
promptYes
durationNo
num_inference_stepsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
errorNo
clampedNo
durationNo
warningsNo
truncatedNo
error_codeNo
requested_durationNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral disclosure burden. It usefully reports that the tool returns a local WAV path, that the output is not seamlessly loopable, that duration is capped at 120 seconds, and that higher inference steps are slower. It does not cover permissions, rate limits, or failure modes, but the core behavioral constraints an agent needs are present.

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 front-loaded with the purpose, then presents parameters in a compact list, and finishes with an important output caveat. Every part earns its place given the lack of schema descriptions, and there is no wasteful repetition.

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?

Although an output schema exists, the description still helpfully notes the returned WAV path. With no annotations and 0% schema parameter coverage, the definition compensates by documenting all parameters and the key output limitation. It is complete enough for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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 explain all four parameters. It does so clearly: prompt is a music description with English working best, seed is optional random, duration is seconds with a 120 upper bound, and num_inference_steps defaults to 100 with more steps being slower. This adds meaning beyond the bare schema types and defaults.

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 states a specific verb and resource: '生成一段背景音乐(Stable Audio), 返回 WAV 的本机路径'. It clearly distinguishes itself from generating speech or sound effects by specifying background music, though it does not explicitly name sibling alternatives such as gen_sfx or generate_speech.

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 description gives an important usage caveat: the output has a beginning and end with no seamless loop point, so for looping BGM the user must find a loop point or treat it as one-shot transition music. However, it does not explicitly state when to use this tool versus generate_speech, gen_sfx, or other audio-generation siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_speechA

一次性旁白 —— 不保证跨句音色一致, 会重复出现的角色请用 create_actor + actor_tts。

适合系统提示音、一次性播报这类"说完就没了"的语音。任何会说第二句的角色都不该 用这个: 同一段 voice 描述的两句台词不是同一个人。

参数: text: 要念的台词, 上限 200 字 voice: 声音的自然语言描述(英文效果最佳), 不传则用中性旁白嗓 seed / speaking_rate: 可选

返回: 24 kHz 单声道 WAV 的本机路径

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
textYes
voiceNo
speaking_rateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
actorNo
errorNo
voiceNo
warningsNo
max_charsNo
truncatedNo
consistentNo
error_codeNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does disclose key traits: no cross-sentence voice consistency, a default neutral narration voice when `voice` is omitted, a 200-character cap, and the output format (24 kHz mono WAV, local path). It does not mention determinism, cost, or latency, so it stops short of exhaustive, but the critical gotcha (voice instability) is stated up front.

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-loads the differentiating constraint before any parameter detail, then uses a clean parameter block and a one-line return note. The extra sentence reinforcing the 'second line' rule is slight redundancy but functions as a strong routing heuristic, so it earns most of its space.

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 4-parameter generation tool with no annotations and a rich sibling set, the description supplies the routing rule, the character-limit constraint, default behavior, and output artifact. With an output schema present it did not need to describe the return, yet the one-line WAV note costs little and removes ambiguity.

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 compensate, and it largely does: `text` gets a 200-character limit, `voice` is explained as a natural-language description with English working best and a documented default, and both are the semantically important ones. `seed` and `speaking_rate` are only labeled '可选' with no explanation of what seed controls, leaving a partial gap.

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 (one-shot narration generation) and immediately scopes it: '一次性旁白 —— 不保证跨句音色一致'. It explicitly names the sibling route (create_actor + actor_tts) that handles the case it does not cover, so an agent can distinguish it from the voice/actor tools without opening 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 both a positive use case (system prompts, one-off announcements, '说完就没了' audio) and an explicit exclusion ('任何会说第二句的角色都不该用这个'), plus the concrete alternative to use instead. This is exactly the when/when-not/alternative structure.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gen_sfxA

合成一枚 sfxr/jsfxr 风格的游戏音效(纯程序化, 不用模型), 返回 WAV 路径。

不要用 generate_music 做音效: 那是扩散模型, 出来的是几十秒的宽带糊音。游戏音效 是 10~200ms 的瞬态, 要精确、即时、可复现 —— 本工具毫秒级出结果, 同 seed 逐字节可复现, 而且完全不占显存。

参数: preset: jump / coin / hit / explosion / powerup / laser / select / hurt seed: 随机种子。给了就在 preset 周围抖动参数(不是抖采样点), 同 seed 结果完全相同; 不给则严格使用 preset 的原始参数。 base_freq: 覆盖基频 Hz (noise 波形下是采样保持的刷新率) wave: 覆盖波形 square / saw / sine / triangle / noise overrides: 覆盖任意合成参数的字典, 例如 {"freq_slide": -3.0, "release": 0.4, "lpf": 0.5, "duty": 0.25} 可覆盖的完整字段名和默认值: 调 sfx_presets()

返回: 44.1kHz 16bit 单声道 WAV 的本机路径。结构化返回里的 params 是这一枚音效 用到的全部合成参数 —— 拿它加一点改动再调一次, 就能做出一整组同族音效。

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
waveNo
presetNoselect
base_freqNo
overridesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
seedNo
waveNo
errorNo
paramsNo
presetNo
durationNo
warningsNo
base_freqNo
error_codeNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses millisecond-level latency, byte-identical reproducibility under a fixed seed, no model/VRAM usage, and the exact output format (44.1kHz 16bit mono WAV path). It stops short of stating file-write/overwrite behavior or where artifacts land, so not 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose then contrast, then a clean params/return block; every section earns its place. Minor redundancy in reiterating seed reproducibility ('同 seed 结果完全相同' and '同 seed 逐字节可复现'), but overall tight and well organized.

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?

Given 5 params with zero schema coverage, a nested overrides object, an existing output schema, and no annotations, the description is complete enough for correct invocation: all inputs are explained, the output artifact and its structured params are described, and reproducibility semantics are stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it does: it enumerates preset and wave values, explains seed semantics precisely (jitter around the preset's parameters, not sample points; identical seed yields identical output), defines base_freq incl. its meaning under noise, and points to sfx_presets() for valid overrides keys with a worked example.

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 (synthesize a programmatic sfxr/jsfxr-style game sound effect) and immediately distinguishes itself from the sibling generate_music. An agent can tell exactly what it produces and what it does not.

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 names the alternative (generate_music) and the condition that rules it out: diffusion music is tens-of-seconds broadband mush, whereas game SFX are 10~200ms transients needing precision and immediacy. This is textbook when-to-use/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_actorA

用一段现成的录音铸声 —— 声音是别处做的(真人录音 / 其它 TTS)也照样能保持一致。

和 create_actor 得到的东西完全一样, 只是参考音由你提供而不是我们生成。之后 actor_tts 让他说任意台词, 音色都来自这段录音。

参数: name: 角色名, 之后 actor_tts 用它指代 audio_path: 录音的本机路径。16-bit PCM WAV, 2~30 秒, 单人清唱式的干净人声 最好(没有背景音乐和混响)。采样率/声道数会自动转成 24 kHz 单声道。 其它格式先转: ffmpeg -i 原文件 -acodec pcm_s16le -ac 1 -ar 24000 ref.wav transcript: 那段录音里念的是什么。不给就自动听写一遍填上, 但那是机器听的, 会在返回里标出来让你核 —— 克隆模型拿它对齐音频和文字, 错一个词 音色就会明显不对。手上有准确的文字就直接给, 别让它猜。 force: 覆盖已有角色

注意: 你有权使用这段声音才导入它。克隆一个真人的嗓子在很多地方是需要本人同意的。

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
forceNo
audio_pathYes
transcriptNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
seedNo
errorNo
voiceNo
warningsNo
truncatedNo
error_codeNo
transcriptNo
ref_secondsNo
imported_fromNo
source_formatNo
reference_pathNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

由于未提供 annotations,描述承担了全部说明责任,且完成得非常好:它详细说明了音频格式约束(16 位 PCM WAV、2–30 秒、尽可能为干净的单人无伴奏人声)、自动转换行为(转为 24 kHz 单声道)、ffmpeg 回退命令、自动转录标注质量警告、force 覆盖行为以及同意/授权注意事项。这远超 schema 和 annotations 所包含的信息。

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?

开篇一句话简洁地前载了核心目的,随后用带标签的段落解释参数和注意事项。篇幅合理,每句话都提供了有用信息,但 ffmpeg 命令和转录警告略长。

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?

对于一个包含 4 个参数、无 annotations、0% schema 描述覆盖率的变更工具,描述提供了智能体正确调用所需的一切:用途、与兄弟工具的关系、每个参数的含义、输入格式要求、自动转换行为,以及授权注意事项。由于存在 output schema,无需再解释返回值。

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

schema 描述覆盖率为 0%,因此描述必须弥补这一差距;它确实做到了,为全部四个参数提供了含义:name(供 actor_tts 引用)、audio_path(本地路径及格式和时长规格)、transcript(用于克隆模型对齐,自动生成内容会被标记供审查)和 force(覆盖已有角色)。这已远超 schema 中裸属性名称所提供的内容。

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?

明确说明了动作(从一段现成录音铸造声音)和资源(角色),并直接说明它与 create_actor 的区别——唯一区别在于参考音频是由用户提供而非系统生成。这使智能体无需查看任一 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?

清楚地说明了后续流程(actor_tts 稍后通过名称引用该角色),并给出何时提供 transcript 与让系统自动听写的条件。缺少与 import_subject 等同类导入工具的明确对比,但对于何时使用此工具已足够清晰。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_subjectA

用一张现成的图定妆 —— 角色/物件是别处画的也照样能保持一致。

和 create_character / create_object 得到的东西完全一样, 只是定妆图由你提供。 之后 subject_image 让它出任意场景图, 外观都来自这张图。

参数: name: 名字, 之后 subject_image 用它指代 image_path: 参考图的本机路径。要求和我们自己生成的定妆图一样: 单个主体、 正面或四分之三视角、背景干净、看得全。一张有场景有动作的插画 当参考图, 场景会跟着一起被复制过去。 appearance: 这是什么的文字描述 —— 必填, 它会被拼进之后每一张场景图的提示词。 只给参考图而不给描述, 模型对"这是什么"没有着落, 外观照样会漂。 写法同 create_character / create_animal / create_object 的要求。 kind: character / animal / object force: 覆盖已有的

大图会缩到 1024 以内; 带透明通道的图会转成 RGB(透明区交给引擎会变成黑块)。

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNocharacter
nameYes
forceNo
appearanceYes
image_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
kindNo
nameNo
seedNo
errorNo
resizedNo
warningsNo
appearanceNo
error_codeNo
source_sizeNo
stored_sizeNo
imported_fromNo
reference_pathNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden, and it delivers real behavioral detail: images over 1024 are downscaled, alpha channels are converted to RGB (transparency becomes black), and force overwrites an existing subject. It also warns that a scene-containing reference will replicate that scene. Missing permission/auth or failure-mode disclosure 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose before dropping into a structured 参数 list, and each parameter note earns its place with actionable detail. Slightly long, but the length is justified by the 0% schema coverage it has to make up for.

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 mutation tool with no annotations, the description covers overwrite semantics, image preprocessing, and reference-image constraints; the existence of an output schema means return values need not be explained. Auth/permission requirements and error behavior remain unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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 documents every one of the five parameters: name (used later by subject_image), image_path (with concrete requirements: single subject, front or 3/4 view, clean background, fully visible), appearance (required, injected into every subsequent scene prompt, with a warning about drift if omitted), kind, and force.

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 action (import a ready-made image to define a subject's look) and explicitly distinguishes it from siblings: the result is identical to create_character/create_object, only the reference image is user-supplied. An agent can tell it apart from create_character 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?

Explains the workflow context clearly: use this when you already have a reference image, then subject_image generates arbitrary scene images whose appearance derives from that image. The comparison to create_character/create_object implicitly covers the alternative, though it never states an explicit when-not-to-use rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_actorsB

列出已铸声的角色(名字 + 当初的声音描述 + 铸声时间)。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
countNo
errorNo
actorsNo
warningsNo
error_codeNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. '列出' implies a read-only, non-mutating operation, and the parenthetical clarifies the returned content, but there is no mention of ordering, pagination, permissions, or what an empty result means. Adequate but thin for a tool with zero annotation coverage.

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 no filler. It's efficient, though the parenthetical return-field list is somewhat redundant given an output schema exists.

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 parameterless read tool with an output schema, the description supplies enough for correct invocation: it identifies the resource and the data returned. Only the lack of any routing hint against sibling list tools keeps it from a 5.

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 the baseline is 4. The description correctly adds nothing about inputs, which is appropriate here.

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 (列出/list) with a scoped resource (已铸声的角色 – characters that have had voices cast) and even enumerates the returned fields. It's clearly distinguishable from create_actor/delete_actor, but it does not explicitly differentiate itself from the nearby list_subjects sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no mention of prerequisites, and no reference to alternatives such as list_subjects or actor_tts. Usage is only inferable from the verb 'list', which is weak for a tool with this many siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_subjectsA

列出已定妆的角色、动物和物件。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
countNo
errorNo
subjectsNo
warningsNo
error_codeNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. The verb 列出 implies a read-only list operation, which gives basic safety context, but it does not disclose pagination, return size, or other behavioral details.

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 compact sentence that front-loads the core action and scope with no wasted words.

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 list tool with an output schema, the description is nearly complete: it names the resource and the finalized-only scope. A brief note on how it relates to sibling listing tools would close the remaining gap.

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 has zero parameters, so per the rubric the baseline is 4. The description does not need to compensate for any schema 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 states a specific verb (列出) and resource (角色、动物和物件), and the qualifier 已定妆 narrows the scope. It is clear enough to distinguish from generic subject listing, but it does not explicitly contrast itself with siblings such as list_actors.

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: the tool lists finalized characters, animals, and objects. There is no explicit when-to-use guidance, no exclusions, and no mention of alternatives like list_actors for unfinalized actors.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_bgA

抠掉图片背景, 输出真正带 alpha 通道的 RGBA PNG。

生图模型画不出 alpha: 你让它画"透明背景", 它是把 PS 那种灰白棋盘格当成不透明 像素画出来的。做游戏精灵图必须用本工具把它转成真的 RGBA。

参数: image_path: 图片的本机路径(其它工具返回的路径可直接用) image_base64: 或者直接给 base64 mode: auto (默认, 按结构证据判断是不是棋盘格: 恰好两级灰度 + 周期方格; 不是就走 通用抠图) / checker (强制只抠棋盘格) / rembg (强制通用显著物体抠图, CPU) quality: best (birefnet-general-lite, ~7s, 峰值内存 ~6.8 GB) / fast (u2netp, ~0.6s, 峰值 ~1.3 GB)。只影响 rembg 分支。 不传则用安装时按本机内存定下的默认值。

返回: RGBA PNG 的本机路径, 附带实际走的分支与透明像素占比。抠出来明显不对 (几乎全透明 / 几乎没抠掉 / 碎成一堆小块 / 主体被啃出洞) 时会附一行 ⚠️ 警告 —— 那种结果别直接用。

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoauto
qualityNo
image_pathNo
image_base64No

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
errorNo
modelNo
metricsNo
warningsNo
mode_usedNo
error_codeNo
checker_evidenceNo
transparent_ratioNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full behavioral burden. It does an excellent job: it explains what the checkerboard artifact is, details mode-specific behaviors (auto detection heuristics, forced checker, forced rembg), documents quality trade-offs (speed vs. memory), and discloses return format plus warning conditions for bad results. Minor gap: it doesn't state whether the operation is idempotent or what happens if both image_path and image_base64 are provided.

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?

The description is front-loaded with the core purpose and rationale before diving into parameters. It is thorough but not padded; every section earns its place. The only minor deduction is that the Chinese formatting and emoji might slightly increase parsing overhead for an agent, though the structure is logical and easy to scan.

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?

Despite having no annotations and 0% schema description coverage, the description covers everything an agent needs: purpose, usage context, all parameters with semantics, return format (even though an output schema exists, the description adds warning conditions not captured there), and failure modes. An agent can call this tool correctly without opening the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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. It fully documents all four parameters: image_path (local path accepted directly from other tools), image_base64 (alternative input), mode (three valid values with exact behavioral definitions), and quality (two values with model names, runtime, and peak memory, plus note on default behavior based on system memory). This is exemplary compensation for missing schema descriptions.

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 states a specific verb and resource (remove image background, output real RGBA PNG with alpha) and explains the motivating scenario (generative models paint checkerboards as opaque pixels). It clearly distinguishes itself from siblings like generate_image or slice_sheet, which do not perform background removal.

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?

The description clearly indicates when to use it ('做游戏精灵图必须用本工具把它转成真的 RGBA') and explains the mode selection logic. It does not explicitly state when NOT to use the tool, but the context is clear enough for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sfx_presetsA

列出 gen_sfx 能用的 preset, 以及 overrides 里可以覆盖的全部字段和它们的默认值。

先看这里再去 overrides: 字段名写错了 gen_sfx 会直接失败, 而"有哪些字段"是猜不出来的 (占空比扫描叫 duty_sweep 还是 duty_slide, 低通叫 lpf 还是 cutoff)。

返回: preset 名单 + 参数默认值表 + 采样率。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
rateNo
errorNo
paramsNo
presetsNo
warningsNo
error_codeNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden and does disclose useful traits: exact field-name sensitivity that causes hard failure in gen_sfx, the fact that valid field names cannot be inferred, and the shape of the return (preset list, defaults table, sample rate). It is a read-only listing so auth/rate-limit disclosure is not critical, but no explicit statement of read-only safety is given.

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-loads the purpose, then the reason to use it, then the return contents. The parenthetical naming examples look verbose but each one illustrates a real ambiguity risk, so every sentence earns its place.

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 zero-parameter discovery tool with an output schema present, the definition is complete: it explains what to consult it for, why it matters, and sums up the return contents. Nothing an agent needs to call it or act on the result is missing.

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?

Zero input parameters, so the baseline is 4. The description additionally explains what the returned field table means and gives examples of ambiguous field names (duty_sweep vs duty_slide, lpf vs cutoff), adding interpretive value beyond the empty schema.

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 (list) and resource (presets usable by gen_sfx), and goes further by naming the overrides fields and their defaults as part of the payload. It is clearly distinguishable from the sibling gen_sfx: this is the discovery/companion tool the agent consults before invoking gen_sfx.

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 explicit routing ('先看这里再去 overrides' – look here before touching overrides) tied to a concrete failure mode (wrong field names make gen_sfx fail). It identifies the sibling gen_sfx as the downstream consumer and the reason guessing field names is unsafe.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

slice_sheetA

把排成网格的 sprite sheet 切成单帧 PNG。

让生图模型画"4 帧动画"时它会摆成 2x2 网格而不是 4 张图, 用本工具切开。

参数: image_path / image_base64: 同其它图片工具 rows, cols: 网格行列数(二者都给) frame_width, frame_height: 单帧像素尺寸(与 rows+cols 二选一) trim: 是否把每帧裁到非透明/非背景的外接框(默认 True)

返回: 各帧 PNG 的本机路径

ParametersJSON Schema
NameRequiredDescriptionDefault
colsNo
rowsNo
trimNo
image_pathNo
frame_widthNo
frame_heightNo
image_base64No

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
errorNo
pathsNo
framesNo
warningsNo
error_codeNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden, and it does useful work: it discloses the trim default (True), the mutual-exclusivity rule between rows/cols and frame_width/frame_height, and the fact that slicing writes per-frame PNG files to local paths. It does not discuss overwrite behavior or permissions, but the essential write semantics are visible.

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 verb+resource, then the rationale, then a compact parameter block and the return value. Every segment earns its place; only the deferral of image input semantics to other tools is slightly loose.

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 spelled out, yet the description still names the return shape (local PNG paths). With no annotations and zero schema descriptions, the description supplies the constraints an agent needs to choose between the two sizing modes, making it adequately complete.

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% and all 7 params are bare titles, so the description must compensate and largely does: it documents the two image-input alternatives, the rows/cols pair, the frame_width/frame_height alternative, the trim flag with its default, and the exclusivity constraint that the schema cannot express. Only the image_path vs image_base64 distinction is deferred to 'same as other image tools'.

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 ('把排成网格的 sprite sheet 切成单帧 PNG') and even explains the motivating case (image models laying out 2x2 grids instead of separate frames). No sibling tool covers sheet slicing, so the distinction is unambiguous.

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?

Gives a concrete trigger ('让生图模型画"4 帧动画"时它会摆成 2x2 网格而不是 4 张图, 用本工具切开'), which tells the agent exactly when this tool applies. It stops short of naming alternatives or stating when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

subject_imageA

让某个已定妆的角色或物件出一张新图, 外观与它之前每一张都一致。

做游戏素材用这个, 不要用 generate_image —— 后者每张长相会变。 subject 不存在会告诉你先去 create_character / create_animal / create_object。

参数: subject: 名字(定妆时定的) scene: 这张图里它在干什么 / 在哪 / 什么角度 —— 只写场景动作视角, 身份由定妆图决定。例如 "opened, seen from behind, on a stone floor"。 人物/动物还可以在这里换装: "wearing heavy red armor" 会换掉定妆图 里那身衣服而保住脸。 width/height: 上限 1024 seed: 随机种子(可选) num_inference_steps: 采样步数(可选, 不传用引擎默认)。多了更精细也更慢 guidance_scale: 提示词贴合度(可选, 不传用引擎默认)。高了更贴提示词但更容易糊

返回: 本机路径

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo
sceneYes
widthNo
heightNo
subjectYes
guidance_scaleNo
num_inference_stepsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
pathNo
seedNo
errorNo
sceneNo
widthNo
heightNo
clampedNo
subjectNo
warningsNo
error_codeNo

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations the description carries the full burden and does well: it discloses the missing-subject failure path, the 1024 dimension cap, that unspecified seed/steps/guidance fall back to engine defaults, and the slower-but-finer tradeoff of more steps. It does not cover output file format, overwrite behavior, or reproducibility guarantees, so it falls short of 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?

Purpose and the sibling warning are front-loaded in the first two lines, followed by a clean parameter block. Every sentence earns its place — the dress/face example in particular prevents a common misuse without padding.

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?

An output schema exists, so the return value needs no elaboration beyond the one-line note that it yields a local path. Across a 7-parameter, 2-required generation tool, the description covers invocation, prerequisites, dimension limits, optional-parameter defaults, and identity/scene separation — nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/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 documents all seven parameters. Critically it adds semantics the schema cannot: scene controls action/place/angle only while identity comes from the dated 定妆 image, and clothing can be swapped via scene text ('wearing heavy red armor') while preserving the face. That is genuine meaning beyond the schema.

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?

Specific verb+resource (出一张新图 of a 已定妆 character/object) plus the scope constraint that appearance must stay consistent with every prior image. It is immediately distinguishable from the sibling generate_image. No ambiguity about what the tool produces.

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 routes the agent: use this for game assets 不要用 generate_image, with the reason (generate_image mutates the face each time). It also states the prerequisite path — if subject doesn't exist, go to create_character/create_animal/create_object first. Both when-to-use and the alternative are named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transcribeA

听一段录音, 返回里面说的文字。

两个用处, 都是"核对"而不是"生产字幕":

  • 导入参考音时不知道那段录音念的是什么 —— import_actor 不给 transcript 就是 自动调它, 也可以先单独调一次看看听出来的对不对。

  • 验稿: 配完一句台词, 听回来和台词原文比一比。克隆模型偶尔会吞掉尾巴, 而那种"少了半句"的产物听起来完全正常, 只有把它听成文字才看得见。

参数: audio_path: 录音的本机路径, 只收 WAV language: 语种提示 (可选, 如 zh / en)。不给就让模型自己判 —— 它本来就带语种识别, 只有在把方言听成另一种语言时才需要指定。

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNo
audio_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
textNo
errorNo
sourceNo
languageNo
warningsNo
error_codeNo
audio_secondsNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses auto-invocation by import_actor, that the model has built-in language identification, and the real-world failure mode (clone models dropping sentence tails) that motivates verification. It stops short of stating cost/latency or error behavior, so not a full 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?

Front-loads the core behavior, then uses clearly sectioned blocks for uses and parameters. The script-verification rationale is slightly verbose but each sentence contributes useful context, so only marginally over-length.

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?

An output schema exists, so return values need not be explained. Purpose, both parameters with constraints, and both usage modes are covered, leaving nothing an agent needs in order to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and does: audio_path is a local path restricted to WAV, and language is an optional hint (zh/en) whose default is model self-detection, with guidance to supply it only when a dialect is misclassified. This adds meaning well beyond the bare schema.

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+resource+output: listen to a recording and return the spoken text as words. It also distinguishes itself from siblings by clarifying it is for verification, not subtitle production, and that import_actor invokes it automatically.

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?

Enumerates two concrete when-to-use scenarios (checking reference audio during import, validating a dubbed line against its script text) and explicitly excludes the wrong use case ('核对' not '生产字幕'). It also names how it relates to import_actor's automatic invocation.

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. 21 tool updatesv0.5.5
    • First observedactor_tts
    • First observedcontinuity_status
    • First observedcreate_actor
    • First observedcreate_animal
    • First observedcreate_character
    • First observedcreate_object
    • First observeddelete_actor
    • First observeddelete_subject
    • First observedgen_sfx
    • First observedgenerate_image
    • First observedgenerate_music
    • First observedgenerate_speech
    • First observedimport_actor
    • First observedimport_subject
    • First observedlist_actors
    • First observedlist_subjects
    • First observedremove_bg
    • First observedsfx_presets
    • First observedslice_sheet
    • First observedsubject_image
    • First observedtranscribe

TDQS

A3.9/5.0

Scored across 21 tools

Disambiguation5/5

Each tool has a clearly distinct purpose, and the descriptions explicitly draw the boundaries between the easily-confused pairs: create_actor+actor_tts (consistent voice) vs generate_speech (one-off), and create_character/subject_image (consistent appearance) vs generate_image (one-off). The casting tools split cleanly by subject kind (character/animal/object) and by source (generate vs import), leaving no meaningful overlap.

Naming Consistency4/5

Most names follow a clean verb_noun pattern (create_actor, import_actor, list_actors, delete_actor, create_character, generate_image, remove_bg, slice_sheet). A minority deviate with noun_verb or bare-noun forms (actor_tts, subject_image, sfx_presets, continuity_status) and one abbreviation (gen_sfx vs generate_speech/generate_music/generate_image), but the scheme remains readable and predictable overall.

Tool Count4/5

21 tools is on the heavier side, but the server spans several genuinely separate sub-domains (voice casting, image casting, image post-processing, music, procedural SFX, status), so the count is justified rather than padded. Each tool maps to a real capability with no obvious filler.

Completeness4/5

Coverage is strong: full lifecycle for actors and subjects (create/import/list/delete), plus generation, transcription, background removal, sprite slicing, music, SFX, and a diagnostic status tool. The only minor gap is no in-place update/edit for an actor or subject (you must delete and re-cast), which agents can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    A sophisticated MCP server providing advanced memory capabilities with RAG, hallucination detection, and enterprise-grade AI infrastructure for intelligent agent ecosystems.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    An advanced MCP server that provides stateful voice-controlled AGI capabilities with local STT, TTS, and intent detection. It enables users to execute tools, manage memory, and conduct research through natural multi-turn dialogue with low-latency performance tracking.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that runs Stability AI's Stable Audio Open 1.0 locally on NVIDIA GPUs, enabling AI agents to generate broadcast-quality 44.1 kHz stereo WAV sound effects from text prompts fully offline with no API costs.
    Apache 2.0