Skip to main content
Glama

jianying-mcp

Release License

Generate JianYing Pro (剪映专业版) draft projects programmatically — as a MiniMax Code Plugin, an MCP server, or a standalone Node library.

Zero runtime dependencies. Cross-platform (macOS / Windows). No GUI automation.

English · 中文


What this is

A re-implementation of the JianYing draft-generation capability, rebuilt from the JianYing draft file format rather than from an existing tool's code path.

The upstream community skill (jianying-editor-skill) works by asking the LLM to write a fresh Python script for every single edit. That produces non-reproducible output and litters your project with throwaway files. This project exposes the same capability as 13 deterministic MCP tools — one call, one structured result, no code generation.


Related MCP server: YoloCut

Why the format was reverse-engineered

The claim "豆包 can control 剪映" circulates widely and is usually wrong. The actual chain is:

豆包 (writes script / storyboard)
   → jianying-editor Skill (writes draft files)
      → 剪映专业版 (opens the draft)

ByteDance's own desktop app does not implement the draft protocol. A static analysis of 抖音.app's app.asar (2320 JavaScript sources, via REA) found zero matches for draft_content, draft_info, lveditor, jianying or com.lemon.lv.

So there is no official API and no native bridge. The skill writes draft files to a local directory, and JianYing picks them up. This project does the same thing — but with a verified, documented implementation.


Install

As a MiniMax Code Plugin

git clone https://github.com/Ppppan9/jianying-mcp.git
cp -r jianying-mcp/plugin ~/.minimax/plugins/jianying-editor

Or take the prebuilt package from the latest release (jianying-editor-plugin-vX.Y.Z.tar.gz) — self-contained, no build step.

Restart MiniMax Code. The plugin is discovered automatically and the jianying-editor MCP server becomes available.

As a standalone MCP server

{
  "mcpServers": {
    "jianying-editor": {
      "command": "node",
      "args": ["/absolute/path/to/jianying-mcp/dist/server.js"]
    }
  }
}

As a library

npm install
npm run build

Tools

Tool

Purpose

jianying_create_draft

Create a project; canvas auto-adapts to the first video

jianying_open_draft

Open an existing draft and resume editing it

jianying_list_drafts

List drafts with duration and canvas size

jianying_add_video

Add a video/image clip to a video track

jianying_add_audio

Add BGM / voiceover / SFX to an audio track

jianying_add_text

Add a title or a single caption (use track: 1 so it can coexist with captions)

jianying_add_subtitles

Add a full subtitle track from a script (~18 chars/line)

jianying_remove_media

Remove every clip referencing a media file, plus its orphaned materials

jianying_save_draft

Write the draft to disk

jianying_inspect_draft

Structured timeline summary with caption text — the acceptance check

jianying_export_srt

Export every text track as SRT

jianying_probe_media

Probe duration / resolution / type of a media file

jianying_close_draft

Close an open draft and release its memory

Guards

The server refuses to produce a broken draft, and refuses to destroy anything it was not asked to destroy. Each of these raises an error instead of silently writing a bad file:

  • Overlapping clips on the same track are rejected (adjacent clips are fine).

  • Source ranges beyond the media duration are rejected.

  • A file with a video track cannot be used as an audio material, and an audio-only file cannot be used as a video material.

  • Negative start times, durations and fades are rejected.

  • Re-opening an already open draft is refused, so an unsaved timeline is never silently discarded.

  • Creating a draft whose name already exists on disk is refused unless overwrite: true is passed explicitly.

  • Overwriting a directory that is not a draft is refused.

  • Unsafe draft names (.., ., Windows device names) are rejected.

  • export_srt refuses to overwrite an existing file and refuses a non-.srt output path — the path comes from the caller and could point at source media.

A rejected call leaves nothing behind: no orphan material, no copied media in the draft.


Example

# 1. Probe first — never guess durations
jianying_probe_media filePath=/abs/01_hook.mp4
#   → { "kind": "video", "durationSeconds": 3, "width": 1080, "height": 1920 }

# 2. Create the project (canvas auto-adapts to the footage)
jianying_create_draft name=ad_01 fps=30

# 3. Lay the storyboard
jianying_add_video name=ad_01 filePath=/abs/01_hook.mp4 start=0 duration=3
jianying_add_video name=ad_01 filePath=/abs/02_demo.mp4 start=3 duration=4

# 4. Audio: BGM on track 0, narration on track 1
jianying_add_audio name=ad_01 filePath=/abs/bgm.mp3 start=0 track=0 volume=0.25
jianying_add_audio name=ad_01 filePath=/abs/voice.mp3 start=0 track=1 volume=1.0

# 5. Subtitles
jianying_add_subtitles name=ad_01 script="你的前三秒决定完播率。" start=0.5 duration=7

# 6. Save, then verify
jianying_save_draft name=ad_01
jianying_inspect_draft name=ad_01

The draft appears in JianYing's project list immediately. Export is manual — see Limitations.


Verification

This project was validated by diffing its output against the reference implementation, field by field, in three layers.

npm install && npm run build
bash scripts/make_test_media.sh

# 1. end-to-end functional suite
node dist/verify.js

# 2. differential scenarios against the reference library
export JY_UPSTREAM_SKILL=/path/to/jianying-editor-skill
export JY_UPSTREAM_PYTHON=/path/to/python-with-pymediainfo
node dist/diff_scenarios.js "$JY_UPSTREAM_SKILL" ./test-media ./diff_scenarios

# 3. full-draft diff against the wrapper skill
python3 scripts/gen_upstream_same.py
node dist/gen_compare.js ./compare_drafts/mcp
python3 scripts/compare_drafts.py \
    compare_drafts/upstream/Compare_Up \
    compare_drafts/mcp/Compare_Mcp

# 4. every refusal must actually happen
node dist/guard_coverage.js ./test-media ./out_drafts/guards

# 5. the wire protocol must never leave a caller waiting
node dist/protocol_check.js

# 6. the suite must be able to fail
node dist/mutation_check.js ./test-media

# 7. the documented calls have to work
node dist/docs_check.js

# 8. a hostile draft must not crash the server
node dist/loader_check.js

# 9. the draft has to match the installed JianYing
node dist/format_check.js
[1] verify.js            Result: 175 passed, 0 failed
[2] diff_scenarios.js    Scenarios: 12 matched, 0 differed
[3] compare_drafts.py    [A] Structural diff: 0 difference(s)
                         VERDICT: PASS
[4] compare_meta_info.py VERDICT: MATCH (25 fields vs the reference template)
[5] guard_coverage.js  Guards: 34 enforced, 0 not enforced
[6] protocol_check.js   Protocol: 34 passed, 0 failed
[7] mutation_check.js   Mutations: 34 of 34 caught, 0 survived
[8] docs_check.js      Documentation: 40 passed, 0 failed
[9] loader_check.js    Loader: 21 passed, 0 failed
[10] format_check.js   Format: 7 passed, 0 failed

The fifth suite is a different question from the others: not "does the draft come out right" but "does every refusal actually happen". A guard that is never reached is a guard that does not protect.

The sixth suite asks the same question of the wire protocol: a request that arrives must always get an answer, and a message the server cannot read must produce an error rather than silence. It found that a malformed line, a non-object message and a request with a null id were all dropped without a reply — the caller waited forever for an answer that never came.

The seventh suite is the one that keeps the other six honest. It breaks the engine on purpose, one rule at a time, and the suite has to notice. A green suite proves nothing until you know it can go red.

The ninth suite feeds the loader hostile files: a draft_info.json holding an array, a string, null, or an object with no tracks in it, a material bucket whose value is not a list. It found that those were read as an empty draft — so saving one would have overwritten the user's file with nothing, and a null would have thrown a TypeError.

The eighth suite makes the documentation executable. Every call the Skill file and this README show is sent to the server, and it has to come back without an argument complaint — the agent follows the documentation, so a documented call that the server refuses is a documented call that does not work. It also checks that every tool the server offers is mentioned in the Skill file; jianying_remove_media was missing entirely, so the agent had no idea it existed.

The differential harness also runs a load → save round trip: a draft seeded with effects, stickers, transitions and a media bin is opened, saved and compared. It is what catches the silent data loss that a generate-and-compare check cannot see.

The round trip is compared against the reference implementation's own round trip on the same seed. The question is not whether the two files are identical — they write the timeline differently — but whether this implementation keeps what the reference keeps. The reference loads the whole document and overwrites only the keys it models; everything else survives. That comparison is what found the top-level and config keys being dropped, and it names them when they are lost again.

Layer 2 is the important one: it drives the underlying pyJianYingDraft library, not the wrapper skill, because the wrapper silently drops clip speed, audio fades and out-of-range validation. It covers still images, clip speed, source offsets, multiple tracks, audio fades, boundary durations, text and caption styles, overlaps, out-of-range requests and media removal.

The implementation went through two review rounds. The first comparison produced 62 differences. A differential review against the reference library found 8 more in areas the basic comparison never reached — the missing speeds materials, wrong per-type segment fields, a wrong render_index, two misspelled material buckets, inverted clip-speed semantics, and attribute being used as a track index instead of a mute flag. A second, adversarial review found 21 further issues, of which the substantive ones were: create_draft deleting an existing draft before refusing to open it, the media cache letting a video track reference an audio material, ms being parsed as minutes, a non-idempotent name sanitisation that made a draft unaddressable, cover art being mistaken for a video track, and export_srt overwriting whatever file it was pointed at. A third review of those fixes caught one regression the second round introduced — a video whose audio track was shorter than its picture had its material duration truncated to the audio length — along with JPEG stills being unusable and a malformed track index writing render_index: null into the draft. A fourth review confirmed those fixes and closed the last residuals: a decoder reporting an unknown duration could still write null into a draft, a still image without an explicit duration became a 40 millisecond blip, and the still-image heuristic broke on ffprobe builds that report an unknown frame count as "N/A". A fifth review closed the last residuals: a still image was classified as a video material instead of a photo, an animated image's real length was overwritten by the fallback, an audio file with an unreadable duration was refused instead of falling back, and a subtitle conflict reported the wrong track. A sixth review caught a regression in the fifth round — a still image that ffprobe could not read was written as a video material — and exposed a deployment problem: a GUI-launched app inherits a minimal PATH, so ffprobe, installed by Homebrew under /opt/homebrew/bin, was not on it. The prober now searches the usual install locations itself. A seventh review found the most serious defect of all: jianying_open_draft advertised "resume editing" but had no loader at all — it could only delete the draft and hand back an empty timeline, so an agent that hit the "already exists" error and retried with overwrite would destroy the user's project. The draft is now read back into memory, edited and saved again without losing anything. The same review found that a single maxChars: 0 argument drove the subtitle splitter into a loop that allocated 2.3 GB before V8 gave up.

A final pass closed the remaining gaps: the draft registry entry now matches the reference template field for field (it had a different id shape, three material types instead of seven, and a null where the template has a list), the macOS draft location now includes the domestic build's container (com.lemon.jianyingpro), an animated GIF is no longer mistaken for a still image, and the numeric values written straight into the draft — colour components, alpha, font size, alignment, volume, canvas size and frame rate — are validated instead of being passed through unchecked.

An eighth review then found that the loader was the weak point: opening a draft and saving it again stripped every material the engine does not model (effects, stickers, transitions, masks, keyframes) and could delete the media bin — clips that are staged but not on the timeline. The reference implementation carries that material through, and so does this one now. The round-trip check was added to the harness at the same time, because the generate-and-compare check could never have caught it.

A further pass found that saving was not atomic: the four files of a draft were written one after another, so a failure part-way through left a mix of old and new files. The save now stages every file and renames them into place together, keeping the previous version aside so it can be restored. Two more defects came out of probing the paths the earlier rounds had not touched: a photo in the images bucket was moved to videos on the way through, and adding a file that a loaded draft already held created a duplicate material for it.

The full contract, including every rule now enforced, is in docs/DRAFT_FORMAT.md.

scripts/probe_upstream_contract.py prints the reference library's actual behaviour for each rule — use it to re-check anything before changing the engine.


Layout

src/
  draft.ts         # the draft engine — the whole format contract lives here
  server.ts        # MCP protocol layer (zero-dependency JSON-RPC over stdio)
  mcp-client.ts    # minimal MCP client, used by the test harnesses
  verify.ts        # end-to-end verification harness
  diff_scenarios.ts# differential scenarios against the reference library
  gen_compare.ts   # generates the comparison draft
  ad_scenario.ts   # realistic ad-creative walkthrough
plugin/            # ready-to-install MiniMax Code Plugin package
scripts/
  compare_drafts.py          # normalized structural diff vs the reference
  gen_upstream_same.py       # drives the reference wrapper
  probe_upstream_contract.py # prints the reference library's actual rules
  make_test_media.sh         # generates the synthetic test media
  validate_plugin.py         # validates a Plugin package against the V1 spec
docs/
  DRAFT_FORMAT.md        # the reverse-engineered format contract

Hands-on verification

The automated suites prove the draft matches the reference implementation field for field. They cannot prove that JianYing itself opens it, because the application is not involved in the test.

npm run verify-drafts produces three drafts for opening by hand — one covering the basics (video, music, voice-over, subtitles, a title), one covering the edges (a still image, a speed change, adjacent clips, a second video track), and one that is opened, edited and saved again. The generator makes its own media, so it runs anywhere ffmpeg does.

Limitations

  • Export is manual. JianYing has no reliable headless render path on macOS. Generate the draft, open it in JianYing, export by hand.

  • macOS and Windows only for the drafts themselves; the format is the same on both.

  • Core editing only. The schema supports keyframes, effects, transitions and stickers; this implementation covers the video / audio / text core.

  • No cloud assets. JianYing's cloud music and effect library is not integrated.

  • Not affiliated with ByteDance. JianYing and CapCut are trademarks of their respective owners.


License

MIT — see LICENSE.

Acknowledgements and third-party attribution are in NOTICE. This project is an independent implementation; no upstream source code is redistributed here.


中文

用 MCP 工具直接生成剪映专业版工程草稿:排素材、加字幕配音配乐、保存草稿、导出 SRT。

零运行时依赖,不做 GUI 自动化,macOS / Windows 通用。

与现有方案的差别

社区现有的 jianying-editor-skill 是让 LLM 每次写一段临时 Python 脚本再跑一遍 —— 产出不可复现,还会在项目里堆垃圾文件。

本项目把同样的能力做成 12 个确定性原子工具:调一次拿一份结构化 JSON,不用写代码。

「豆包能操控剪映」的真相

网上流传的说法大多不对。真实链路是:

豆包(写脚本/分镜)→ jianying-editor 技能(写草稿文件)→ 剪映(打开草稿)

字节自家桌面壳并不实现剪映草稿协议。 用 REA 静态分析 抖音.app 的 app.asar(2320 个 JS 源文件),搜索 draft_content / draft_info / lveditor / jianying / com.lemon.lv —— 零命中。

所以不存在官方 API,也不存在原生打通。技能只是往本地草稿目录写文件,剪映自己捡起来。本项目做的是同一件事,但实现经过验证且有完整文档。

验证方式

用上游实现当预言机,分三层逐字段对比:

[1] verify.js            Result: 175 passed, 0 failed
[2] diff_scenarios.js    Scenarios: 12 matched, 0 differed
[3] compare_drafts.py    [A] Structural diff: 0 difference(s)
                         VERDICT: PASS
[4] compare_meta_info.py VERDICT: MATCH (25 fields vs the reference template)
[5] guard_coverage.js  Guards: 34 enforced, 0 not enforced
[6] protocol_check.js   Protocol: 34 passed, 0 failed
[7] mutation_check.js   Mutations: 34 of 34 caught, 0 survived
[8] docs_check.js      Documentation: 40 passed, 0 failed
[9] loader_check.js    Loader: 21 passed, 0 failed
[10] format_check.js   Format: 7 passed, 0 failed

The fifth suite is a different question from the others: not "does the draft come out right" but "does every refusal actually happen". A guard that is never reached is a guard that does not protect.

第六个套件问的是同一个问题的协议层版本:进来的请求一定要有回音,读不懂的消息要报错而不是装作没听见。它查出了畸形行、非对象消息、id: null 的请求全都被静默丢弃 —— 调用方会一直等一个永远不会来的回复。

第七个套件负责让前六个不敢说谎:它一次故意破坏一条规则,套件必须发现。绿色的套件在证明它能变红之前,什么都不能证明。

The differential harness also runs a load → save round trip: a draft seeded with effects, stickers, transitions and a media bin is opened, saved and compared. It is what catches the silent data loss that a generate-and-compare check cannot see.

The round trip is compared against the reference implementation's own round trip on the same seed. The question is not whether the two files are identical — they write the timeline differently — but whether this implementation keeps what the reference keeps. The reference loads the whole document and overwrites only the keys it models; everything else survives. That comparison is what found the top-level and config keys being dropped, and it names them when they are lost again.

第 2 层最关键:它驱动的是底层 pyJianYingDraft 库而不是上游 wrapper —— 因为 wrapper 会静默丢掉变速、音频淡入淡出和越界校验。覆盖静图、变速、源偏移、多轨道、淡入淡出、边界时长、文本与字幕样式、重叠、越界请求、素材移除。

第一版实现有 62 处差异。后来对着底层库复审,又挖出 8 处之前没覆盖到的:speeds 材质缺失、按轨道类型的段字段写错、render_index 不对、两个素材桶名拼错、变速语义写反、以及把 attribute 当成轨道编号(它其实是静音标志)。完整契约见 docs/DRAFT_FORMAT.md。

安全护栏

以下情况会直接报错,而不是产出一个剪映会渲染错乱的草稿:

  • 同轨道片段重叠被拒绝(相邻不算重叠)

  • 源时长超出素材被拒绝

  • 含视频轨的文件不能当音频素材,纯音频文件也不能当视频素材

  • 负数的起点 / 时长 / 淡入淡出被拒绝

  • 必填参数缺失、类型不对、参数名拼错被拒绝(拼错不会被忽略 —— 否则 duraton 会让片段落到错误位置)

  • 重复打开同名草稿被拒绝,避免未保存的时间轴被静默丢弃

  • 磁盘上已有同名草稿时不会自动覆盖,必须显式传 overwrite=true

  • 覆盖非草稿目录被拒绝

  • 危险草稿名(..、.、Windows 设备名)被拒绝

  • SRT 导出不会覆盖已有文件,也拒绝非 .srt 路径(路径可能指向你的源素材)

被拒绝的调用不会留下垃圾:不残留孤儿素材,也不残留复制进草稿的素材文件,连一个叫 undefined 的空草稿都不会建出来。

验证过程

实现经过七轮审查。第一轮逐字段比对发现 62 处差异;对着底层库做差分复审又挖出 8 处之前没覆盖到的(speeds 材质缺失、按轨道类型的段字段写错、render_index 不对、两个素材桶名拼错、变速语义写反、把 attribute 当成轨道编号)。第二轮对抗式审查再发现 21 项问题,其中实质性的是:create_draft 在拒绝打开前先删掉已有草稿、媒体缓存让视频轨引用到音频素材、ms 被解析成分钟、名字净化不幂等导致草稿无法被寻址、封面图被误判成视频轨、以及 export_srt 会覆写它被指向的任意文件。第三轮复审这些修复,又抓出一处第二轮引入的回归:音轨比画面短的视频,素材时长被截成了音轨长度;同时 JPEG 静帧仍不可用、畸形轨道号会把 render_index: null 写进草稿。第四轮复审确认这批修复,并清掉最后几处残留:解码器报"未知时长"时仍会把 null 写进草稿、没给时长的静帧会变成 40 毫秒一闪而过、静帧判定在把未知帧数报成 "N/A" 的 ffprobe 上会失效。

完整契约见 docs/DRAFT_FORMAT.md。

Installing the verification drafts

python3 scripts/install_drafts.py          # shows the plan
python3 scripts/install_drafts.py --apply  # does it

The drafts have to be registered, not just copied: JianYing reads its project list from root_meta_info.json in the drafts root, so a folder that is not in that registry is never shown. The installer copies each draft, rewrites the material paths to point at the copy, and registers it with the same id the draft already carries.

It also warns when JianYing is running: the application reads the registry once, when it starts, and rewrites it while it runs — so a draft installed into a running application is never seen, and its registry entry can be overwritten before the next start. Quit JianYing completely (⌘Q) and reopen it after installing.

已知限制

  • 导出必须手动:macOS 上剪映没有可靠的无头渲染通道

  • 剪映 11 写出的草稿读不了:11 及以后的版本把 draft_info.json 加密,而且换了一套自己的时间轴结构。 工具写出的草稿剪映能正常打开(本机 11.6 实测通过),但剪映保存过的草稿工具读不回来 —— 报错会明确说明原因。继续在剪映里改就用剪映改;要继续用工具改,就另建一个草稿。

  • 只覆盖视频 / 音频 / 文字核心,暂不含关键帧、特效、转场、贴纸

  • 不集成剪映云端素材库

  • 与字节无关,剪映 / CapCut 是其各自所有者的商标

许可

MIT,见 LICENSE。第三方归属见 NOTICE。本项目为独立实现,未分发任何上游源码。

Available Tools

13 tools
jianying_add_audioB

Add an audio clip (BGM, voiceover, sound effect) to an audio track. Use track 0 for the main audio bed and track 1 for narration.

NameRequiredDescriptionDefault
nameYesOpen draft name
startNoTimeline start (seconds as a number, or a duration string such as "1m30s")
trackNoAudio track index (0 = BGM, 1 = narration) (a number, or a numeric string such as "1")
fadeInNoFade-in length (seconds as a number, or a duration string such as "1m30s")
volumeNoVolume 0..1
fadeOutNoFade-out length (seconds as a number, or a duration string such as "1m30s")
durationNoClip length (seconds as a number, or a duration string such as "1m30s")
filePathYesAbsolute path to the audio file
sourceStartNoOffset inside the source file (seconds as a number, or a duration string such as "1m30s")

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full behavioral burden and it is thin for a mutation tool. It does not say whether the draft must be open first, whether the change is reversible, whether saving is required afterwards, how duration behaves when omitted, or what the response looks like. The only behavioral content is track routing, which already appears in the schema.

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

Conciseness4/5

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

Two front-loaded sentences with the core action and track routing first. The second sentence largely restates the schema's track description, a small redundancy, but overall it is tight with no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a 9-parameter mutating tool with no annotations and no output schema, and the description leaves key agent questions unanswered: draft-open prerequisite, save requirement, duration defaults, and failure modes. The rich schema compensates on parameter semantics but not on behavior or workflow position.

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 100% and every parameter, including duration-string formats and volume ranges, is documented in the schema. The description adds no parameter meaning beyond what is already there, so the baseline of 3 applies.

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 opens with a specific verb and resource ('Add an audio clip') and enumerates the usable audio types (BGM, voiceover, sound effect), which clearly separates it from jianying_add_video, jianying_add_text, and jianying_add_subtitles. It does not name a sibling or state exclusions, so it stops short of 5.

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

Usage Guidelines3/5

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

'Use track 0 for the main audio bed and track 1 for narration' gives real routing guidance for one parameter, which is implied usage rather than when-to-use-vs-alternatives guidance. Nothing tells the agent when this tool is the right choice over another add_* sibling, nor what prerequisites apply.

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

jianying_add_subtitlesA

Add a full subtitle track from a script. The script is split into short lines (Chinese ads use ~18 chars/line) and distributed evenly across the time window. Returns the generated lines so they can be proofread.

NameRequiredDescriptionDefault
nameYesOpen draft name
startYesStart time (seconds as a number, or a duration string such as "1m30s")
styleNoText style
trackNoText track index (0 = captions, 1 = titles/overlays) (a number, or a numeric string such as "1")
scriptYesFull narration / caption script
durationYesTotal window (seconds as a number, or a duration string such as "1m30s")
maxCharsNoMax characters per line (default 18)

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations present, the description does real work by disclosing the line-splitting heuristic (~18 chars/line) and even time distribution, plus that the generated lines are returned. However, it never says whether this replaces existing captions on the track, whether an open draft is required, or whether the operation is reversible – meaningful gaps for a mutation 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.

Conciseness5/5

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

Three tight sentences with the core action front-loaded and the proofreading return value last. No filler or restatement of the name.

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?

Adequate for the core script-to-subtitles behavior, and the return value is mentioned. But for a 7-parameter tool with nested style objects and no annotations or output schema, it omits the track targeting semantics (0 vs 1) and overwrite behavior, which an agent needs before calling.

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 100%, so baseline is 3, but the description adds cross-parameter semantics the schema cannot express: how script, start, duration, and maxChars interact to produce evenly distributed lines. It still says nothing about how style or track affect the result in prose.

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

Purpose4/5

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

States a specific verb and resource ("Add a full subtitle track from a script") plus the mechanics of splitting and distributing. It is clearly distinguishable from jianying_add_text and jianying_export_srt by implication, but no sibling is named explicitly.

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

Usage Guidelines3/5

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

Usage is implied by the phrase "full subtitle track" and by the note that generated lines are returned for proofreading, which hints at the script-to-captions workflow. There is no explicit guidance on when to prefer this over jianying_add_text or jianying_export_srt, and no stated prerequisites (e.g. draft must be open).

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

jianying_add_textB

Add a text or subtitle segment to the text track. Use for titles, lower thirds and single captions.

NameRequiredDescriptionDefault
nameYesOpen draft name
textYesText content
startYesStart time (seconds as a number, or a duration string such as "1m30s")
styleNoText style
trackNoText track index (0 = captions, 1 = titles/overlays) (a number, or a numeric string such as "1")
durationYesDuration (seconds as a number, or a duration string such as "1m30s")
subtitleNoUse the caption defaults — smaller size, an outline, and the low caption position

TDQS

B3.3/5.0
Behavior2/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 burden. It does not say whether the draft must be open first, whether the change is persisted or requires jianying_save_draft, whether it returns a segment identifier, or what happens when segments overlap on the same track. For a mutation tool with zero annotation coverage this is a substantial gap.

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

Conciseness5/5

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

Two sentences, zero waste, with the core action front-loaded and the use cases following immediately. Nothing is padded or repeated.

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?

A 7-parameter mutation tool with a nested style object and no output schema deserves more than this: the draft-lifecycle context (open/save) and the return value are unaddressed. The rich schema covers the input surface well, which keeps it at minimum viable rather than inadequate.

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 100%, including nested style fields, the enum for align, and the meaning of the track index (0 = captions, 1 = titles/overlays). The description adds almost no parameter-level meaning, so the baseline 3 applies.

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

Purpose4/5

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

Specific verb and resource ('Add a text or subtitle segment to the text track') plus concrete use cases (titles, lower thirds, single captions). The word 'single' implicitly separates it from the sibling jianying_add_subtitles, but the sibling is never named so the distinction must be inferred.

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?

'Use for titles, lower thirds and single captions' gives an implied usage context and hints that bulk captioning belongs elsewhere. It never names jianying_add_subtitles as the alternative, and it does not state the prerequisite that a draft must already be open (the sibling jianying_open_draft exists).

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

jianying_add_videoA

Add a video or image clip to a video track. When 'start' is omitted the clip is appended after the current track content.

NameRequiredDescriptionDefault
nameYesOpen draft name
speedNoPlayback speed multiplier
startNoTimeline start (seconds as a number, or a duration string such as "1m30s")
trackNoVideo track index (0 = bottom layer, 1 = overlay) (a number, or a numeric string such as "1")
volumeNoClip volume 0..1
durationNoClip length; defaults to the rest of the file (seconds as a number, or a duration string such as "1m30s")
filePathYesAbsolute path to the media file
sourceStartNoOffset inside the source file (seconds as a number, or a duration string such as "1m30s")

TDQS

A4/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 behavioral disclosure burden. It usefully explains that omitting 'start' appends the clip after current track content, but it does not cover permissions, draft prerequisites, overwrite behavior, or error conditions for this mutation tool.

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

Conciseness5/5

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

The description is two focused sentences with no wasted text. The core action is front-loaded, followed by the most important behavioral detail.

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 tool with eight fully documented parameters and no output schema, the description is largely complete: it states the action and the key default for 'start'. It could better mention draft prerequisites or mutation side effects, but the rich schema covers most calling details.

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 100%, so the schema already documents all parameters thoroughly. The description adds the useful default behavior for omitted 'start', but it does not add meaning beyond the schema for the other parameters.

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: add a video or image clip to a video track. It clearly distinguishes this from sibling tools like jianying_add_audio and jianying_add_text.

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 gives clear context for when to use it by specifying video tracks and visual media. It does not explicitly name alternatives or when-not-to-use cases, so it falls short of full routing guidance.

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

jianying_close_draftA

Close an open draft and release its memory. Unsaved changes are lost, so call jianying_save_draft first. Use this when a draft is finished or was created by mistake.

NameRequiredDescriptionDefault
nameYesOpen draft name

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does disclose the key destructive trait: "Unsaved changes are lost." It also states the memory-release effect and the required save-first safeguard, though it does not cover permissions, error cases, or idempotency.

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 core action and effect, followed by a concise danger warning and usage condition. Every sentence contributes useful information without 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?

For a simple one-parameter close operation with no output schema, the description covers the essential action, destructive consequence, prerequisite, and intended usage scenario. Nothing critical is missing for correct invocation.

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 100%, so the single "name" parameter is already documented as "Open draft name." The description only alludes to an "open draft" and adds no format or naming details beyond the schema, so baseline 3 is appropriate.

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 uses a specific verb and resource: "Close an open draft," and adds the side effect "release its memory." This clearly distinguishes it from sibling tools such as jianying_open_draft, jianying_create_draft, and jianying_save_draft.

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 explicit usage conditions: "when a draft is finished or was created by mistake," and a clear prerequisite: "call jianying_save_draft first." It lacks a direct when-not or alternative-tool comparison, but the context is clear.

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

jianying_create_draftA

Create a new JianYing draft and return its structure. Set width/height to match the source footage (1080x1920 for 9:16 vertical, 1920x1080 for 16:9). When omitted, the canvas adopts the first video's resolution automatically.

NameRequiredDescriptionDefault
fpsNoFrame rate (default 30) (a number, or a numeric string such as "1")
nameYesDraft name
widthNoCanvas width (a number, or a numeric string such as "1")
heightNoCanvas height (a number, or a numeric string such as "1")
overwriteNoReplace an existing draft with the same name. Off by default, because overwriting discards the existing project.
draftsRootNoOverride the drafts root directory

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses the non-obvious default that omitting width/height makes the canvas adopt the first video's resolution, and mentions returning the draft structure. It says nothing about where the draft is written, whether a subsequent jianying_save_draft is required for persistence, or what permission/filesystem preconditions exist.

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?

Three short sentences, front-loaded with what the tool does, followed by the one genuinely non-obvious parameter rule. No filler, though the aspect-ratio advice reads slightly like a tip rather than definitional content.

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?

No output schema exists, and "return its structure" is vague about what a draft structure actually contains. For a disk-writing mutation with no annotations, the missing lifecycle context (persistence/save requirement, drafts root default, run-twice behavior on duplicate names) leaves real gaps.

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 100%, so baseline is 3; the description earns above that by explaining the coupled semantics of width/height and their fallback behavior, which the schema does not convey. fps, overwrite, and draftsRoot are left entirely to the schema.

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?

"Create a new JianYing draft and return its structure" names a specific verb and resource, and the create-vs-open distinction against jianying_open_draft is implicit in the verb. It stops short of explicitly differentiating itself from the other lifecycle siblings (open/save/list), so not a 5.

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

Usage Guidelines3/5

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

It gives concrete guidance for choosing width/height (1080x1920 for 9:16, 1920x1080 for 16:9) and states the omission behavior, which is genuine usage help. But there is no guidance on when to call this versus jianying_open_draft or jianying_list_drafts, and no prerequisites stated.

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

jianying_export_srtB

Export the text track of the open draft as an SRT subtitle file, so the captions can be checked in any subtitle editor.

NameRequiredDescriptionDefault
nameYesOpen draft name
overwriteNoReplace an existing file (default false)
outputPathYesAbsolute path of the .srt file to write

TDQS

B3.3/5.0
Behavior2/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 burden. It discloses the open-draft prerequisite and that a file is written, but omits important operational details: overwrite behavior, whether existing files are refused or replaced, any permission requirements, and whether the export is read-only with respect to the draft. This is a significant gap for a tool that writes to disk.

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 tightly written sentence with the action and output format front-loaded and no wasted words. It efficiently conveys the essential operation and purpose.

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?

Given a simple file-export operation, 100% schema coverage, and no output schema, the description covers the basic purpose and prerequisite. But without annotations it should say more about overwrite behavior and side effects; the description alone leaves an agent guessing about file collision handling.

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 100%, so the schema already documents name, overwrite, and outputPath thoroughly. The description adds no parameter-level meaning beyond what the schema provides, which is acceptable but not value-adding; baseline 3 applies.

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 ("Export"), a specific resource ("text track of the open draft"), and a concrete output format ("SRT subtitle file"). It is clearly distinct from siblings like save_draft or add_subtitles, but it does not explicitly name alternatives or contrast against them.

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?

Provides an implied use case — checking captions in any subtitle editor — which suggests this is for external review rather than editing the draft. However, it does not state when to prefer this over save_draft or inspect_draft, nor does it mention prerequisites beyond the draft being open.

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

jianying_inspect_draftA

Return the structured timeline of the open draft: tracks, segments, timing and materials. Use this as the acceptance check after editing.

NameRequiredDescriptionDefault
nameYesOpen draft name

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden; it implies a non-mutating inspection and lists the returned structure, which is real value. It does not state failure behavior (e.g. what happens if no draft is open) or whether the read has any side effects, so gaps remain.

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

Conciseness5/5

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

Two sentences, zero waste, and the core action plus return payload is front-loaded before the usage hint. Nothing redundant with the name or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description correctly compensates by enumerating the returned timeline fields. For a single-parameter read tool this is nearly sufficient, though it omits the precondition that a draft must already be open via jianying_open_draft.

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 100% for the single 'name' parameter, so the schema already documents it; baseline 3 applies. The phrase 'the open draft' loosely confirms the parameter means the currently open draft, but adds no new syntax or constraint information.

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 ('Return the structured timeline of the open draft') and enumerates the payload (tracks, segments, timing, materials). Scoping to 'the open draft' separates it from jianying_list_drafts (all drafts) and from the mutating add_*/remove_*/save_* siblings.

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

Usage Guidelines4/5

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

'Use this as the acceptance check after editing' gives a concrete trigger tied to the sibling mutation tools, so the agent knows when to reach for it. It stops short of naming an alternative or an explicit when-not condition, but the usage context is unambiguous.

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

jianying_list_draftsA

List all JianYing drafts found under the drafts root, with duration and canvas size. Use this before opening an unknown draft.

NameRequiredDescriptionDefault
draftsRootNoOverride the drafts root directory

TDQS

A3.8/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, but it does disclose the return payload (duration, canvas size) — useful since there is no output schema. It says nothing about recursion depth, missing/invalid drafts root handling, or performance, which matters for a filesystem-scanning tool.

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

Conciseness5/5

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

Two tight sentences, zero filler, with the resource scope and returned fields front-loaded and the usage cue second. Nothing could be removed without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-parameter, read-only listing tool with no output schema, the description covers what it lists and what it returns, which is most of what an agent needs. Only edge-case behavior for the drafts root override is left unstated.

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 100% and the single optional draftsRoot parameter is already documented in the schema, so the baseline of 3 applies. The description alludes to the "drafts root" but adds no default-value or override semantics beyond the schema.

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 (List) plus resource (JianYing drafts under the drafts root) and even names the returned fields (duration, canvas size). It is distinguishable from open/create/add tools, though it doesn't clarify how it differs from the nearby jianying_inspect_draft sibling.

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

Usage Guidelines4/5

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

"Use this before opening an unknown draft" gives a clear, actionable usage context and implies the alternative (jianying_open_draft) should follow it. It doesn't state exclusions or mention jianying_inspect_draft, so a sibling could still be ambiguous.

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

jianying_open_draftA

Open an existing JianYing draft by name and return its timeline structure, so work can be resumed. Use this to inspect or continue a draft listed by jianying_list_drafts. Pass overwrite only to deliberately discard the existing draft and start over.

NameRequiredDescriptionDefault
nameYesDraft name (the folder name inside the drafts root)
overwriteNoDiscard the existing draft and start an empty one. This deletes it — omit it to resume editing.
draftsRootNoOverride the drafts root directory

TDQS

A4.2/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 the highest-risk behavior: overwrite deliberately discards the existing draft. It also states the return value (timeline structure). It omits the session/lifecycle implication of the open/close pair (does the draft stay locked until jianying_close_draft?) and error behavior for a missing name.

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

Conciseness5/5

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

Three short sentences, no filler, and the core action is front-loaded before the routing hint and the destructive-flag caveat. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Absent an output schema, the description usefully names what comes back (timeline structure), and it covers the one dangerous option. What's missing is the open/close session relationship implied by jianying_close_draft, which an agent needs to use this tool correctly in a workflow.

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 100% and all three parameters carry their own explanations, so the schema does the heavy lifting. The description reinforces overwrite's risk but adds no syntax or format detail for name or draftsRoot beyond what is already structured. Baseline 3 applies.

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 ("Open an existing JianYing draft by name") plus the effect ("return its timeline structure") and the intent ("so work can be resumed"). An agent can distinguish this from jianying_create_draft and jianying_list_drafts 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?

Explicitly routes from a listing step ("a draft listed by jianying_list_drafts") and gives a clear conditional rule for the overwrite flag versus resuming. However, it says the tool is used "to inspect" a draft, which overlaps with the sibling jianying_inspect_draft and never resolves when to pick one over the other.

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

jianying_probe_mediaA

Probe a media file for duration, resolution and type. Use this before adding clips so durations can be planned.

NameRequiredDescriptionDefault
filePathYesAbsolute path to the media file

TDQS

A3.8/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 behavioral burden. 'Probe' implies a read-only inspection, and the description lists the returned attributes, but it does not explicitly state safety, side effects, permissions, or failure behavior.

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, front-loaded with the action and immediately followed by the practical usage context. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter probe with a fully documented schema, the description covers purpose, usage context, and returned fields. It is nearly complete, though it could add a brief note that probing does not modify the media file.

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 100%, and the only parameter is clearly documented as an absolute media file path. The description adds no additional parameter meaning beyond what the schema already provides.

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 (probe), resource (media file), and the returned attributes (duration, resolution, type). It is clearly distinct from sibling add/remove tools, though it does not explicitly name a sibling for contrast.

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 a clear usage condition: use before adding clips so durations can be planned. It does not describe when not to use it or name alternative probing tools, but the sequencing guidance is direct and useful.

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

jianying_remove_mediaB

Remove every clip that references the given media file from the timeline.

NameRequiredDescriptionDefault
nameYesOpen draft name
filePathYesAbsolute path to the media file to remove

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It usefully clarifies the blast radius ('every clip that references the given media file') and that the operation is scoped to the timeline, but it omits whether the media file itself is untouched on disk, whether the removal is reversible/undoable, what happens when no clip matches, and whether an open-draft session is required.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the scoping clause ('every clip that references the given media file') is exactly the information an agent needs and nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter mutation with no annotations and no output schema, the description covers the core action but leaves out side effects (source file preservation), the no-match/no-op case, and the error/auth behavior that an agent would need to call it reliably.

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 100% (both 'name' and 'filePath' are documented), so the schema already does the parameter explaining. The description adds only the linkage that filePath is matched against clips referencing it, which is marginal — the baseline 3 for full schema coverage is appropriate.

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

Purpose4/5

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

The description gives a specific verb (remove) and a precisely scoped resource (every clip referencing the given media file, from the timeline), which is clearly distinct from the additive siblings like jianying_add_video. It does not name or contrast with any sibling explicitly, which keeps it at 4 rather than 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 when-to-use guidance, no statement of prerequisites (e.g., that a draft must be open — only hinted at by the schema's 'Open draft name'), and no mention of alternatives such as removing individual clips or re-editing. The agent must infer the context of use entirely.

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

jianying_save_draftA

Write the current timeline to disk as a JianYing draft. Call this last — the draft only becomes visible to JianYing after saving.

NameRequiredDescriptionDefault
nameYesOpen draft name

TDQS

A3.8/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. It does disclose a useful behavioral trait – the draft only becomes visible to JianYing after saving – but omits overwrite/idempotency behavior, failure modes, and whether existing drafts are clobbered.

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

Conciseness5/5

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

Two sentences, front-loaded with the action and followed by the critical ordering constraint. No filler, every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter terminal save operation with no output schema and no annotations, the description covers purpose and workflow position adequately. Minor gaps remain around failure behavior and whether a prior draft is overwritten.

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 100% ('Open draft name'), so the schema already documents the single parameter. The description adds no format, uniqueness, or naming-constraint detail beyond what the schema provides, making 3 the appropriate baseline.

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

Purpose4/5

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

States a specific verb and resource: 'Write the current timeline to disk as a JianYing draft.' An agent can distinguish this finalization step from siblings like jianying_create_draft or jianying_open_draft. However, it never explicitly contrasts itself with those siblings by name.

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 an explicit sequencing rule: 'Call this last,' which tells the agent when this tool belongs in the workflow. 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv1.20.1
    • Changedjianying_add_audio7 fields changed
      • changedInput schema / properties / duration / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / fadeIn / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / fadeOut / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / sourceStart / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / start / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / track / acceptsNumericString
        Added value: +true
      • changedInput schema / properties / track / description
        Previous value: -"Audio track index (0 = BGM, 1 = narration)"New value: +"Audio track index (0 = BGM, 1 = narration) (a number, or a numeric string such as \"1\")"
    • Changedjianying_add_subtitles3 fields changed
      • changedInput schema / properties / duration / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / start / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / track
        Added value: +{
        +  "acceptsNumericString": true,
        +  "description": "Text track index (0 = captions, 1 = titles/overlays) (a number, or a numeric string such as \"1\")",
        +  "type": "number"
        +}
    • Changedjianying_add_text4 fields changed
      • changedInput schema / properties / duration / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / start / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / subtitle
        Added value: +{
        +  "description": "Use the caption defaults — smaller size, an outline, and the low caption position",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / track
        Added value: +{
        +  "acceptsNumericString": true,
        +  "description": "Text track index (0 = captions, 1 = titles/overlays) (a number, or a numeric string such as \"1\")",
        +  "type": "number"
        +}
    • Changedjianying_add_video5 fields changed
      • changedInput schema / properties / duration / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / sourceStart / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / start / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "durationString": true,
        +    "type": "string"
        +  }
        +]
      • addedInput schema / properties / track / acceptsNumericString
        Added value: +true
      • changedInput schema / properties / track / description
        Previous value: -"Video track index (0 = bottom layer, 1 = overlay)"New value: +"Video track index (0 = bottom layer, 1 = overlay) (a number, or a numeric string such as \"1\")"
    • Addedjianying_close_draft
    • Changedjianying_create_draft7 fields changed
      • addedInput schema / properties / fps / acceptsNumericString
        Added value: +true
      • changedInput schema / properties / fps / description
        Previous value: -"Frame rate (default 30)"New value: +"Frame rate (default 30) (a number, or a numeric string such as \"1\")"
      • addedInput schema / properties / height / acceptsNumericString
        Added value: +true
      • changedInput schema / properties / height / description
        Previous value: -"Canvas height"New value: +"Canvas height (a number, or a numeric string such as \"1\")"
      • addedInput schema / properties / overwrite
        Added value: +{
        +  "description": "Replace an existing draft with the same name. Off by default, because overwriting discards the existing project.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / width / acceptsNumericString
        Added value: +true
      • changedInput schema / properties / width / description
        Previous value: -"Canvas width"New value: +"Canvas width (a number, or a numeric string such as \"1\")"
    • Changedjianying_export_srt1 field changed
      • addedInput schema / properties / overwrite
        Added value: +{
        +  "description": "Replace an existing file (default false)",
        +  "type": "boolean"
        +}
    • Changedjianying_open_draft5 fields changed
      • changedInput schema / description
        Previous value: -"Open a JianYing draft"New value: +"Open an existing JianYing draft"
      • removedInput schema / properties / fps
        Removed value: -{
        -  "description": "Frame rate (default 30)",
        -  "type": "number"
        -}
      • removedInput schema / properties / height
        Removed value: -{
        -  "description": "Canvas height (default 1080)",
        -  "type": "number"
        -}
      • changedInput schema / properties / overwrite / description
        Previous value: -"Replace the draft if it already exists"New value: +"Discard the existing draft and start an empty one. This deletes it — omit it to resume editing."
      • removedInput schema / properties / width
        Removed value: -{
        -  "description": "Canvas width (default 1920)",
        -  "type": "number"
        -}
  2. 12 tool updatesv1.0.0
    • First observedjianying_add_audio
    • First observedjianying_add_subtitles
    • First observedjianying_add_text
    • First observedjianying_add_video
    • First observedjianying_create_draft
    • First observedjianying_export_srt
    • First observedjianying_inspect_draft
    • First observedjianying_list_drafts
    • First observedjianying_open_draft
    • First observedjianying_probe_media
    • First observedjianying_remove_media
    • First observedjianying_save_draft

TDQS

A3.7/5.0

Scored across 13 tools

Disambiguation4/5

Each tool targets a distinct phase of the draft workflow (list/open/create/save/close, add clip types, inspect, probe, remove media), and the descriptions clearly separate similar tools like add_text vs add_subtitles. The one soft overlap is jianying_open_draft, which both opens a draft and returns its timeline structure, versus jianying_inspect_draft, which returns the same structure for an already-open draft.

Naming Consistency5/5

Every tool follows the same jianying_<verb>_<noun> snake_case pattern (open_draft, add_video, export_srt, probe_media), with no camelCase or verb-style deviations. The uniform prefix also makes the whole surface easy to recognize as one cohesive family.

Tool Count5/5

Thirteen tools is well within a comfortable range for a domain-specific editor integration, and each tool maps to a concrete editing operation. Nothing looks redundant or padded at the count level.

Completeness3/5

The draft lifecycle (list/create/open/save/close/inspect) and content insertion (video, audio, text, subtitles) plus SRT export are covered, but segment-level editing is missing: there is no way to move, trim, or delete an individual clip except via jianying_remove_media, and no tool to delete a draft. These gaps will force agents into dead ends for common revision tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents and MCP clients to programmatically edit video projects on a local desktop editor, with 119 tools for multitrack editing, effects, captions, audio, and batch auto-editing, producing reviewable and reversible real timeline edits.
    AGPL 3.0