Kdenlive MCP Server
Kdenlive video editing MCP - 36 tools for project, timeline, filters and melt rendering
What can you do with Kdenlive MCP Server?
- Persistent Session State: Uses CLI's in-memory session API, auto-saves after every mutation
- Gen 5 XML Export: Kdenlive-compatible XML output with proper bin references and version metadata
- Robust Error Handling: All exceptions caught and returned as structured JSON payloads
- Auto-Project Tracking: Globally tracks project path; all tools automatically target the active project
- 75 MCP Tools: Comprehensive coverage of Kdenlive operations
Install
Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).
kdenlive-mcp-serverclaude mcp add kdenlive-mcp-server -- uvx kdenlive-mcp-server==0.1.3
{
"mcpServers": {
"kdenlive-mcp-server": {
"command": "uvx",
"args": [
"kdenlive-mcp-server==0.1.3"
]
}
}
}
Documentation
From the project's README on GitHub, refreshed weekly. Links open on GitHub.
Contents
Kdenlive MCP Server
A Model Context Protocol (MCP) server wrapping cli-anything-kdenlive for LLM-driven video editing workflows via Kdenlive.
Overview
This FastMCP server enables AI models to perform complex video editing tasks on Kdenlive projects through a set of 75 tools. The server uses the Python API of cli-anything-kdenlive directly (not subprocess) to maintain a persistent session state, ensuring modifications are immediately available to subsequent tool calls.
Key Features
- Persistent Session State: Uses CLI's in-memory session API, auto-saves after every mutation
- Gen 5 XML Export: Kdenlive-compatible XML output with proper bin references and version metadata
- Robust Error Handling: All exceptions caught and returned as structured JSON payloads
- Auto-Project Tracking: Globally tracks project path; all tools automatically target the active project
- 75 MCP Tools: Comprehensive coverage of Kdenlive operations
Installation
Prerequisites
# Python 3.10+
# Ensure uv is installed for dependency management
pip install uv
Install Dependencies
cd kdenlive-mcp-server
uv sync
Usage
As an MCP Server
The server runs as a FastMCP server compatible with any LLM platform that supports MCP (e.g., Claude Code, Pi, OpenCode).
Command Line
# Run the MCP server
uv run kdenlive-mcp
# Or directly via Python
uv run python3 -m kdenlive_mcp_server.server
Python Integration
from kdenlive_mcp_server.server import (
project_new, bin_import_clip, timeline_add_clip, export_xml
)
# Create project
result = project_new(output_path="my_project.kdenlive-cli.json", profile="hd1080p30")
# Import media
result = bin_import_clip(clip_path="video.mp4", name="Interview", duration=120.0)
# Add to timeline
result = timeline_add_clip(clip_id="clip0", track=0, position=0.0)
# Export XML
result = export_xml(output_path="output.kdenlive")
Project Structure
kdenlive-mcp-server/
├── kdenlive_mcp_server/
│ ├── __init__.py # Empty package init
│ └── server.py # FastMCP server with 75 tools
├── main.py # Entry point delegating to server module
├── pyproject.toml # Project configuration and dependencies
├── uv.lock # Dependency lock file
└── README.md # This file
Tools
Project (5 tools)
| Tool | Description |
|---|---|
project_new() | Create a new Kdenlive project with optional profile override |
project_open() | Load an existing .kdenlive-cli.json project |
project_save() | Persist the current project state to disk |
project_get_info() | Get project metadata (resolution, FPS, track layout, clip counts) |
project_list_profiles() | List all available video output profiles (hd1080p30, 4k60, sd_pal, etc.) |
Bin (4 tools)
| Tool | Description |
|---|---|
bin_import_clip() | Ingest media files (video, audio, image) into the project bin |
bin_remove_clip() | Delete a clip from the bin by ID |
bin_list_clips() | List all assets in the project bin |
bin_get_clip_details() | Fetch detailed properties of a clip (duration, type, source) |
Timeline (8 tools)
| Tool | Description |
|---|---|
timeline_add_track() | Append a video or audio track to the timeline |
timeline_remove_track() | Delete a track and all its clips |
timeline_add_clip() | Place a bin clip on a track at a specific position |
timeline_remove_clip() | Remove a clip from a track |
timeline_move_clip() | Reposition a clip on the same track |
timeline_trim_clip() | Adjust clip in/out crop handles |
timeline_split_clip() | Cut a clip into two pieces at a precise offset |
timeline_list() | List all tracks with clip counts and status |
Filters (5 tools)
| Tool | Description |
|---|---|
filter_add() | Attach a video/audio effect (blur, brightness, frei0r.opacity, volume) |
filter_remove() | Remove an effect from a clip |
filter_set_param() | Update a single filter parameter (radius, opacity, level) |
filter_list() | List all active filters on a clip |
filter_list_available() | Discover all available filters by category |
Transitions (4 tools)
| Tool | Description |
|---|---|
transition_add() | Create blend transitions (dissolve, wipe, slide, composite, affine) |
transition_remove() | Delete a transition by ID |
transition_set() | Update a transition parameter |
transition_list() | List all transitions on the timeline |
Guides (3 tools)
| Tool | Description |
|---|---|
guide_add() | Add timeline markers/chapters |
guide_remove() | Remove a guide by ID |
guide_list() | List all guide markers |
Export (3 tools)
| Tool | Description |
|---|---|
export_xml() | Generate Kdenlive/MLT XML for the project |
export_list_presets() | List available render presets |
export_render() | Render project to video via melt CLI |
Session (4 tools)
| Tool | Description |
|---|---|
session_undo() | Revert the most recent operation (up to 50 history entries) |
session_redo() | Redo the last undone operation |
session_status() | Inspect session state (project loaded, modified flag, history depth) |
session_history() | List all undo/redo history entries |
Batch Editing & Vertical Video (new in 0.2.0)
| Tool | Description |
|---|---|
timeline_build_from_segments() | Place many keep-segments of one bin clip back to back in a single, single-undo call |
clip_reframe_vertical() | Center-crop a 16:9 clip to fill a 9:16 frame, with a horizontal pan |
timeline_build_from_segments(clip_id, segments, track=0, start=0.0, gap=0.0, include_audio=True, audio_track=None)
Cutting a long take with timeline_split_clip / timeline_remove_clip is fragile because
every removal shifts the clip_index of the clips after it. Instead, compute the ranges you
want to keep and place them all at once:
timeline_add_track() # video track 0
timeline_build_from_segments(
clip_id="clip0",
segments=[{"start": 0.5, "end": 1.5}, {"start": 3.0, "end": 4.5}, {"start": 6.0, "end": 8.0}],
)
# -> {"placed": 3, "timeline_duration": 4.5, "kept_seconds": 4.5, "track": 0, "audio_track": 1, ...}
segmentsis a list of{start, end}in source seconds, or a path to a JSON file containing{"segments": [...]}.- Segments are sorted, clamped to the clip's duration, merged where they overlap or touch, and dropped if shorter than 0.05 s. An empty result is an error.
- Segments are laid out from
start, separated bygapseconds. - Clips on a video track render without sound, so when the source has an audio stream the
same segments are mirrored onto an audio track (the first existing one, or a new
A1). Passinclude_audio=Falseto skip this, oraudio_track=<id>to choose the track. - The whole build, including any auto-created audio track, is one undo step:
a single
session_undo()reverts it.
clip_reframe_vertical(track_id, clip_index, x_offset=0.0)
For Shorts/Reels/TikTok, start the project with a vertical profile (vertical1080p30 or
vertical1080p60, both 1080x1920), then reframe each landscape clip:
project_new("short.kdenlive-cli.json", profile="vertical1080p30")
# ... import + timeline_build_from_segments ...
clip_reframe_vertical(track_id=0, clip_index=0) # center
clip_reframe_vertical(track_id=0, clip_index=1, x_offset=-0.5) # pan left
The source is scaled so its height fills the frame, then shifted horizontally:
x_offset -1 shows the left edge, 0 the center, 1 the right edge. It adds an affine
filter (Kdenlive's Transform effect) with a transition.rect; calling it again on the same
clip updates that filter instead of stacking another. Center crop only, no face tracking.
Example Workflows
Create a Simple Video Project
from kdenlive_mcp_server.server import (
project_new, bin_import_clip, timeline_add_track,
timeline_add_clip, export_xml, project_save
)
# 1. Create project
result = project_new(
output_path="intro_video.kdenlive-cli.json",
profile="hd1080p30",
name="Introduction"
)
# 2. Import media
result = bin_import_clip(
clip_path="interview.mp4",
name="Interview",
duration=120.0
)
# 3. Add track and place clip
result = timeline_add_track(track_type="video", track_name="V1")
result = timeline_add_clip(
clip_id="clip0", # From bin_import_clip response
track=0,
position=0.0
)
# 4. Export
result = export_xml(output_path="intro.kdenlive")
Apply Effects to Clips
from kdenlive_mcp_server.server import (
project_new, bin_import_clip, timeline_add_track,
timeline_add_clip, filter_add, filter_set_param, filter_list
)
# Setup
result = project_new(output_path="effects_demo.kdenlive-cli.json", profile="hd720p60")
result = bin_import_clip(clip_path="movie.mp4", name="Movie", duration=300.0)
result = timeline_add_track(track_type="video")
result = timeline_add_clip(clip_id="clip0", track=0, position=0.0)
# Add brightness filter
result = filter_add(
track_id=0,
clip_index=0,
filter_type="brightness",
params=["level=0.8"]
)
# Update brightness
result = filter_set_param(
track_id=0,
clip_index=0,
filter_index=0,
parameter="level",
value="1.2"
)
# List filters
result = filter_list(track_id=0, clip_index=0)
Add Chapter Markers
from kdenlive_mcp_server.server import (
project_new, bin_import_clip, timeline_add_track,
timeline_add_clip, guide_add, guide_list, project_save
)
# Setup
result = project_new(output_path="documentary.kdenlive-cli.json", profile="4k30")
result = bin_import_clip(clip_path="documentary.mp4", name="Doc", duration=900.0)
result = timeline_add_track(track_type="video")
result = timeline_add_clip(clip_id="clip0", track=0, position=0.0)
# Add chapter markers
result = guide_add(position=60.0, label="Chapter 1: Introduction", guide_type="chapter")
result = guide_add(position=180.0, label="Chapter 2: Main Content", guide_type="chapter")
result = guide_add(position=300.0, label="Chapter 3: Conclusion", guide_type="chapter")
# List guides
result = guide_list()
# Save
result = project_save()
Error Handling
All tools return consistent response formats:
# Success
{
"success": True,
"data": {...}
}
# Error
{
"success": False,
"error": "Error message describing the failure"
}
Configuration
pyproject.toml
[project]
name = "kdenlive-mcp-server"
version = "0.1.0"
description = "MCP server for Kdenlive video editing via cli-anything-kdenlive"
requires-python = ">=3.10"
dependencies = [
"mcp>=1.28.0",
"cli-anything-kdenlive>=1.0.0",
]
[project.scripts]
kdenlive-mcp = "kdenlive_mcp_server.server:main"
[tool.uv.sources]
cli-anything-kdenlive = { git = "https://github.com/HKUDS/CLI-Anything.git", subdirectory = "kdenlive/agent-harness" }
uv.lock
Auto-generated by uv sync. Contains locked dependency versions.
Dependencies
- mcp>=1.28.0: FastMCP server framework for MCP protocol
- **cli-anything-kdenlive @ git+https://github.com/HKUDS/CLI-Anything.git#subdirectory=kdenlive/agent-harness**:
- CLI harness for Kdenlive video editing via melt
- Includes Gen 5 MLT XML format rewrite (PR #216)
- Provides Python API for project management
Troubleshooting
Kdenlive XML Compatibility Issues
If Kdenlive reports "Version of the project file cannot be read" or "Timeline clip without bin reference found":
- Cause: Using PyPI v1.0.0 (Gen 4 format) which lacks proper Kdenlive metadata
- Fix: The package now installs from GitHub HEAD with Gen 5 format that includes:
kdenlive:docproperties.version="1.1"- Chain-based clip structure with
kdenlive:idlinking to main_bin - Proper bin reference handling
Project Not Saving
The server auto-saves to disk after every mutation. If changes aren't persisting:
- Verify the project path is set via
project_new()orproject_open() - Check that
session_status()showshas_project: true - Ensure the output directory is writable
FastMCP Server Not Starting
- Verify MCP version:
uv run python3 -c "import mcp; print(mcp.__version__)" - Check FastMCP:
uv run python3 -c "from mcp.server.fastmcp import FastMCP; print('FastMCP OK')" - Review logs for detailed error messages
Development
Testing
Run the test suite:
# Run all integration tests
uv run python3 test_integration.py
# Test with zero-duration edge case
uv run python3 test_edge_cases.py
Code Style
The project follows PEP 8 style guidelines. Use uv run ruff check . to lint.
Adding New Tools
To add a new MCP tool:
- Add the tool function to
server.pydecorated with@server.tool() - Import the corresponding CLI API module if needed
- Include comprehensive docstrings with Args and Returns sections
- Implement error handling with try/except
- Call
_save()after mutations to persist changes
Example:
@server.tool()
def my_new_tool(param1: str, param2: int) -> dict[str, Any]:
"""Brief description of what the tool does.
Args:
param1: Description of param1.
param2: Description of param2.
Returns:
Success response format.
"""
err = _require_project()
if err:
return err
try:
# Do something with the project
result = some_api_function(param1, param2)
_save()
return _ok(result)
except Exception as e:
return _err(str(e))
Contributing
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Ensure all tests pass:
uv run pytest - Submit a pull request
References
Frequently asked questions
What is Kdenlive MCP Server?
Kdenlive video editing MCP - 36 tools for project, timeline, filters and melt rendering
How do I install Kdenlive MCP Server?
It runs on your machine. In Claude Code: claude mcp add kdenlive-mcp-server -- uvx kdenlive-mcp-server==0.1.3. For other clients, paste the JSON configuration from this page into their MCP settings.
Does Kdenlive MCP Server need an API key?
Its registry entry lists no required key or secret. Some features may still need an account with the service it connects to.
Is Kdenlive MCP Server open source?
Its code is public on GitHub, but the repository does not declare a standard license.
Who maintains Kdenlive MCP Server?
It is published by Va1bhav512. AI.tn lists it but does not maintain or endorse it.
From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.