Local stdio MCP server for Cassette video-editing automation, supporting media ingestion, job management, background music matching, and export workflows
The server exposes 15 tools with significant quality gaps. While most tools have descriptions and input schemas are present, many descriptions lack specificity and actionability for LLM reasoning. Parameters often lack type definitions at the schema level, and output schemas are not documented. Naming is inconsistent, mixing verb_noun conventions with module-prefixed names that don't convey semantic action clearly. Error handling patterns are present (evidenced by the err() wrapper in core/tools.py), but guidance is minimal. The server's reliance on STDIO transport, authentication via exposed parameters (cassette_login), and lack of tool annotations (destructiveHint, idempotentHint, readOnlyHint) further reduce production readiness.
Answer a Cassette question during an interactive edit or resume a paused job with a user response
Cancel an active Cassette editing job
Get or update Cassette configuration and preferences
Execute a direct edit operation on a Cassette project
Ingest media assets (video, image, audio) into a Cassette session for editing
Search for music on Jamendo using configured BYOK credentials
cassette_login exposes credentials as tool parameters, violating secret-injection pattern. Email and password are required inputs, forcing agents to handle and log sensitive credentials.
Output schemas are undocumented for all 15 tools. LLMs cannot reason about return types, fields, pagination, or chaining requirements. Prevents downstream tool composition and forces guessing.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2025-06-18+ | v2 |
Configure Jamendo BYOK (Bring Your Own Key) with a client ID for music sourcing
Get the current status of a Cassette editing job
List all media assets currently ingested in a Cassette session
Authenticate with Cassette using email and password credentials
Build a Cassette editing prompt from an instruction and available media assets
Search for and match background music (BGM) using Free To Use music sources with smart optimization
Search for exact background music matches across multiple music providers (Netease, QQ, Kuwo, Joox)
Review and approve/reject a Cassette editing job completion
Run a Cassette editing job with the given instruction and optional asset selection
Parameters lack type constraints and validation guidance. Examples: cassette_edit.operation is untyped string (no enum), cassette_make_prompt.constraints is untyped object, cassette_config.config is untyped object. LLMs cannot validate inputs and will pass invalid values.
Pagination not implemented. cassette_list_assets lacks limit/offset parameters and no indication of result capping. Large asset lists will exhaust context window.
Tool naming is inconsistent and sometimes ambiguous. cassette_make_prompt (unclear when vs cassette_run_job), cassette_edit (too generic), cassette_answer_question (unclear purpose), cassette_config (combines get+set). LLMs waste reasoning cycles deciding between similar tools.
Parameter descriptions lack actionable constraints and format guidance. Examples: cassette_run_job.duration has no bounds, cassette_match_exact_bgm.search_query has no length limit, cassette_jamendo_setup.client_id has no format validation note. Agents will pass invalid values.
Tool annotations (destructiveHint, idempotentHint, readOnlyHint) are missing. LLMs cannot automatically determine which tools are safe to retry, which modify state, or which are read-only. Risk classification present (WRITE/READ_ONLY) but not in schema annotations.
Ambiguous parameter relationships. cassette_answer_question has three modes (resume, classify, none) but parameters are flat, LLM must infer which params apply to which mode. cassette_cassette_make_prompt has cassette_language vs language (redundancy). cassette_config action enum requires different config objects but not documented.
Error handling is generic. err() function exists but descriptions lack recovery guidance. Example: if cassette_login fails, description doesn't say 'Check credentials' or 'Contact support'. If cassette_run_job fails, no guidance on retry eligibility. Agents left without next steps.
cassette_list_assets and other discovery tools lack guidance on when to call them and what structure they reveal. cassette_job_status description (54 chars) is too minimal, doesn't explain polling interval or possible status values.