oh-my-cassette
Oh My Cassette is an MCP server that connects AI agents (Claude Code, Codex, OpenCode, Hermes, etc.) to the Cassette cloud video editing platform, enabling natural-language-driven video editing without a timeline or editing software.
Media Management
Ingest media (
cassette_ingest_media): Upload and register local video, image, or audio files from trusted directories into an isolated editing session.List session assets (
cassette_list_assets): View all media assets registered in the current session.
Video Editing
Run edit jobs (
cassette_run_job): Start a multi-turn editing session with a natural-language instruction; the agent handles shot selection, pacing, beat-synced cuts, subtitles, transitions, and picture-in-picture effects.Check job status (
cassette_job_status): Poll or long-poll (up to 30s) for live updates on running or completed jobs.Answer guided questions (
cassette_answer_question): Respond to clarifying questions or resume paused/interrupted jobs.Review and approve export (
cassette_review_completion): Explicitly approve, refine, or reject a completed edit — rendering only begins on an explicit export decision.Cancel jobs (
cassette_cancel_job): Cooperatively cancel an in-progress job.Read the timeline (
cassette_timeline): Get a text digest of the current timeline and optionally generate a contact-sheet thumbnail preview without rendering.Surgical edits (
cassette_edit): Make precise, no-LLM edits (trim, text, delete, undo) directly on the timeline whenCASSETTE_DIRECT_EDIT=1is set.
Music Integration
Match background music (
cassette_match_bgm): Find and register free-to-use music from a natural-language description.Match an exact song (
cassette_match_exact_bgm): Search for and register a specific song by title and artist.Search Jamendo (
jamendo_music_matcher): Search the Jamendo catalog with structured preferences (mood, vocal/instrumental, tags).
Configuration & Utilities
Build an edit prompt (
cassette_make_prompt): Construct a structured edit brief from a natural-language instruction and session assets.Configure session model (
cassette_config): Get or set the Cassette AI model and thinking level (low/medium/high) for the current session.
⚡ Install in 30 seconds
# Claude Code
claude plugin marketplace add Cassette-Editor/oh-my-cassette
claude plugin install oh-my-cassette@cassette-editor# Codex
codex plugin marketplace add https://github.com/Cassette-Editor/oh-my-cassette.git
codex plugin add oh-my-cassette@cassette-editorRestart your agent, then say: "Edit the clips in ./footage into a 30-second travel vlog with beat-synced cuts."
Want to try the workflow before installing? Open the public web demo.
Needs Python 3.11–3.13, ffmpeg, and a Cassette account. Full setup — including OpenCode, Hermes, and any other MCP host — is in Quick Start.
🎥 Overview
Oh My Cassette is an open-source AI video editing plugin and local MCP server for Claude Code, Codex, Hermes Agent, and OpenCode. It turns natural-language chat into finished montage videos on Cassette — beat-synced cuts, auto-matched music, subtitles, transitions, and picture-in-picture — with minimal token overhead.
The agent does the parts that make editing tedious: it watches every clip, picks the shots, plans the cut, syncs it to the beat, and renders — while you stay in chat. Because it runs through your agent, you can do all of it from your phone.
Related MCP server: ViralSpin MCP
🖥️ How it works
Upload your clips, describe the video you want, and the agent edits it.
Time | What happens |
0:09 | The brief — one line, style left entirely to the agent, typed into Claude Code |
0:22 | 15 files upload to Cassette; every clip is analyzed for scene content |
0:35 | The agent edits on its own — shot selection, title card, lower-third, grading, beat-synced cuts |
0:58 | The timeline comes back as a readable digest, with a clickable contact-sheet link |
1:03 | One |
1:12 | The contact sheet itself: what the cut looks like before a single frame is rendered |
1:44 | The export lands, and the runtime measures it — duration, black frames, audio levels |
1:52 | The finished cut |
The cut it produced
The screen recording is compressed to keep this page light, so the terminal text looks softer here than it does on your machine; the cut below it is the full-quality render. Prompt to rendered file took 9 minutes 53 seconds of real time, sped up above. A person's face is pixelated in both the screen recording and the cut it produced, for privacy — that blur is not something the agent added.
Token cost: that session used 55K output tokens and 2.33M billed input tokens (2.07M of them cache reads) on Claude Opus 5 — roughly $4 at API list price, measured from the Claude Code transcript of this exact recording. One brief, one turn, start to exported file. The editing itself runs on Cassette, so the agent only pays for the brief and the timeline digests, not for the footage.
🎬 Case Videos
Every case below was edited end-to-end by an AI agent through Oh My Cassette, from the exact prompt shown — real inputs, real processing times, and the output is what the agent delivered.
🚀 Quick Start
Before You Start 🎬
Oh My Cassette connects Codex, Claude, or Hermes to the Cassette Agent. You need:
Codex, Claude Code, or a working Hermes Agent installation.
A Cassette account.
For Hermes only, a configured gateway such as QQ or Telegram.
Apply for a Cassette account here: Cassette Sign Up
If you plan to use Hermes and it is not installed yet:
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bashIf the Hermes Agent gateway is not configured yet:
hermes gateway setupOh My Cassette currently supports QQ and Telegram gateways.
Requirements
macOS, Linux, or Windows for the local MCP plugin (Codex, Claude Code, or OpenCode). The Hermes Agent gateway path is macOS/Linux only.
Codex, Claude Code, or OpenCode for the local MCP plugin, or Hermes Agent with its gateway configured.
Python 3.11–3.13.
ffmpeg, required for Hermes gateway normalization and optional API export thumbnails.
Supported video uploads
Cassette currently accepts video source files that match all of the following limits:
Limit | Accepted input |
Container | MP4 only |
Video | H.264/AVC, 8-bit |
Audio | AAC mono, AAC stereo, or no audio track |
Frame rate | Constant 29.97 or 30 fps |
Landscape resolution | Up to |
Portrait resolution | Up to |
File size | Up to 2 GiB ( |
Duration | Up to 60 minutes per video |
MOV, HEVC/H.265, AV1, VP9, ProRes, HDR, 10-bit, variable-frame-rate video, 24/25/50/60 fps, 4K, oversized files, and videos longer than 60 minutes are rejected rather than transcoded in the cloud.
Upload retention
Uploaded videos and plugin-managed previews, job state, and exports share one immutable 24-hour deadline measured from the session's first ingest. After that deadline the plugin removes its local copies and the service removes its media; another session — even on the same host or the same account — cannot reach them. Keep your own copy of every source file, and move any export you want to retain outside the plugin-managed data directory before the deadline.
Install system tools:
# macOS
brew install uv ffmpeg# Debian/Ubuntu Linux
sudo apt-get update
sudo apt-get install -y ffmpeg
curl -LsSf https://astral.sh/uv/install.sh | sh# Windows (PowerShell)
winget install Python.Python.3.13
winget install Gyan.FFmpegInstall
Codex
codex plugin marketplace add https://github.com/Cassette-Editor/oh-my-cassette.git
codex plugin add oh-my-cassette@cassette-editorStart a new Codex task after installation so plugin discovery runs again. The plugin contributes the host-neutral cassette-video-edit and cassette-model skills plus a local MCP process named cassette. Fresh editing sessions use GPT-5.6 Luna with Extra High thinking; invoke $cassette-model only when you want to inspect or change that session setting.
Claude Code
claude plugin marketplace add Cassette-Editor/oh-my-cassette
claude plugin install oh-my-cassette@cassette-editorRestart Claude Code after installation. You can verify the installation with:
claude plugin details oh-my-cassette@cassette-editorClaude Code can keep the plugin up to date on its own once you enable auto-update for the marketplace — see Update.
Fresh editing sessions use GPT-5.6 Luna with Extra High thinking. Invoke /cassette-model when you want to inspect or change the current session's model and thinking level.
OpenCode
OpenCode's plugin manager installs npm packages only, and its plugins cannot contribute MCP servers, so there is no marketplace entry to add. One command instead:
curl -fsSL https://raw.githubusercontent.com/Cassette-Editor/oh-my-cassette/release/scripts/install_opencode.py | python3 -That downloads the current release, writes the cassette server into ~/.config/opencode/opencode.json (merging with any servers and settings already there), installs the host-neutral skills into ~/.config/opencode/skills/, and installs /cassette-model into ~/.config/opencode/commands/. Restart OpenCode afterwards. Fresh editing sessions use GPT-5.6 Luna with Extra High thinking; the command changes the setting only when you invoke it.
Re-run the same command to update. Only git is not required — the release tarball is fetched with Python's standard library.
Cassette credentials are shared across Codex, Claude Code, OpenCode, and Hermes, so if you have already set up another host there is nothing more to do. Otherwise the installer prints the setup_local_mcp.py command to finish authentication. Jamendo uses the host-specific BYOK setup described below.
The plugin tree lands in ~/.oh-my-cassette (override with OMC_HOME). --dry-run previews the changes. If you prefer a git checkout, clone it and run the installer from there — it registers that tree and leaves it alone, and --sync fast-forwards it to the release channel.
Any other MCP host
The runtime is host-neutral, so any client that launches a local stdio MCP server can use it. Point the client at scripts/run_local_mcp.py (run with python3, or python on Windows) and set CASSETTE_RUNTIME_ADAPTER=mcp. The server ships full workflow guidance in its MCP instructions, and every tool returns a typed phase/next_action so a host without the packaged skill can still drive the flow. For the best experience, also install the cassette-video-edit and cassette-model skills (or equivalent system prompts). Generic clients can call cassette_config or ask in natural language to change the current session's model.
Letting an AI assistant do the install for you — Cline, or any agent with shell access? Point it at llms-install.md: a machine-readable setup guide covering the runtime pre-build, host registration, authentication, media roots, and verification.
Hermes
Install through the Hermes plugin manager (recommended):
hermes plugins install Cassette-Editor/oh-my-cassetteThe Hermes installer prompts for your Cassette account email and password and saves them to ~/.hermes/.env. Then run the setup finisher — it configures the same stdio MCP server and canonical editing skill used by the other hosts, sets Hermes's tool timeout to 1800 seconds, detects ffmpeg/ffprobe, and lets you pick the Cassette region — and enable the thin gateway plugin:
python3 ~/.hermes/plugins/cassette/scripts/install_plugin.py --setup-only
hermes plugins enable cassette
hermes gateway restartYou can check the install status anytime from the Diagnose section.
git clone https://github.com/Cassette-Editor/oh-my-cassette.git
cd oh-my-cassette
python3 scripts/install_plugin.pyRun the installer and follow the prompts to set up Oh My Cassette with your Cassette account.
The installer:
installs the plugin into
~/.hermes/plugins/cassetteas a symlink by default;writes the shared Cassette stdio server into
~/.hermes/config.yamlwith an 1800-second tool timeout;asks whether to enable the plugin with
hermes plugins enable cassette;asks which Cassette URL to use:
https://sg.trycassette.online/agent(Asia, default)https://trycassette.online/agent(America)
optionally verifies and saves a Jamendo Client ID into
~/.hermes/.env;detects
ffmpegandffprobepaths for service environments;restarts the Hermes gateway service.
To copy files instead of creating a symlink:
python3 scripts/install_plugin.py --copy --forceFor non-interactive installs:
python3 scripts/install_plugin.py \
--skip-plugin-enable \
--skip-cassette-url \
--skip-cassette-auth \
--skip-jamendo-authUse with agent clients over local MCP
Codex, Claude Code, OpenCode, and Hermes use the same self-contained runtime. In this README, MCP server means a local child process connected over stdin/stdout: it opens no port. The separate Cassette backend remains the editing engine and continues to handle authentication, media processing, agent runs, project state, and rendering.
First-run authentication
Cassette passwords are generated by the server and emailed to you. You never choose one, and the plugin never invents one.
Missing credentials do not prevent the MCP process from starting. There are two ways to hand the password over.
In the conversation. Paste the password from your Cassette email and ask the agent to sign in; it calls the cassette_login tool, which verifies the account against Cassette before writing anything and then stores it privately. Nothing else is needed — no terminal, no browser. The trade-off is explicit: the password lands in your agent host's transcript on disk and is sent to the model provider for the rest of that conversation. If that is not acceptable to you, use the terminal instead.
In a private terminal. The command keeps the password out of the transcript entirely — it prompts with getpass, verifies the account before writing anything, and stores credentials in the platform-standard Oh My Cassette config directory. Every auth_required envelope carries the exact command for your install; from a git checkout it is:
python3 scripts/setup_local_mcp.py --email you@example.comCredentials may also come from process environment variables. Environment values take precedence over protected local config, so cassette_login refuses to write a file that would be shadowed. Importing an existing Hermes .env is explicit and optional:
python3 scripts/setup_local_mcp.py --import-hermesEither route creates config directories with mode 0700 and credential files with mode 0600, rejects symlinks and permissive files, and never persists access or refresh tokens.
Jamendo BYOK setup
Jamendo music matching is strictly bring-your-own-key for every local agent host. Create a read-only application in the Jamendo developer portal and copy its Client ID. A Client Secret is neither needed nor accepted.
In the conversation. Ask the agent to configure Jamendo, paste your Client ID, and it calls cassette_jamendo_setup. The tool verifies a minimal Tracks request before writing anything. The trade-off is the same as chat sign-in: the ID reaches the host transcript and model provider for that conversation.
In a private terminal. Keep the ID out of the conversation entirely:
python3 scripts/setup_local_mcp.py --jamendoCodex, Claude Code, and OpenCode store it in the protected settings.json; Hermes stores it in ~/.hermes/.env. JAMENDO_CLIENT_ID in the process environment remains highest precedence. A failed validation preserves the previous working value.
BYOK assigns API access and quota to your Jamendo application; it does not grant commercial rights to selected music. Review the returned track URL, license URL, download eligibility, and attribution requirements before publishing or commercial use.
Resetting the password
You cannot pick a replacement — Cassette generates one and emails it to the account address. Ask the agent for a new password and it calls cassette_login with request_new_password and confirm_replace; or from a terminal:
python3 scripts/setup_local_mcp.py --reset-passwordBoth routes ask you to confirm first, because the request is irreversible: it replaces the account password everywhere, including on your other machines, it is limited to a few attempts an hour, and the replacement happens before the email is sent — so even a delivery failure kills the old password. Check your inbox before retrying.
The reset only mails the new password; paste it back (in the conversation, or at the terminal prompt) to finish signing this machine in. The verified password is stored in credentials.json:
macOS:
~/Library/Application Support/Oh My Cassette/credentials.jsonLinux:
~/.config/oh-my-cassette/credentials.json(or underXDG_CONFIG_HOMEwhen set)Windows:
%APPDATA%\Oh My Cassette\credentials.json
To make this machine forget the stored password without touching the account:
python3 scripts/setup_local_mcp.py --logoutUsage: point it at your clips
Start your agent in the folder that holds the clips — or in any parent of it. That folder is the trusted media root (
CASSETTE_PROJECT_ROOT, set to the host's project directory), and everything beneath it is ingestible, so~/videos/trip/raw/*.mp4works when you start in~/videos/trip. Clips somewhere else? Register that directory once:python3 scripts/setup_local_mcp.py --allowed-root /absolute/path/to/mediaIngesting a file outside every trusted root fails with
source_path_not_allowed.Say what you want, in one message, naming the folder. No upload step to run yourself — the agent ingests the files it needs.
Edit the clips in ./footage into a 30-second travel vlog with beat-synced cuts. Add the title "KOTA KINABALU" at the start and end, and keep the rhythm light.
Keep going in the same conversation. Each turn commits the edit and returns a timeline digest plus a contact-sheet JPEG saved locally with a clickable link — nothing renders. Hermes labels this as the thumbnail and uses the same saved file; no editor deep link is exposed. "Make the intro shorter", "swap the music for something calmer", and "undo that" all continue the same session.
Say "export" when you're happy. That's the only thing that starts a render; the finished file lands in
cassette/exports/<job_id>/.
Supported inputs are video, image, and audio files (.mp4, .mov, .jpg, .png, .mp3, .wav, and friends). Mixed folders are fine — send the footage and the music track together.
Guided editing flow
What the plugin does under the hood on each of those turns:
Ask your agent client to edit one or more media files in the current project.
The plugin ingests only media inside the active project or another explicitly trusted root. It canonicalizes paths and rejects traversal and symlink escapes.
Describe the edit, answer any guided choices, and start the job.
cassette_run_jobis the wait: the host calls it exactly once for that user turn while the runtime streams progress notifications.When that call settles, follow its typed
phaseandnext_action; do not start a status-poll loop or retry the edit in the same user turn.cassette_job_statusis reserved for a deliberately detached or interrupted call.If Cassette needs a real user decision, answer it with the returned job ID. On hosts that support MCP elicitation,
cassette_job_statuscollects the answer inline and returns the already-resumed status; other hosts use thecassette_answer_questionround-trip. API jobs persist their private continuation metadata across host restarts.When editing completes, review the result. Rendering starts only after an explicit
exportdecision.The result contains validated absolute paths, file URIs, MIME type, size, and an MCP resource link for each exported artifact. Large media bytes are never embedded in the tool response.
When a background job reaches a terminal state (finished, needs input, failed, or cancelled), the MCP runtime posts a best-effort local desktop notification — osascript on macOS, notify-send on Linux — so you learn a long render is done even after the monitor budget hands the job back. Set CASSETTE_MCP_NOTIFY=0 to disable it.
Sessions are isolated by a cryptographically random session ID. Codex, Claude Code, OpenCode, and Hermes share host-neutral storage, so you can deliberately hand a session or job ID from one host to another; nothing is shared implicitly.
Additional trusted media directories can be registered during setup:
python3 scripts/setup_local_mcp.py --allowed-root /absolute/path/to/mediaExports stay under the shared Oh My Cassette data directory at cassette/exports/<job_id>/. Only files contained in that job-specific directory can be returned.
How the plugin reaches Cassette
One way: direct calls to the separate Cassette backend. Authentication retries once after a 401, access tokens are kept in memory only, and continuation metadata is persisted, so a paused job resumes after the agent client restarts.
There is no browser to install, drive, or keep alive. The Playwright transport that used to sit behind CASSETTE_TRANSPORT=browser has been removed; a leftover setting is reported once on stderr and ignored.
MCP tools
The local MCP runtime exposes the same 16 tool names as Hermes:
Tool | Purpose |
| Safely ingest trusted project media into an isolated session |
| Read the session's media manifest |
| (legacy) Build a full edit brief — superseded by verbatim relay |
| Match Free To Use background music |
| Match a specific title and artist |
| Match structured Jamendo preferences |
| Verify and privately store this machine's Jamendo Client ID |
| Answer a guided question or resume a paused job |
| Run one conversational turn ( |
| Resume a deliberately detached or interrupted job call |
| Review completion and explicitly approve export |
| Request cooperative cancellation |
| Read the live project timeline as a bounded text digest (+ optional contact sheet) |
| Surgical no-LLM edit / undo through the manual command lane ( |
| Get/set the session's model + thinking level (static product list, applies next turn) |
| Verify and privately store this machine's credentials, or request a new emailed password (MCP hosts only) |
Every tool returns a structured envelope with ok, typed data or error, session_id, job_id, the current phase, and a runtime-derived next_action.
Local preview links and plan review
The runtime returns no editor deep link. A …?projectSessionId=<id>&chatSessionId=<uuid> URL is a bearer capability: the backend binds no owner to a scratch session, so the only checks on that route are "signed in" and "knows the id" — any authenticated account that sees the link can open the project and run edits on the thread. Tool output ends up in chat transcripts, logs and screen recordings, so the runtime no longer emits one, and the skills instruct the agent not to construct one. Previews are the timeline digest, the contact sheet, and the export.
This narrows exposure rather than closing it: the route still resolves for anyone who reconstructs the URL. Binding a session to its owner has to happen server-side.
Two concurrency semantics worth knowing: a plugin turn never cancels a run started from the open editor tab (it fails typed as thread_busy instead — wait and retry), while typing a fresh message in the tab DOES cancel an in-flight plugin turn (the tab takes over; existing product behavior).
Behavior change (0.4.14): the agent receives the user's message verbatim (no brief wrapper), sessions are multi-turn on one thread, and a turn ends with the edit committed but nothing rendered — the envelope carries timeline_delta, quality.timeline_ctl, and a contact-sheet preview instead; pass export=true on the turn where the user asks to finish. A fresh session starts immediately with GPT-5.6 Luna and Extra High thinking; model selection is opt-in through $cassette-model in Codex, /cassette-model in Claude Code/OpenCode, /cassette_model in Hermes, or an explicit natural-language request. The saved session preference applies from the next turn.
Behavior change (0.4.0): on MCP hosts, edit_plan_review now surfaces as a real question by default (CASSETTE_PLAN_REVIEW=user) instead of being silently auto-approved — answer with approve, revise <feedback>, or reject, in chat or in the open editor tab (first answer wins). Set CASSETTE_UNATTENDED=1 to restore the previous fully headless behavior. Status envelopes additionally carry timeline_delta (what changed) and plan_progress, fed by the run's SSE event stream (CASSETTE_API_STREAM=0 disables).
Ready to Use with Hermes 📼
Now you can pick up your phone and DM your agent! Don't forget to keep your agent alive and network connected.
In QQ or Telegram:
Send one or more video, image, or audio files.
Wait for the saved-material acknowledgement.
Send the edit instruction in the same conversation or prefix it with
/edit. The session starts with GPT-5.6 Luna and Extra High thinking; send/cassette_modelonly when you want to change them. Your words go to the Cassette agent verbatim; optimization and BGM remain explicit via/refineand/music.Each turn ends with the edit saved (timeline delta + contact-sheet preview, no render). Depending on the client, the preview is delivered as an image or a labeled local thumbnail link. Keep editing in the same conversation. Say "export" when you want the video, and the plugin renders and delivers it through the gateway when supported.
Command | Explanation |
| Clear your assets and start a new conversation with Hermes |
| Edit the current video based on your instruction. |
| Refine your edit instruction and start editing. |
| Match and add a BGM to your assets based on your request. |
| Stop the current Cassette edit. |
| Check the uploaded assets and their status. |
| Select the current Cassette model and thinking level. |
| Set Cassette’s response language to Chinese. |
| Set Cassette’s response language to English. |
| Check the status of a specific job. |
| Cancel a specific job. |
Assets and video state are preserved within the same conversation session. You can send additional messages in the same session to further modify the edited video results.
Use
/newor/resetto start a fresh Hermes session and clear the live Cassette session and your assets for that conversation.QQ is set to Chinese and Telegram is set to English by default, you can set language by command
/cassette language zh/enmanually.
Update
The runtime checks the release channel once a day and, when a newer version exists, tells your agent — which mentions it once and offers to run the command below for you. Set CASSETTE_UPDATE_CHECK=0 to turn that check off.
Host | Automatic | Manual |
Claude Code | yes, once enabled (below) |
|
Codex | marketplace snapshot only |
|
Hermes | no |
|
OpenCode | no | re-run the install command |
Claude Code: automatic updates
Claude Code checks for marketplace and plugin updates after your session starts, with a random delay of up to ten minutes, so the session you are in keeps the version it launched with — you are prompted to run /reload-plugins, or the new version loads next launch. It is off by default for third-party marketplaces, so turn it on once — scripts/setup_local_mcp.py offers to do this during setup (skip with --no-auto-update), or do it yourself in /plugin → Marketplaces → cassette-editor → Enable auto-update, or in ~/.claude/settings.json:
{
"extraKnownMarketplaces": {
"cassette-editor": {
"source": { "source": "github", "repo": "Cassette-Editor/oh-my-cassette" },
"autoUpdate": true
}
}
}Declaring it in settings.json wins over the /plugin toggle — Claude Code syncs the declared value into its marketplace state and then points you back at the settings file to change it.
Because the setup prompt only runs at setup, an install that predates it — or one where it was declined — would never hear about the toggle again. So on Claude Code the runtime also reads that setting at startup and, while auto-update is off, asks your agent to mention it at most once per session and point you at the toggle. Your agent will not edit your Claude configuration itself. CASSETTE_UPDATE_CHECK=0 silences this along with the release check.
Claude Code's DISABLE_AUTOUPDATER turns off all automatic updates including plugins; pair it with FORCE_AUTOUPDATE_PLUGINS=1 to keep plugin updates while managing Claude Code itself manually.
Codex
Codex refreshes configured git marketplace snapshots on its own, but installed plugins are cached per version, so one command applies the new one:
codex plugin marketplace upgrade cassette-editor # only needed if the snapshot is stale
codex plugin add oh-my-cassette@cassette-editorOpenCode
Re-run the install command — it is the same command for installs and updates:
curl -fsSL https://raw.githubusercontent.com/Cassette-Editor/oh-my-cassette/release/scripts/install_opencode.py | python3 -The local launcher updates its locked, plugin-managed virtual environment automatically on the next start after any of these.
Hermes
If installed through the Hermes plugin manager:
hermes plugins update cassette
hermes gateway restartIf installed from a git checkout (symlink install), update the checkout:
git pull --ff-only
hermes gateway restartIf the plugin was installed with --copy, reinstall the copied plugin after pulling:
git pull --ff-only
python3 scripts/install_plugin.py --copy --force
hermes gateway restartSee CHANGELOG.md for what changed in each release.
Existing symlink installs keep working — migration is optional. To switch:
rm ~/.hermes/plugins/cassette # removes only the symlink, not your checkout
hermes plugins install Cassette-Editor/oh-my-cassette
hermes gateway restartYour credentials in ~/.hermes/.env and the plugin's enabled state carry over;
already-set values are not prompted again. Don't run
hermes plugins install --force on top of a symlink — it fails with a
confusing error instead of replacing it.
❓ FAQ
Which AI agents does Oh My Cassette work with?
Claude Code, Codex, OpenCode, and Hermes Agent are supported out of the box, and any other MCP host can connect to the local cassette MCP server. Sessions live in a host-agnostic data directory, so you can start an edit in one host and continue it in another.
Does it edit videos locally or in the cloud?
The plugin runs locally beside your agent and handles media ingestion, edit planning, and job supervision. The actual editing and rendering happen on Cassette, so you don't need a GPU or any editing software installed.
Do I need a Cassette account?
Yes. The installer asks for your Cassette account email and password on first run and stores them locally; the plugin authenticates with Cassette on your behalf.
What kinds of videos can it make?
Montage and story edits — vlogs, travel videos, music-driven shorts, cooking tutorials, product commercials, and game highlights — with beat-synced cuts, subtitles, picture-in-picture, transitions, and auto-matched background music. See Case Videos for real examples with prompts and processing times.
Can I see what the agent is doing mid-edit?
Yes. After each editing turn you get a timeline digest and a contact-sheet JPEG saved locally. Terminal clients present a clickable local thumbnail link, and supported gateway clients can deliver the preview as an image. Before the edit runs, the agent can also surface the plan as a storyboard sheet (one source frame per planned beat) for review. The plugin intentionally does not expose an editor deep link.
Can I try it without installing anything?
No. Install the plugin in a supported agent host and sign in with a Cassette account.
Is Oh My Cassette free and open source?
This plugin is free and open source under the MIT license — all of it, including the MCP server and the skill.
Rendering runs on Cassette, a separate hosted service that requires an account. See Cassette's pricing for what an account costs.
🔨 Development & Troubleshooting
Setup for contributors, the full configuration reference, transport internals, the diagnostic scripts, and answers to common runtime problems all live in docs/development.md.
Quick diagnostic — run this first when something misbehaves:
python3 scripts/diagnose_local_mcp.py # Codex / Claude / OpenCode
python3 scripts/diagnose_install.py # HermesBoth report bootstrap, config, transport, and media-root state without printing credentials.
💬 Community
Discussions — ask questions, share the cuts you made, and see what's planned.
Discord — chat with contributors and other users.
Issues — bug reports and feature requests. Issues labelled
good first issueare a good place to start.CONTRIBUTING.md — how to propose a change.
Made something you like with it? Post it in Discussions — we feature the best cuts in the showcase.
License
MIT. See LICENSE.
Available Tools
16 toolscassette_answer_questionC
Classify a Cassette question using question mode, or resume an interrupted job using validated job_id and response fields.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | No | ||
| context | No | ||
| question | No | ||
| response | No | ||
| asset_count | No | ||
| instruction | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, but it only hints at two modes without explaining side effects, validation requirements, state changes, or prerequisites. 'Validated job_id' implies a check but does not describe what validation means or what happens with invalid input. The description does not disclose whether the tool mutates state, requires authentication, or returns job progress.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no wasted words, but it is not well-structured because it awkwardly combines two potentially distinct operations. The phrase 'using question mode' is jargon and does not aid clarity. It is concise but at the expense of necessary explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six optional parameters, no annotations, and zero schema description coverage, the description provides only minimal context about question mode and job resumption. An output schema exists, so return values are not the main gap, but the missing explanations for context, asset_count, and instruction make the definition incomplete. An agent cannot confidently determine required inputs or correct mode selection from this description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining the six parameters, but it only alludes to 'question', 'job_id', and 'response'. Parameters like 'context', 'asset_count', and 'instruction' are completely unmentioned, leaving their roles unclear. The phrase 'validated job_id and response fields' adds some meaning, but it is insufficient for an agent to construct a correct call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a verb ('Classify') and a resource ('Cassette question'), but 'question mode' is vague and unexplained, making the primary purpose ambiguous. It also introduces a secondary 'resume an interrupted job' use case without clarifying how it relates to the tool's main function. The description does not clearly differentiate this tool from siblings like cassette_run_job or cassette_job_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies two usage contexts: classifying a question and resuming an interrupted job with a validated job_id and response. However, it provides no explicit guidance on when to choose this tool over alternatives such as cassette_run_job or cassette_job_status. There are no exclusion criteria or conditional instructions beyond the vague phrase 'using question mode.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_cancel_jobB
Request cooperative cancellation of a persisted Cassette job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
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 adds some useful nuance with 'cooperative' and 'persisted', but it does not disclose side effects, whether cancellation is guaranteed or reversible, auth requirements, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Every qualifier ('request', 'cooperative', 'persisted') adds meaningful context, making this an appropriately concise and structured description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema, the description is close to sufficient. But with no annotations and no lifecycle context, an agent is left uncertain about when cancellation applies, whether completed jobs can be cancelled, and what 'cooperative' means in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the only parameter has just a title. The description does not explicitly explain that job_id is the identifier of the target job, where to get it, or its expected format, so it fails to compensate for the schema's lack of detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('request cooperative cancellation') and a specific resource ('persisted Cassette job'). No sibling tool serves the same cancellation purpose, so it is clearly distinguishable from run_job and job_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the cancellation verb and the qualifier 'persisted' suggests the job must already exist. However, the description does not explicitly say when to use it, when not to use it, or how it relates to other job-lifecycle tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_configA
On-demand model picker for the session. Call only when the user asks to view or change the Cassette model. With only session_id it returns the current choice and available options; pass model (id or label) and/or thinking_level to change them. The choice persists for the session and applies from the next cassette_run_job turn. Default: GPT-5.6 Luna with xhigh thinking.
| Name | Required | Description | Default |
|---|---|---|---|
| model | No | ||
| session_id | Yes | ||
| thinking_level | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and handles it well: it discloses session-scoped persistence, effect timing (applies from the next run_job turn), the default (GPT-5.6 Luna with xhigh thinking), and the read-versus-write dual mode. Minor gaps remain, such as behavior on invalid model ids or partial-change semantics, but the operational behavior an agent needs to predict side effects is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, roughly 70 words, with the trigger condition front-loaded in the second sentence and every sentence carrying load: purpose, when, how, persistence, default. There is no filler, no repetition of schema fields, and no wasted phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderate-complexity config tool with an output schema, the description covers all operational essentials: trigger, both modes, parameter meaning, persistence, timing, and the default. The presence of an output schema covers return-value details, so 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.
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 clarifies each parameter: session_id alone triggers view mode, model accepts 'id or label' (a format not present in the schema), and thinking_level is a changeable option with its enum values left to the schema. It adds mode-distinction semantics that the bare property names do not convey, though it stops short of giving concrete examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource framing ('On-demand model picker for the session') and narrows the scope with an explicit trigger: 'Call only when the user asks to view or change the Cassette model.' It distinguishes itself from execution siblings like cassette_run_job by describing the dual view/change behavior on the model configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to invoke — 'Call only when the user asks to view or change the Cassette model' — and further branches by mode: with only session_id (view), or with model/thinking_level (change). It also gives timing context by noting the change 'applies from the next cassette_run_job turn,' connecting the tool to its execution sibling. No inference is required to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_editA
Surgical no-LLM timeline edit through the manual-editor command lane (requires CASSETTE_DIRECT_EDIT=1). Use for small named changes (trim, text, delete, undo) after reading cassette_timeline; big or creative briefs go through cassette_run_job. input is always {"payload": {...}}. Pass expected_version from the last timeline read; tool_name 'undo' with input.cursorSequence rewinds the shared operation history.
| Name | Required | Description | Default |
|---|---|---|---|
| input | No | ||
| tool_name | Yes | ||
| session_id | Yes | ||
| expected_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It reveals that the tool is a direct, no-LLM command-lane edit, requires a specific environment flag, expects a specific input envelope, relies on expected_version, and describes how undo rewinds shared history. This is strong disclosure, though it does not detail all side effects or failure conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences deliver purpose, usage boundaries, prerequisites, input shape, versioning, and undo behavior without repetition. The most important trait ('Surgical no-LLM timeline edit') is front-loaded, and every clause adds signal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the tool is moderately complex, the description covers the critical call pattern, prerequisite, workflow order, and differentiation from cassette_run_job. The main remaining gap is undocumented session_id semantics and the full set of tool_name values, but an agent can still invoke the tool correctly with what is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It usefully explains that input is always a payload wrapper, that expected_version comes from the last timeline read, and that tool_name 'undo' pairs with input.cursorSequence. However, it does not explain session_id semantics or enumerate the other valid tool_name values, leaving part of the parameter surface undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Surgical no-LLM timeline edit through the manual-editor command lane.' It names concrete operations (trim, text, delete, undo) and explicitly contrasts itself with cassette_run_job. An agent can immediately tell what this tool does and how it differs from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use for small named changes... after reading cassette_timeline' and 'big or creative briefs go through cassette_run_job.' It also flags the required environmental prerequisite CASSETTE_DIRECT_EDIT=1, leaving little ambiguity about when this tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_ingest_mediaA
Ingest a trusted local media file from the active host project or an explicitly configured media root. Generates a cryptographically random session_id when omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| caption | No | ||
| chat_id | No | ||
| user_id | No | ||
| platform | No | ||
| chat_type | No | ||
| thread_id | No | ||
| media_type | No | ||
| message_id | No | ||
| session_id | No | ||
| source_path | Yes | ||
| original_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a useful behavior: 'Generates a cryptographically random session_id when omitted,' and restricts input to trusted local media. However, it does not mention side effects, whether the original file is moved/copied, authentication needs, or the response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The main purpose is front-loaded, and the session_id generation note is a concise, valuable addition. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 params, no schema descriptions, no annotations), the description is too sparse. It does not clarify the meaning of optional metadata fields, the expected format of source_path, or the output behavior (although an output schema exists). An agent would likely need to guess at most parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It only explains session_id (generated when omitted) and leaves the other 10 parameters, including required source_path, completely unexplained. This is insufficient for an 11-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Ingest'), the resource ('a trusted local media file'), and the source constraints ('active host project or an explicitly configured media root'). This is specific enough to distinguish it from sibling tools like cassette_list_assets or cassette_timeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies when to use it (when you have a local media file from an allowed root) but provides no explicit guidance on when not to use it or which sibling tool would be a better alternative. The source restriction is useful context, but alternatives are not mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_jamendo_setupA
Validate and privately store this machine's own Jamendo Client ID for read-only music matching. Before calling, explain that the user creates a read-only application at https://devportal.jamendo.com/, no Client Secret is needed, and pasting the Client ID places it in the conversation transcript. Ask for their Client ID; never invent one and never ask for a Client Secret. A failed validation preserves existing configuration.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and handles it well. It discloses that the tool stores data privately, that matching is read-only, that the Client ID appears in the transcript, that validation failure preserves existing configuration, and that the agent must not fabricate credentials. This is strong behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and purpose, then adds necessary user-interaction and safety instructions. Every sentence adds meaningful guidance, and it remains compact for the amount of safety-critical context it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter setup tool with an output schema present, the description covers the essential interaction script, privacy concern, failure behavior, and security constraints. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It does: the lone parameter client_id is explained as the user's own Jamendo Client ID, no Secret is involved, and the tool must ask for it rather than invent one. This gives the agent everything needed to handle the parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: validate and privately store this machine's Jamendo Client ID for read-only music matching. It names a specific resource (Client ID), a specific verb (validate/store), and its purpose, which differentiates it from matching or ingestion siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit step-by-step guidance: explain the read-only application requirements, warn about transcript exposure, ask for the Client ID, and never invent or request a Client Secret. It does not explicitly name alternative tools or state when not to use this tool, but the setup context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_job_statusA
Re-attach to a job whose cassette_run_job call did not return — host restart, cancellation, or a turn deliberately started with wait=false. Call it once and act on the phase; it is not a progress loop. wait_for_change_sec gives an unsettled job up to 30 seconds to reach its next phase before answering.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| job_id | No | ||
| session_id | No | ||
| wait_for_change_sec | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
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 it well: it reveals that this is a re-attachment mechanism rather than a fresh poll, that calling it once is enough, and that wait_for_change_sec can block up to 30 seconds for a phase transition. The safety profile is unstated, but the core behavior an agent must know before invoking is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler. The first sentence front-loads purpose and trigger conditions, the second delivers the usage directive and the important non-loop warning, and the third clarifies the wait parameter. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a status/attach tool with an output schema and 4 optional parameters, the description covers the essential decision points: when to use it, what to do after the call ('act on the phase'), and the wait cap. Minor gaps remain (limit, session_id semantics), but nothing that would prevent a correct first invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explicitly explains wait_for_change_sec (adds the 30-second cap, which the schema lacks) and implicitly ties job_id to the re-attachment scenario. However, limit and session_id receive no semantic guidance, leaving two of four parameters under-explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Re-attach to a job' whose cassette_run_job did not return. It enumerates the exact triggering scenarios (host restart, cancellation, wait=false) and explicitly disambiguates itself from a progress loop, so an agent can clearly distinguish this from siblings like cassette_run_job and cassette_cancel_job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear when-to-use condition ('whose cassette_run_job call did not return') and a strong when-not signal ('it is not a progress loop'), plus a call-once directive. It stops short of naming a specific alternative tool for progress polling, so the exclusion is implicit rather than explicit, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_list_assetsA
List media assets isolated to one Cassette session.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | No | ||
| session_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It adds one useful behavioral trait: the returned assets are scoped to a single session. However, it does not explain required inputs, whether both session_id and chat_id are needed, or any pagination/filtering specifics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One direct sentence with no filler. The primary action and resource are front-loaded, and the scoping detail follows immediately. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although an output schema exists and the tool is conceptually simple, the lack of parameter guidance makes it incomplete. An agent cannot reliably know whether to supply session_id, chat_id, or both, especially with no required parameters and zero schema descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the undocumented chat_id and session_id parameters. It mentions 'one Cassette session' but never clarifies which parameter identifies that session or what chat_id means in relation to it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List'), a concrete resource ('media assets'), and a clear scope ('isolated to one Cassette session'). This distinguishes it from sibling tools like cassette_ingest_media or cassette_timeline, so an agent can identify its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'isolated to one Cassette session' implies this tool is for retrieving assets within a session, which gives some usage context. However, it does not explicitly state when to prefer this over alternatives, nor does it mention any conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_loginA
Sign this machine in to Cassette, or have a replacement password emailed. Pass email plus the generated password from the user's Cassette email. Cassette passwords are always server-generated, never chosen — ask the user for theirs, never invent one. If they no longer have it, confirm with them first, then pass request_new_password=true with confirm_replace=true: that replaces the account password on every machine they use and emails a new one. Credentials are verified before anything is written, so a wrong password leaves an existing working setup untouched.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| password | No | ||
| confirm_replace | No | ||
| request_new_password | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the behavioral disclosure burden. It clearly discloses the side effect of password replacement across all machines, the need for user confirmation, and the crucial safety property that credentials are verified before any write occurs, leaving an existing working setup untouched. This is strong behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense; each sentence earns its place. It front-loads the primary action, then covers the alternative flow, the critical constraint about server-generated passwords, and the safety guarantee. There is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a login tool with no annotations, an output schema available, and four parameters, the description provides complete context: when to call it, what parameters to use, what side effects occur, and what safety behavior to expect. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description compensates exceptionally well. It explains that email plus the server-generated password is the normal path, that password is never user-chosen, and that request_new_password and confirm_replace must be passed together to replace the password. This makes all four parameters and their interrelationships clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's core purpose: signing the current machine in to Cassette, with an explicit alternative for password replacement. It names the specific verb and resource, and it is unmistakably distinct from sibling tools like cassette_ingest_media or cassette_run_job, so an agent can easily tell when this is the login tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit and detailed usage instructions, including the requirement to ask the user for their server-generated password, never invent one, and the exact condition for requesting a replacement password with both request_new_password=true and confirm_replace=true. It does not explicitly compare against sibling tools, but no sibling appears to handle authentication, so this is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_make_promptC
Build a complete Cassette edit prompt from a natural-language instruction and session assets.
| Name | Required | Description | Default |
|---|---|---|---|
| style | No | ||
| chat_id | No | ||
| duration | No | ||
| language | No | ||
| session_id | No | ||
| constraints | No | ||
| instruction | Yes | ||
| output_format | No | ||
| requires_assets | No | ||
| cassette_language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the full burden of behavioral disclosure. It does not state whether the tool is read-only, whether it modifies session assets, what it does if assets are missing, or what 'session assets' means in practice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence with the main action front-loaded and no filler. It is concise, but the brevity leaves the substance to be covered by other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-parameter tool with no annotations and zero schema description coverage, one high-level sentence is not enough. The presence of an output schema helps with return values but not with parameter roles, selection guidance, or behavioral expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate for the 10 parameters, but it only names 'instruction' and 'session assets.' It does not add meaning to style, duration, constraints, output_format, requires_assets, or the cassette_language options.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Build') and a clear object ('a complete Cassette edit prompt') plus the source inputs. It conveys what the tool does, though it does not explicitly compare it with siblings like cassette_edit or cassette_timeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to choose this tool over direct alternatives such as cassette_edit, nor are prerequisites or exclusions mentioned. Usage must be inferred from the word 'prompt,' which is insufficient for a 15-tool family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_match_bgmC
Match and optionally register a Free To Use background-music asset for a session.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | ||
| instruction | Yes | ||
| fallback_from | No | ||
| search_queries | Yes | ||
| fallback_reason | No | ||
| continue_after_match | No | ||
| optimization_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral disclosure burden. It reveals that registration is optional, but does not explain side effects, whether the session is modified, what 'register' means, or any prerequisites or failure behaviors. The schema hints at fallback and optimization flows, which the description ignores.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundancy. Every phrase adds meaning and it is easy to parse quickly, even if more content is needed elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with seven parameters, no annotations, and no schema descriptions, this one-line description is far too sparse. The tool's fallback, continuation, and optimization behaviors are completely unexplained, and the relationship to sibling matchers is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description offers no explanation of the seven parameters, including required ones like instruction and search_queries. The agent gets no help understanding how these values shape the matching or registration behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Match') and resource ('Free To Use background-music asset'), and adds the 'optionally register' nuance. It reads as a clear purpose, though it does not explicitly contrast with the similarly named sibling cassette_match_exact_bgm.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what the tool does but gives no guidance on when to use it versus alternatives like cassette_match_exact_bgm or jamendo_music_matcher. There is no mention of when-not scenarios, fallback conditions, or when registration should be enabled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_match_exact_bgmB
Match an exact song and artist, optionally download it, and register it with the session.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| artist | No | ||
| singer | No | ||
| download | No | ||
| songTitle | No | ||
| session_id | Yes | ||
| song_title | No | ||
| instruction | Yes | ||
| continue_after_match | No | ||
| optimization_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It does disclose two important behaviors: downloading is optional, and the match is registered with the session, signaling a side effect. But it does not address failure behavior, permissions, overwriting behavior, or what happens when download is disabled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler. Every clause adds meaningful information: the exact match, optional download, and session registration. It is easy to parse and appropriately sized for a high-level purpose statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, no annotations, and no schema descriptions, the description must anchor correct invocation, but it omits key context: what instruction is for, what 'exact' means in matching behavior, what continue_after_match and optimization_enabled do, and what happens on no match. The output schema does not compensate for these invocation gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description only loosely maps to 'song and artist', 'download', and 'session'. It says nothing about the required instruction parameter, continue_after_match, optimization_enabled, singer, songTitle/song_title, or how title/artist are interpreted. For a 10-parameter tool, this is insufficient compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action: matching an exact song and artist, with optional download and session registration. The word 'exact' helps differentiate it from the sibling cassette_match_bgm, but the sibling is not named and the differentiation is implicit rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'exact song and artist' implies this tool is for cases where a precise track is known, as opposed to cassette_match_bgm. However, there is no explicit statement of when to use it versus alternatives, no exclusions, and no guidance for ambiguous or failed matches. Usage context is implied but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_review_completionB
Resolve a review-required completion. Rendering starts only for an explicit, validated decision=export. For a cassette_run_job(export=true) triggered by the user's explicit export request, review the attached timeline and call this immediately in the same assistant turn; do not ask the user to authorize export again merely because the Cassette agent's prose claims rendering is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| reason | Yes | ||
| summary | No | ||
| decision | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It usefully reveals that rendering only starts for decision=export and that this should be called as an immediate follow-up. However, it does not explain what happens for continue, needs_user, or failed decisions, nor whether the tool mutates job state in a way that requires caution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two dense sentences with important information front-loaded: the decision condition appears first, then the specific usage scenario. Some wording is repetitive ('explicit... export' appears twice), but overall it is efficient and focused.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex with four parameters, an enum, and no annotation support. The description covers the main export trigger well and tells the agent exactly when to act, but it omits the meaning of the other enum decisions, the role of reason and summary, and how this tool relates to the surrounding cassette job lifecycle tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It explains the decision=export value and ties it to rendering, but it does not clarify job_id, reason, or summary semantics. The agent is left to guess what reason text is expected and whether summary is required for certain decisions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Resolve a review-required completion') and specifies the key behavior: rendering starts only with an explicit, validated decision=export. It is more specific than a tautology, though 'review-required completion' is not fully defined and the agent must infer the exact resource from context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete trigger condition: cassette_run_job(export=true) triggered by the user's explicit export request, and instructs the agent to call this tool immediately in the same turn. It also explicitly warns against re-asking the user for authorization. However, it does not describe when to prefer sibling tools such as cassette_job_status or cassette_cancel_job for other outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_run_jobA
Run one Cassette edit turn and return when it is settled. This call IS the wait: it streams progress notifications while the agent works and answers with the terminal envelope (succeeded / needs_user / review_required / exported / failed). Pass message as the user's words verbatim. Exactly one cassette_run_job call per user turn: after any settled result, return control to the user. Never start a corrective, retry, or follow-up run in the same user turn, even if you think the edit could be improved. Do not poll cassette_job_status after a settled result; that tool is only for resuming a job whose call was interrupted. Pass wait=false only to deliberately detach the turn into the background. If an explicit export request returns phase=review_required, the user has already authorized export: inspect the attached timeline and call cassette_review_completion in this same assistant turn. Do not ask for redundant confirmation, and do not start another cassette_run_job.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | ||
| wait | No | ||
| model | No | ||
| export | No | ||
| prompt | No | ||
| chat_id | No | ||
| message | No | ||
| language | No | ||
| selectors | No | ||
| session_id | No | ||
| instruction | No | ||
| timeout_sec | No | ||
| chat_message | No | ||
| cassette_model | No | ||
| thinking_level | No | ||
| cassette_message | No | ||
| cassette_language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly explains that the call blocks by acting as the wait, streams progress, returns terminal envelopes, and can be detached via wait=false. It also discloses the review_required branch and the required follow-up action, though it does not describe side effects, authentication, or asset mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with the core purpose and blocking behavior front-loaded. Nearly every sentence adds operational value, though some repetition exists around not starting additional runs and not asking for redundant confirmation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The operational flow is thoroughly explained for the main user-turn lifecycle, and an output schema exists so return-value documentation is not required. However, with no annotations and 17 undocumented parameters, the description is not fully complete for all calling scenarios, especially around the many model, session, and instruction-related parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 17 parameters, yet the description only meaningfully explains message, wait, and export-related behavior. Most parameters, including instruction, prompt, chat_message, cassette_message, selectors, session_id, and cassette_model, are left entirely unexplained, which is a large gap for a zero-coverage schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it runs one Cassette edit turn and returns when the result is settled. It also differentiates itself from siblings by naming cassette_job_status and cassette_review_completion, and clearly defines the tool as the waiting call itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives unusually explicit usage rules: exactly one call per user turn, never start follow-up runs, do not poll job_status after a settled result, and use wait=false only to detach into the background. It also names the alternative tool for resuming interrupted jobs and the review completion tool for review_required results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cassette_timelineA
Read the live Cassette timeline as a bounded text digest (CTL). Call this before any statement about project state — never answer from memory. contact_sheet=true also tiles the stored clip posters into one image (zero render) and saves it locally. Present the returned contact_sheet_uri as the thumbnail link. In Hermes TUI, label it as saved locally and output MEDIA: on its own line; use the URL-encoded URI, never the raw contact_sheet_path, because raw paths may contain spaces.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | ||
| profile | No | ||
| session_id | Yes | ||
| contact_sheet | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool is a live read, that contact_sheet=true performs zero-render tiling and saves a local file, and that the returned URI must be URL-encoded because raw paths may contain spaces. This is strong, useful transparency, though it does not cover authentication or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries meaningful guidance: what the tool reads, when to use it, what contact_sheet does, and exactly how to format the output in Hermes TUI. Despite covering multiple instructions, the description stays compact and front-loads the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is strong for usage and output formatting, and an output schema exists to cover return values. However, for a tool with four parameters and zero schema descriptions, leaving detail and profile undefined is a meaningful gap. The agent can still call the tool with only the required session_id, but full contextual understanding is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It does explain contact_sheet's effect well, but it says nothing about detail or profile, and session_id is only implicitly understood from the tool's purpose. The description does not give enough semantic context for the full parameter set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read the live Cassette timeline as a bounded text digest (CTL).' This clearly differentiates the tool from siblings like cassette_ingest_media or cassette_edit, and the term 'live' plus 'bounded text digest' gives a precise picture of what the tool returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage rule: 'Call this before any statement about project state — never answer from memory.' It also explains when the contact_sheet option matters and how to present the resulting URI. It does not mention alternatives or exclusions, so it stops short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jamendo_music_matcherC
Search Jamendo with validated fixed-form music preferences and optionally register a result.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| limit | No | ||
| download | No | ||
| fuzzyTags | No | ||
| outputDir | No | ||
| userQuery | Yes | ||
| fuzzy_tags | No | ||
| repairJson | No | ||
| searchPlan | No | ||
| session_id | No | ||
| user_query | No | ||
| searchTerms | Yes | ||
| search_plan | No | ||
| excludeTerms | No | ||
| search_terms | No | ||
| exclude_terms | No | ||
| limitOverride | No | ||
| vocalInstrumental | No | ||
| vocalinstrumental | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| data | No | |
| error | No | |
| phase | Yes | |
| job_id | No | |
| warnings | No | |
| artifacts | No | |
| session_id | No | |
| next_action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It reveals that a result may be 'registered', implying a potential side effect, but it does not explain what registration means, whether files are downloaded (despite download defaulting to true), or what side effects occur beyond search. This is minimal and potentially misleading for a tool with mutable behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short but not effectively concise; it omits essential context and uses unclear phrasing. The single sentence does not earn its place because it introduces ambiguity ('validated fixed-form', 'optionally register') instead of clarifying the tool's behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 19 parameters, no annotations, an output schema, and sibling tools, the description is severely incomplete. It does not address parameter semantics, side effects, prerequisites, or selection criteria, making it inadequate for an agent to confidently invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no meaning to any of the 19 parameters. It does not explain the required userQuery and searchTerms, the purpose of the many alias parameters, or how the various optional settings behave. The agent must infer everything from parameter names alone, which is insufficient for a complex tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the primary action ('Search Jamendo') and a secondary side effect ('optionally register a result'), so an agent can tell it is a Jamendo search tool. However, the phrase 'validated fixed-form music preferences' is jargon-heavy and does not clarify what inputs constitute those preferences, and it does not meaningfully distinguish the tool from Jamendo-related siblings like cassette_jamendo_setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus the sibling tools, such as cassette_match_bgm or cassette_jamendo_setup. There are no context cues, prerequisites, or exclusions, leaving the agent to guess whether this tool is the right choice for a given music-matching task.
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. Dates show when Glama detected each change.
16 tool updates
v0.4.19- Changed
cassette_answer_question1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_cancel_job1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_config1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_edit1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_ingest_media1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_jamendo_setup1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_job_status1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_list_assets1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_login1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_make_prompt1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_match_bgm1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_match_exact_bgm1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_review_completion1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_run_job1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
cassette_timeline1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
- Changed
jamendo_music_matcher1 field changed- added
Output schema / $defs / Artifact / properties / expires_atAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Expires At" +}
1 tool update
v0.4.16- Added
cassette_jamendo_setup
1 tool update
v0.4.11- Added
cassette_login
2 tool updates
v0.4.10- Changed
cassette_config1 field changed- changed
Input schema / properties / thinking_level / anyOfPrevious value: -[ - { - "enum": [ - "low", - "medium", - "high" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "off", + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "type": "string" + }, + { + "type": "null" + } +]
- Changed
cassette_run_job2 fields changed- changed
Input schema / properties / thinking_level / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "off", + "minimal", + "low", + "medium", + "high", + "xhigh" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / wait / defaultPrevious value: -falseNew value: +true
12 tool updates
v0.4.6- Added
cassette_answer_question - Added
cassette_cancel_job - Added
cassette_config - Added
cassette_edit - Added
cassette_job_status - Added
cassette_make_prompt - Added
cassette_match_bgm - Added
cassette_match_exact_bgm - Added
cassette_review_completion - Added
cassette_run_job - Added
cassette_timeline - Added
jamendo_music_matcher
3 tool updates
v0.1.1- Removed
cassette_edit - Removed
cassette_make_prompt - Removed
cassette_timeline
5 tool updates
v0.1.0- First observed
cassette_edit - First observed
cassette_ingest_media - First observed
cassette_list_assets - First observed
cassette_make_prompt - First observed
cassette_timeline
TDQS
Most tools have distinct responsibilities, but cassette_match_bgm, cassette_match_exact_bgm, and jamendo_music_matcher overlap heavily in the music-matching space and could be misselected. Also, cassette_answer_question and cassette_job_status both offer job-resumption paths, adding mild ambiguity.
The set mostly follows a consistent cassette_verb_noun pattern with snake_case, which is predictable and readable. Exceptions include jamendo_music_matcher lacking the cassette_ prefix and cassette_timeline being a noun instead of a verb, but these are minor deviations.
Sixteen tools is at the upper edge of the ideal range, but the count is justified by the server's scope: media ingestion, timeline editing, job lifecycle, music matching, configuration, and login. Each tool has a clear operational niche, though some trimming of the music matcher variants would tighten the set.
The server covers the core media-editing workflow well: ingest, list assets, read timeline, edit, run jobs, check status, review completion, and cancel. Minor gaps exist such as no explicit asset deletion or logout, but they do not create dead ends for the primary workflow.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Edit video by talking to your AI — search footage, cut timelines, apply effects, add captions.
Transcode and host video from one prompt; get a playable link back. Agent-native, over MCP.
Create and edit AI videos from chat: plan shots, generate scenes, and export stories and ads.
Agentic video editing on real footage: cut, caption, reframe, score, and export at full quality.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables video indexing with TwelveLabs by uploading local video files and tracking task status.7269MIT
- AlicenseAqualityCmaintenanceEnables AI agents to edit video assemblies from A-roll and B-roll, add captions, and publish to social media platforms.2717MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants like Claude Code to build and edit CapCut video projects locally by creating drafts, adding media and effects, and saving projects that open in CapCut desktop.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceA real video editor for AI agents, served over MCP, enabling journaled timeline editing, rendering via FFmpeg/MLT, and deterministic CLI operation.1MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Cassette-Editor/oh-my-cassette'
If you have feedback or need assistance with the MCP directory API, please join our Discord server