Skip to main content
Glama

sanzaru

PyPI version Python versions License CI PyPI downloads

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-2 or sora-2-pro models

  • Use 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 dialogue render mode: consecutive turns go out together so the model paces them

  • --verify transcribes the rendered audio and re-renders segments the TTS silently dropped

Simulated Podcasts

  • The conversation is generated, not read — N gpt-realtime agents actually talk to each other

  • Each 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

  • See docs/audio/simulated-podcasts.md

Agent CLI

  • Every capability as a shell command: sanzaru video create, sanzaru image generate, ...

  • One-shot async workflows: create ... -o out.mp4 submits, polls, downloads in one command

  • JSON envelopes on stdout, progress on stderr, deterministic exit codes, resumable waits

  • Concurrent fan-out (multi-prompt image batches, multi-job wait) and arbitrary -o output paths

  • See docs/cli.md — bare sanzaru still 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_KEY environment 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

  1. Clone the repository:

    git clone https://github.com/TJC-LP/sanzaru.git
    cd sanzaru
  2. Run the setup script:

    ./setup.sh

    The script will:

    • Prompt for your OpenAI API key

    • Create directories and .env configuration

    • Install dependencies with uv sync --all-extras --dev

  3. 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 here

JSON envelopes on stdout, progress on stderr, exit 4 = still-running-and-resumable. Full reference: docs/cli.md.

Installation

Install as a plugin — auto-configures the MCP server + includes prompting guidance:

/plugin marketplace add TJC-LP/sanzaru

Requires 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-extras

Claude 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 8000

Available Tools

Category

Tools

Description

Video

create_video, get_video_status, download_video, list_videos, list_local_videos, delete_video, remix_video

Generate and manage Sora videos with optional reference images

Image

generate_image, edit_image, create_image, get_image_status, download_image

Generate with gpt-image-2 (default, sync) or GPT-5 (polling)

Reference

list_reference_images, prepare_reference_image

Manage and resize images for Sora compatibility

Audio

transcribe_audio, chat_with_audio, create_audio, convert_audio, compress_audio, list_audio_files, get_latest_audio, transcribe_with_enhancement

Transcription, analysis, TTS (OpenAI or ElevenLabs), and file management

Podcast

generate_podcast

Multi-voice podcast generation with parallel TTS and audio stitching; speakers may mix TTS providers

Simulated Podcast

simulate_podcast

Realtime agents converse from a rundown — parallel acts, checkpointing, cost ceiling, QC

Media

view_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 6f1a9c02

Documentation

Transport Modes

Mode

Command

Use Case

stdio (default)

uv run sanzaru

Claude Desktop, Claude Code, local MCP clients

HTTP

uv run sanzaru --transport http

Remote access, Databricks Apps, web clients

Storage Backends

Backend

Config

Use Case

Local (default)

SANZARU_MEDIA_PATH=/path/to/media

Development, local deployments

Databricks

STORAGE_BACKEND=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

MIT

Available Tools

9 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sizeNo
modelNosora-2
promptYes
secondsNo
input_reference_filenameNo

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_videoA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
video_idYes

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_videoA
Idempotent

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:

  1. Create: create_video() -> video_id

  2. Poll: get_video_status(video_id) until status='completed'

  3. Download: download_video(video_id, filename="my_video.mp4") -> returns filename

Returns DownloadResult with: filename, variant

ParametersJSON Schema
NameRequiredDescriptionDefault
variantNovideo
filenameNo
video_idYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines4/5

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_dataA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
offsetNo
filenameYes
chunk_sizeNo
media_typeYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_statusA
Read-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:

  1. Create video with create_video() -> get video_id

  2. Poll with get_video_status(video_id) until status='completed'

  3. Download with download_video(video_id)

ParametersJSON Schema
NameRequiredDescriptionDefault
video_idYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. 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.

Purpose5/5

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.

Usage Guidelines5/5

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_videosA
Read-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:

  1. list_local_videos(file_type="mp4") -> find downloaded MP4 videos

  2. view_media(media_type="video", filename="my_video.mp4") -> watch it

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
orderNodesc
patternNo
sort_byNomodified
file_typeNoall

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_videosA
Read-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:

  1. page1 = list_videos(limit=20) -> get page1.last

  2. page2 = list_videos(limit=20, after=page1.last)

  3. Continue until has_more=false

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNo
limitNo
orderNodesc

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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:

  1. Create original: create_video("a cat") -> video_id_1

  2. Wait: Poll get_video_status(video_id_1) until completed

  3. Remix: remix_video(video_id_1, "a dog") -> video_id_2 (NEW ID!)

  4. Wait: Poll get_video_status(video_id_2) until completed

  5. Download: download_video(video_id_2)

ParametersJSON Schema
NameRequiredDescriptionDefault
promptYes
previous_video_idYes

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_mediaA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameYes
media_typeYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 9 tool updatesv0.9.1
    • First observed_get_media_data
    • First observedcreate_video
    • First observeddelete_video
    • First observeddownload_video
    • First observedget_video_status
    • First observedlist_local_videos
    • First observedlist_videos
    • First observedremix_video
    • First observedview_media

TDQS

A4.4/5.0
Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessUnresponsive

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

Related MCP Servers

Latest Blog Posts

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