sanzaru
Supports Databricks Apps with Unity Catalog Volumes as a storage backend, enabling per-user media storage isolation for multi-tenant deployments.
Provides integration with OpenAI's APIs for video generation (Sora), image generation, audio transcription (Whisper, GPT-4o), text-to-speech, and podcast generation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sanzarumake a video of a cat playing piano"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sanzaru
A stateless, lightweight MCP server and agent CLI that wraps OpenAI's Sora Video API, Whisper, GPT-4o Audio, and TTS APIs via the OpenAI Python SDK.
Features
Video Generation (Sora)
Create videos with
sora-2orsora-2-promodelsUse reference images to guide generation
Remix and refine existing videos
Download variants (video, thumbnail, spritesheet)
Image Generation
Generate images with gpt-image-2 (recommended), gpt-image-1.5, or GPT-5
Edit and compose images with up to 16 inputs
Iterative refinement via Responses API
Automatic resizing for Sora compatibility
Audio Processing
Transcription: Whisper and GPT-4o models
Audio Chat: Interactive analysis with GPT-4o
Text-to-Speech: Multi-voice TTS generation
Processing: Format conversion, compression, file management
Podcast Generation
Multi-voice podcasts with up to 4 speakers and 10 TTS voices
Parallel segment generation with configurable pacing
MP3/WAV output with loudness normalization
ElevenLabs
dialoguerender mode: consecutive turns go out together so the model paces them--verifytranscribes the rendered audio and re-renders segments the TTS silently dropped
Simulated Podcasts
The conversation is generated, not read — N
gpt-realtimeagents actually talk to each otherEach host hears the others' audio, so they respond to delivery and timing, not to a transcript
Pre-production plans acts that record in parallel: a 30-minute episode in ~1 minute
Checkpointed per act and resumable; cost ceiling, dry-run projection, per-host stems
QC transcribes the rendered audio and judges it against the plan
Agent CLI
Every capability as a shell command:
sanzaru video create,sanzaru image generate, ...One-shot async workflows:
create ... -o out.mp4submits, polls, downloads in one commandJSON envelopes on stdout, progress on stderr, deterministic exit codes, resumable waits
Concurrent fan-out (multi-prompt image batches, multi-job
wait) and arbitrary-ooutput pathsSee
docs/cli.md— baresanzarustill runs the MCP server (nothing breaks)
Note: Content guardrails are enforced by OpenAI. This server does not run local moderation.
Related MCP server: mcp-media-engine
Requirements
Python 3.10+
OPENAI_API_KEYenvironment variable
Media storage (choose one):
# Recommended: unified path (auto-creates videos/, images/, audio/ subdirs)
SANZARU_MEDIA_PATH="/path/to/media"
# Or individual paths (legacy, still supported)
VIDEO_PATH="/path/to/videos"
IMAGE_PATH="/path/to/images"
AUDIO_PATH="/path/to/audio"Features are auto-detected based on configured paths. Set only what you need.
Quick Start
Clone the repository:
git clone https://github.com/TJC-LP/sanzaru.git cd sanzaruRun the setup script:
./setup.shThe script will:
Prompt for your OpenAI API key
Create directories and
.envconfigurationInstall dependencies with
uv sync --all-extras --dev
Start using:
claude
That's it! Claude Code will automatically connect and you can start generating videos, images, and processing audio.
Or skip MCP entirely — the agent CLI
uv tool install sanzaru && export OPENAI_API_KEY=sk-...
# One command: submit Sora job → poll → download → print the file path
sanzaru video create "a tabby cat stretches on a windowsill" --seconds 4 -o ./cat.mp4 | jq -r .result.file.path
# Synchronous image generation (gpt-image-2), batch fan-out, JSONL output
sanzaru image generate "app icon" "hero banner" --quality high -o ./art/
sanzaru capabilities # machine-readable: what's enabled hereJSON envelopes on stdout, progress on stderr, exit 4 = still-running-and-resumable. Full
reference: docs/cli.md.
Installation
Claude Code Plugin (Recommended)
Install as a plugin — auto-configures the MCP server + includes prompting guidance:
/plugin marketplace add TJC-LP/sanzaruRequires OPENAI_API_KEY and SANZARU_MEDIA_PATH environment variables to be set.
Quick Install
# All features
uv add "sanzaru[all]"
# Specific features
uv add "sanzaru[audio]" # With audio support
uv add "sanzaru[elevenlabs]" # ElevenLabs as a second TTS provider
uv add sanzaru # Base (video + image only)From Source
git clone https://github.com/TJC-LP/sanzaru.git
cd sanzaru
uv sync --all-extrasClaude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"sanzaru": {
"command": "uvx",
"args": ["sanzaru[all]"],
"env": {
"OPENAI_API_KEY": "your-api-key-here",
"SANZARU_MEDIA_PATH": "/absolute/path/to/media"
}
}
}
}Or from source:
{
"mcpServers": {
"sanzaru": {
"command": "uv",
"args": ["run", "--directory", "/path/to/sanzaru", "sanzaru"]
}
}
}Codex MCP
# Using uvx (from PyPI)
codex mcp add sanzaru \
--env OPENAI_API_KEY="sk-..." \
--env SANZARU_MEDIA_PATH="$HOME/sanzaru-media" \
-- uvx "sanzaru[all]"Manual Setup
uv venv
uv sync
# Set required environment variables
export OPENAI_API_KEY=sk-...
export SANZARU_MEDIA_PATH=~/sanzaru-media
# Run server (stdio for MCP clients)
uv run sanzaru
# Or HTTP mode (for remote access)
uv run sanzaru --transport http --port 8000Available Tools
Category | Tools | Description |
Video |
| Generate and manage Sora videos with optional reference images |
Image |
| Generate with gpt-image-2 (default, sync) or GPT-5 (polling) |
Reference |
| Manage and resize images for Sora compatibility |
Audio |
| Transcription, analysis, TTS (OpenAI or ElevenLabs), and file management |
Podcast |
| Multi-voice podcast generation with parallel TTS and audio stitching; speakers may mix TTS providers |
Simulated Podcast |
| Realtime agents converse from a rundown — parallel acts, checkpointing, cost ceiling, QC |
Media |
| Interactive media player via MCP App protocol |
Full API documentation: See docs/api-reference.md
Basic Workflows
Generate a Video
# Create video from text
video = create_video(
prompt="A serene mountain landscape at sunrise",
model="sora-2",
seconds="8",
size="1280x720"
)
# Poll for completion
status = get_video_status(video.id)
# Download when ready
download_video(video.id, filename="mountain_sunrise.mp4")Generate with Reference Image
# 1. Generate reference image (gpt-image-2, synchronous)
generate_image(
prompt="futuristic pilot in mech cockpit",
size="1536x1024",
filename="pilot.png"
)
# 2. Prepare for video (resize to Sora dimensions)
prepare_reference_image("pilot.png", "1280x720", resize_mode="crop")
# 3. Animate
video = create_video(
prompt="The pilot looks up and smiles",
size="1280x720",
input_reference_filename="pilot_1280x720.png"
)Audio Transcription
# List available audio files
files = list_audio_files(format="mp3")
# Transcribe — long files are auto-windowed, so nothing truncates silently
result = transcribe_audio("interview.mp3")
# Or analyze with GPT-4o
analysis = chat_with_audio(
"meeting.mp3",
user_prompt="Summarize key decisions and action items"
)Generate a Podcast
generate_podcast(script={
"title": "AI Weekly",
"speakers": [
{"id": "host", "name": "Alex", "voice": "nova"},
{"id": "guest", "name": "Sam", "voice": "echo"}
],
"segments": [
{"speaker": "host", "text": "Welcome to AI Weekly!"},
{"speaker": "guest", "text": "Thanks for having me."}
]
})Simulate a Podcast (no script — the agents talk)
# 1. Plan it. Cheap, and the JSON is yours to edit.
sanzaru podcast rundown "why TTS providers drop sentence tails" \
--acts 3 -m 6 --host "Avery" --host "Rory:cedar:You chased the bug." \
-o rundown.json
# 2. See what it would cost. Records nothing.
sanzaru podcast simulate @rundown.json --dry-run
# 3. Record it. Acts run in parallel and each is checkpointed as it lands.
sanzaru podcast simulate @rundown.json --model gpt-realtime-2.1-mini \
--max-cost 2.00 --stems -o ep1.mp3
# Interrupted? The run id is on stderr from the start.
sanzaru podcast simulate --resume 6f1a9c02Documentation
API Reference - Complete tool documentation with parameters and examples
Reference Images Guide - Working with reference images and resizing
Image Generation Guide - Generating and editing reference images
Sora Prompting Guide - Crafting effective video prompts
Audio Features - Audio transcription, chat, and TTS
Simulated Podcasts - Realtime agents in conversation: producer model, act chunking, cost, QC
Performance & Architecture - Technical details and benchmarks
Transport Modes
Mode | Command | Use Case |
stdio (default) |
| Claude Desktop, Claude Code, local MCP clients |
HTTP |
| Remote access, Databricks Apps, web clients |
Storage Backends
Backend | Config | Use Case |
Local (default) |
| Development, local deployments |
Databricks |
| Databricks Apps with Unity Catalog Volumes |
The Databricks backend supports per-user storage isolation via the user_context module, enabling multi-tenant deployments where each user's media is stored under their own volume prefix.
See CLAUDE.md for full configuration details.
Performance
Fully asynchronous architecture with proven scalability:
✅ 32+ concurrent operations verified
✅ 8-10x speedup for parallel tasks
✅ Non-blocking I/O with
aiofiles+anyio✅ Python 3.14 free-threading ready
See docs/async-optimizations.md for technical details.
License
Available Tools
9 toolscreate_videoA
Create a new Sora video generation job. This starts an async job and returns immediately with a video_id.
The video is NOT ready immediately - use get_video_status(video_id) to poll for completion. Status will be 'queued' -> 'in_progress' -> 'completed' or 'failed'. Once status='completed', use download_video(video_id) to save the video to disk.
Parameters:
prompt: Text description of the video to generate (required)
model: "sora-2" (faster, cheaper) or "sora-2-pro" (higher quality). Default: "sora-2"
seconds: Duration as string "4", "8", or "12" (NOT an integer). Default: varies by model
size: Resolution as "720x1280" (portrait), "1280x720" (landscape), "1024x1792", or "1792x1024". Default: "720x1280"
input_reference_filename: Filename of reference image in IMAGE_PATH (e.g., "cat.png"). Use list_reference_images to find available images. Image must match target size. Supported: JPEG, PNG, WEBP. Optional.
Returns Video object with fields: id, status, progress, model, seconds, size.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | ||
| model | No | sora-2 | |
| prompt | Yes | ||
| seconds | No | ||
| input_reference_filename | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully discloses the async nature, immediate return, status progression, and the fact that seconds must be a string not integer. It adds substantial behavioral context beyond the minimal annotations (readOnlyHint=false, destructiveHint=false), making the tool's behavior transparent.
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 well-organized with sections for async behavior, status flow, and parameter details. It is front-loaded with the most critical info (async, immediate return) and every sentence adds value without redundancy.
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?
All five parameters are explained, return fields are listed, and the async lifecycle is fully described. The absence of an output schema is compensated by explicitly stating the returned Video object fields. The description is complete for a tool of this complexity.
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?
With 0% schema_description_coverage, the description compensates fully by detailing each parameter: prompt, model choices, seconds as string with exact values, size options, and input_reference_filename usage. It also explains defaults and the requirement to match image size and format.
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 creates a new Sora video generation job and returns a video_id. It distinguishes from siblings by mentioning async behavior and direct the user to get_video_status and download_video for follow-up actions.
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 explicitly instructs when to use related tools: poll with get_video_status, download with download_video, and find reference images with list_reference_images. This provides clear context and alternative tool usage, exceeding a simple 'when to use this tool'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_videoADestructiveIdempotent
Permanently delete a video from OpenAI's cloud storage.
WARNING: This is permanent and cannot be undone! The video will be deleted from OpenAI's servers. This does NOT delete any local files you may have downloaded with download_video.
Use this to:
Clean up test videos
Remove unwanted content
Free up storage quota
Parameters:
video_id: The ID of the video to delete (required)
Returns confirmation with the deleted video_id and deleted=true.
| Name | Required | Description | Default |
|---|---|---|---|
| video_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the annotations: it warns 'WARNING: This is permanent and cannot be undone!', clarifies it does not delete local files, and specifies the return value ('confirmation with the deleted video_id and deleted=true'). The annotations (destructiveHint=true, readOnlyHint=false) are consistent and the description enriches them.
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 well-structured with a strong opening statement, a warning, bulleted use cases, parameter info, and return info. It is slightly longer than necessary but each section earns its place, and the structure improves scannability.
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 delete tool with one parameter, the description covers the core purpose, usage guidelines, a critical warning, parameter explanation, and return value. It could mention idempotency (calling delete twice) or how to source the video_id, but the annotations and return statement cover much of the necessary context.
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?
The schema has only one parameter (video_id) with no description, so coverage is 0%. The description simply repeats the parameter name ('The ID of the video to delete') without adding details on how to obtain the ID, its format, or relationship to other tools like list_videos. Thus it adds minimal value beyond the 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 clearly states the action: 'Permanently delete a video from OpenAI's cloud storage.' It uses a specific verb (delete) and resource (video), and distinguishes itself from local-file operations by mentioning download_video and clarifying it does not delete local files.
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 use cases ('Clean up test videos', 'Remove unwanted content', 'Free up storage quota') and a when-not ('This does NOT delete any local files you may have downloaded with download_video'). It does not explicitly name an alternative tool for local deletion, but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_videoAIdempotent
Download a completed video to disk.
IMPORTANT: Only call this AFTER get_video_status shows status='completed'. If the video is not completed, this will fail.
The video is automatically saved to the directory configured in VIDEO_PATH. Returns the filename of the downloaded file.
Parameters:
video_id: The ID from create_video or remix_video (required)
filename: Custom filename (optional, defaults to video_id with appropriate extension)
variant: What to download (default: "video")
"video" -> MP4 video file
"thumbnail" -> WEBP thumbnail image
"spritesheet" -> JPG spritesheet of frames
Typical workflow:
Create: create_video() -> video_id
Poll: get_video_status(video_id) until status='completed'
Download: download_video(video_id, filename="my_video.mp4") -> returns filename
Returns DownloadResult with: filename, variant
| Name | Required | Description | Default |
|---|---|---|---|
| variant | No | video | |
| filename | No | ||
| video_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds valuable behavioral context beyond the annotations: the side effect of saving to VIDEO_PATH, the failure condition if the video isn't completed, and the return format (filename, variant). This goes beyond the readOnly/idempotent hints.
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 well-structured with a clear opening, warnings, parameter explanations, and a numbered workflow. Every section earns its place, and the information is easy to scan.
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?
Despite no output schema, it explains the return value (DownloadResult with filename, variant) and provides a full workflow. It also covers the key precondition and file destination. The description is complete for this tool's complexity.
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 by explaining every parameter in detail: video_id's source, filename's default behavior, and all variant enum values with their meanings. This adds significant meaning beyond the bare 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 opens with a specific verb and resource: 'Download a completed video to disk.' It clearly distinguishes this tool from siblings like view_media (preview) and list_videos (listing) by specifying the action and output (file on disk).
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 provides explicit when-to-use conditions ('Only call this AFTER get_video_status shows status=completed') and a typical workflow. However, it does not explicitly name alternative tools for related tasks (e.g., view_media for preview), so it lacks explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
_get_media_dataARead-only
Internal tool used by the MCP App media viewer to fetch base64-encoded chunks of media data. Do not call directly — use view_media instead.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | ||
| filename | Yes | ||
| chunk_size | No | ||
| media_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, establishing the safety profile. The description adds valuable behavioral context by specifying that data is fetched in base64-encoded chunks, which goes beyond the annotation. It does not detail chunking mechanics or offset semantics, but this is acceptable for an internal tool explicitly not meant for direct use.
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 sentences, front-loaded with the core purpose, and every word earns its place. It is highly concise without sacrificing necessary guidance on usage.
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 that this is an internal tool with a clear directive to use view_media instead, the description conveys enough to prevent misuse. However, it lacks parameter documentation and any return structure information, making it incomplete for scenarios where an agent might need to understand the tool in detail (e.g., debugging). The strong guidance to avoid direct use mitigates this, justifying a mid-range score.
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?
With schema description coverage at 0%, the description was expected to compensate by explaining parameters. It mentions 'chunks' and 'base64-encoded', weakly implying chunk_size and offset, but does not explicitly define any of the four parameters (offset, filename, chunk_size, media_type). This leaves the agent without sufficient understanding of required inputs.
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 function: 'fetch base64-encoded chunks of media data'. It identifies the specific resource (media data) and the output format (base64 chunks), and explicitly distinguishes itself as an internal tool from the sibling tool 'view_media' which serves as the public interface.
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 usage guidance: 'Do not call directly — use view_media instead.' This tells the agent when not to use the tool and directs them to the correct alternative, fully satisfying the dimension.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_video_statusARead-only
Check the status and progress of a video generation job.
Use this to poll for completion after calling create_video or remix_video. Call this repeatedly (e.g. every 5-10 seconds) until status changes from 'queued'/'in_progress' to 'completed' or 'failed'.
The returned Video object contains:
status: "queued" | "in_progress" | "completed" | "failed"
progress: Integer 0-100 showing completion percentage
id: The video_id for use with other tools
Other metadata: model, seconds, size, created_at, etc.
Typical workflow:
Create video with create_video() -> get video_id
Poll with get_video_status(video_id) until status='completed'
Download with download_video(video_id)
| Name | Required | Description | Default |
|---|---|---|---|
| video_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, lowering the bar. The description adds meaningful context: polling cadence, the status enum values, a progress field, and the contents of the returned Video object. It doesn't cover rate limits or error/failure details beyond status='failed', but provides solid additional 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 slightly longer than the absolute minimum, but it is well-structured with a clear first sentence, a usage note, a return object breakdown, and a workflow. Every sentence adds value, and the bullet-like list in the workflow makes it easy to scan. A 5 would require even tighter wording while preserving all this useful content.
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 that there is no output schema, the description fully explains the return values (status, progress, id, other metadata), the status enum, and the polling workflow. It also covers the tool's role in the broader lifecycle, making it complete enough for an agent to use correctly without external docs.
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 explains that video_id comes from create_video/remix_video and is used in the polling workflow, and also mentions it appears in the returned Video object as 'id'. This gives enough meaning beyond the schema's 'Video Id' label, though it doesn't explicitly format or validate the parameter.
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 explicitly states the tool checks 'status and progress of a video generation job', which is a specific verb+resource combination. It clearly distinguishes this from sibling tools like create_video, remix_video, and download_video by focusing on the polling/status aspect.
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 explicitly says to use this after calling create_video or remix_video, provides polling frequency ('every 5-10 seconds'), and outlines a typical workflow with steps. This gives clear when-to-use context and differentiates from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_local_videosARead-only
List locally downloaded video files with filtering and sorting.
Use this to discover what video files have been downloaded to the VIDEO_PATH directory. These are videos previously downloaded with download_video.
Parameters:
pattern: Glob pattern to filter filenames (e.g., "sora*.mp4", "*.webm"). Default: all files
file_type: Filter by type: "mp4", "webm", "mov", or "all". Default: "all"
sort_by: Sort results by "name", "size", or "modified". Default: "modified"
order: "desc" for newest/largest/Z-A first, "asc" for oldest/smallest/A-Z. Default: "desc"
limit: Max results to return. Default: 50
Returns list of VideoFile objects with: filename, size_bytes, modified_timestamp, file_type.
Example workflow:
list_local_videos(file_type="mp4") -> find downloaded MP4 videos
view_media(media_type="video", filename="my_video.mp4") -> watch it
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| order | No | desc | |
| pattern | No | ||
| sort_by | No | modified | |
| file_type | No | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, and the description adds behavioral detail: it scans VIDEO_PATH, applies defaults (sort_by=modified, order=desc, limit=50), and returns specific VideoFile fields. No contradiction with annotations.
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 well-structured with a summary line, use-case paragraph, parameter list, return type, and example workflow. Minor redundancy exists between the first and second sentences, but overall every section 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?
Despite no output schema, the description specifies return fields (filename, size_bytes, modified_timestamp, file_type), defaults, and an end-to-end workflow. This is sufficient for an agent to invoke the tool correctly and interpret results.
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%, but the description provides a full parameter section explaining all 5 params: pattern with glob examples, file_type enum values, sort_by options, order semantics, and limit default. This fully compensates for the schema's lack of descriptions.
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+resource: 'List locally downloaded video files' and further scopes to the VIDEO_PATH directory. It clearly distinguishes from sibling list_videos by emphasizing 'locally downloaded' and referencing download_video.
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 when to use: to discover files previously downloaded with download_video, and gives an example workflow chaining to view_media. It doesn't explicitly name list_videos as the alternative for non-local videos, but the local vs. remote distinction is implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_videosARead-only
List all video jobs in your OpenAI account with pagination support.
Returns a paginated list of all videos (completed, in-progress, failed, etc.). Each video summary includes: id, status, progress, created_at, model, seconds, size.
Parameters:
limit: Max number of videos to return (default: 20, max: 100)
after: For pagination, pass the 'last' id from previous response (optional)
order: "desc" for newest first (default) or "asc" for oldest first
Returns:
data: Array of video summaries
has_more: Boolean indicating if more results exist
last: The ID of the last video (use this as 'after' for next page)
Pagination example:
page1 = list_videos(limit=20) -> get page1.last
page2 = list_videos(limit=20, after=page1.last)
Continue until has_more=false
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | ||
| limit | No | ||
| order | No | desc |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing the pagination mechanism (passing 'after' from 'last'), the exact response fields (id, status, progress, etc.), and the iteration pattern with 'has_more' and 'last'. This richly describes the tool's behavior without contradicting the annotations.
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 well-structured with a clear opening line, a 'Returns' section, parameter explanations, and a pagination example. Every sentence contributes useful information, and the format makes it easy to scan. It is appropriately sized for the tool's complexity.
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 there is no output schema, the description thoroughly covers what the tool returns (data, has_more, last) and how to paginate through results. It also mentions the included statuses and model fields, making it complete for an agent to understand and invoke the 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?
Despite 0% schema description coverage, the description fully compensates by explaining each parameter: 'limit' with default/max, 'after' as the pagination cursor from the previous response, and 'order' with its enum values. It also provides a concrete pagination example that demonstrates how to use these parameters together.
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 'List all video jobs in your OpenAI account,' which uses a specific verb ('List') and resource ('video jobs in your OpenAI account'), clearly distinguishing it from the sibling tool 'list_local_videos' by explicitly referencing the account scope. It also mentions pagination support, which is a key functional differentiator.
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 clearly states its purpose and provides detailed usage context for pagination, but it does not explicitly mention when to avoid this tool or which sibling tool to use instead (e.g., 'for local videos, use list_local_videos'). The phrase 'in your OpenAI account' implies the scope, but lacks an explicit contrast or alternative recommendation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remix_videoA
Create a NEW video by remixing an existing completed video with a different prompt.
This creates a brand new video generation job (with a new video_id) based on an existing video. The original video must have status='completed' for remix to work.
Like create_video, this returns immediately with a new video_id - the remix is NOT instant. You must poll the NEW video_id with get_video_status until it completes.
Parameters:
previous_video_id: ID of the completed video to use as a base (required)
prompt: New text prompt to guide the remix (required)
Returns a NEW Video object with a different video_id, status='queued', progress=0.
Typical workflow:
Create original: create_video("a cat") -> video_id_1
Wait: Poll get_video_status(video_id_1) until completed
Remix: remix_video(video_id_1, "a dog") -> video_id_2 (NEW ID!)
Wait: Poll get_video_status(video_id_2) until completed
Download: download_video(video_id_2)
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | ||
| previous_video_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations indicate this is not read-only (readOnlyHint=false) and not destructive (destructiveHint=false), the description adds substantial behavioral detail: it returns immediately with a new queued job, is not instantaneous, and returns a new Video object with status='queued' and progress=0. This goes far beyond what annotations convey.
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 well-structured and front-loaded: a clear one-sentence summary, then a brief explanation of behavior, a Parameters bullet list, a return-value note, and a numbered workflow. Each sentence adds value, and the format makes it easier for an agent to parse the key information.
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 complete for a 2-parameter tool with no output schema. It covers the purpose, the lifecycle (polling, new ID), prerequisites (completed original), return status, and a step-by-step workflow. No critical information is missing for an AI agent to correctly invoke and integrate this tool.
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?
The input schema offers no descriptions, and schema description coverage is 0%. The description compensates fully with a Parameters section that explicitly explains each parameter: previous_video_id is the ID of the completed video to use as a base (required), and prompt is the new text prompt to guide the remix (required).
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 first sentence states the exact purpose: 'Create a NEW video by remixing an existing completed video with a different prompt.' It clearly distinguishes this from siblings like create_video (new from scratch) and get_video_status (polling), and highlights the key aspect of generating a new video_id.
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 usage context, including the prerequisite that the original video must be completed, the need to poll the new video_id via get_video_status, and a detailed 5-step workflow with example calls. It explains when to use remix_video in relation to other tools in the pipeline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
view_mediaARead-only
Open a media file in the interactive media viewer.
Opens a rich media player UI for viewing videos, listening to audio, or displaying images. The viewer loads the file and renders it with native playback controls.
Parameters:
media_type: Type of media to view — "video", "audio", or "image" (required)
filename: Name of the file to open (required)
video files are in the videos directory
image files are in the images directory
audio files are in the audio directory
Use list_videos, list_reference_images, or list_audio_files to discover available files.
Returns metadata: filename, media_type, size_bytes, mime_type
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | ||
| media_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds behavior details such as 'renders it with native playback controls' and 'Returns metadata: filename, media_type, size_bytes, mime_type.' This provides useful context beyond the annotation without contradicting it.
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 well-structured with a clear opening summary, parameter details, discovery guidance, and return metadata. Each sentence contributes useful information, and the format is easy to scan.
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 covers tool purpose, parameter semantics, discovery steps, and return metadata. For a simple read-only media viewer with no output schema, this is nearly complete. It doesn't mention error handling or absolute paths, but those are minor gaps given the straightforward nature.
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?
With 0% schema description coverage, the description fully compensates by explaining both parameters. It clarifies media_type enum values and gives directory guidance for filename ('video files are in the videos directory', etc.), adding meaning the schema completely lacks.
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 'Open a media file in the interactive media viewer' and specifies that it handles video, audio, and image playback. This distinguishes it from sibling tools like delete_video, create_video, and remix_video, which are obviously different operations.
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 tells users to use list_videos, list_reference_images, or list_audio_files to discover available files, which implies this tool is for viewing existing media. While it doesn't explicitly contrast with alternatives like download_video, the intended use case is clear and well-contextualized.
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.
9 tool updates
v0.9.1- First observed
_get_media_data - First observed
create_video - First observed
delete_video - First observed
download_video - First observed
get_video_status - First observed
list_local_videos - First observed
list_videos - First observed
remix_video - First observed
view_media
TDQS
Each tool has a clearly distinct purpose: create/remix/status/download/delete/list remote/list local/view. The internal _get_media_data tool is explicitly marked as 'do not call directly,' and its relationship to view_media is clearly explained, eliminating potential confusion.
Tool names follow a consistent verb_noun pattern (create_video, delete_video, download_video, list_videos, view_media). Minor deviations include get_video_status (three-part), list_local_videos (adjective), and the underscore-prefixed _get_media_data, but these are readable and the pattern is predictable overall.
With 9 tools, the server is well-scoped for video generation and management. Each tool addresses a distinct step in the workflow (create, remix, status, download, delete, list remote/local, view), and the count feels appropriate without redundancy or bloat.
Core video lifecycle is covered (create, remix, status, download, delete, list). However, create_video and view_media reference list_reference_images and list_audio_files, but these tools are not provided, creating dead ends for workflows involving reference images or audio media. This is a notable gap in the tool surface.
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
MCP server for OpenAI Sora AI video generation
Focused MCP server for OpenAI image/audio generation (v2.0.0). Wraps endpoints via HAPI CLI.
MCP server for Wan AI video generation
MCP server for Google Veo AI video generation
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn async video generation MCP server with multi-provider support. Currently in skeleton phase with stub implementations, it will eventually enable video generation through providers like Veo 3.1, Grok Imagine Video, and Sora 2 Pro.MIT
- AlicenseAqualityBmaintenanceMCP server for AI-powered image, audio, and video generation, enabling media creation directly from Claude, Cursor, and other MCP clients.1164MIT
- AlicenseAqualityAmaintenanceProduction-grade MCP server for image and video understanding and generation across Gemini, OpenAI, and Grok.54Apache 2.0
- AlicenseBqualityDmaintenanceMCP server for generating and editing images using OpenAI, and creating videos using OpenAI Sora and Google Veo. Enables fetching media from URLs or disk with smart output placement.14289MIT
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/TJC-LP/sanzaru'
If you have feedback or need assistance with the MCP directory API, please join our Discord server