
Json2video
STDIOMCP server for generating videos using json2video API with rich scene and element support.
MCP server for generating videos using json2video API with rich scene and element support.
A Model Context Protocol (MCP) server implementation for programmatically generating videos using the json2video API. This server exposes powerful video generation and status-checking tools for use with LLMs, agents, or any MCP-compatible client.
env JSON2VIDEO_API_KEY=your_api_key_here npx -y @omerrgocmen/json2video-mcp
npm install -g @omerrgocmen/json2video-mcp
If you are on Windows and encounter issues, try:
cmd /c "set JSON2VIDEO_API_KEY=your_api_key_here && npx -y @omerrgocmen/json2video-mcp"
env JSON2VIDEO_API_KEY=your_api_key_here npx -y @omerrgocmen/json2video-mcp
{ "mcpServers": { "json2video-mcp": { "command": "npx", "args": ["-y", "@omerrgocmen/json2video-mcp"], "env": { "JSON2VIDEO_API_KEY": "your_api_key_here" } } } }
Replace your_api_key_here
with your json2video API key. You can get an API key from json2video.com.
After adding, refresh the MCP server list to see the new tools. Your agent or LLM will automatically use json2video MCP when appropriate, or you can explicitly request it by describing your video generation needs.
Add this to your mcp.json
or similar config:
{ "mcpServers": { "json2video-mcp": { "command": "npx", "args": ["-y", "@omerrgocmen/json2video-mcp"], "env": { "JSON2VIDEO_API_KEY": "your_api_key_here" } } } }
your_api_key_here
with your actual json2video API key.generate_video
and get_video_status
tools for use in your workflows.JSON2VIDEO_API_KEY
(required): Your json2video API key. Can be set as an environment variable or provided per request.Note: If you encounter a
client closed
error, run the following command in your terminal:npm i @omerrgocmen/json2video-mcp
generate_video
)Create a customizable video project with scenes and elements.
Description: Creates a video project using the json2video API. Each project can contain multiple scenes, and each scene can contain various elements such as text, images, video, audio, components, HTML, voice, audiogram, and subtitles. Video generation is asynchronous; use the returned project ID to check status. See https://json2video.com/docs/api/ for full schema and more examples.
Input Schema:
{ "id": "string (optional, unique identifier for the movie)", "comment": "string (optional, project description)", "cache": true, "client_data": {}, "draft": true, "quality": "high", // one of: low, medium, high "resolution": "custom", // one of: sd, hd, full-hd, squared, instagram-story, instagram-feed, twitter-landscape, twitter-portrait, custom "width": 1920, // required if resolution is custom "height": 1080, // required if resolution is custom "variables": {}, "elements": [ /* global elements, see below for examples */ ], "scenes": [ { "id": "string (optional, unique scene id)", "comment": "string (optional)", "background_color": "#000000", "cache": true, "condition": "string (optional)", "duration": -1, "variables": {}, "elements": [ /* see element examples below */ ] } ], "apiKey": "string (optional)" }
Element Types & Examples:
{ "type": "text", "text": "Hello world", "duration": 5, "settings": { "font-size": "60px", "color": "#FF0000" } }
{ "type": "image", "src": "https://images.pexels.com/photos/1105666/pexels-photo-1105666.jpeg", "width": 1620, "height": 1080, "x": 0, "y": 0 }
{ "type": "video", "src": "https://example.com/path/to/my/video.mp4", "duration": 7.3 }
{ "type": "component", "component": "basic/001", "settings": { "headline": { "text": "Lorem ipsum", "color": "white" }, "body": { "text": "Dolor sit amet" } } }
{ "type": "html", "html": "<h1>Hello world</h1>", "width": 800, "height": 600 }
{ "type": "audio", "src": "https://example.com/audio.mp3", "duration": 5 }
{ "type": "voice", "text": "This is a voiceover.", "voice": "en-US-Wavenet-D" }
{ "type": "audiogram", "color": "#00FF00", "amplitude": 5 }
{ "type": "subtitles", "captions": "1\n00:00:00,000 --> 00:00:02,000\nHello world!" }
Example Input:
{ "comment": "MyProject", "resolution": "full-hd", "scenes": [ { "elements": [ { "type": "video", "src": "https://example.com/path/to/my/video.mp4" }, { "type": "text", "text": "Hello world", "duration": 5 }, { "type": "image", "src": "https://images.pexels.com/photos/1105666/pexels-photo-1105666.jpeg", "width": 1620, "height": 1080, "x": 0, "y": 0 }, { "type": "component", "component": "basic/001", "settings": { "headline": { "text": "Lorem ipsum" } } }, { "type": "html", "html": "<h1>Hello world</h1>", "width": 800, "height": 600 }, { "type": "audio", "src": "https://example.com/audio.mp3", "duration": 5 }, { "type": "voice", "text": "This is a voiceover.", "voice": "en-US-Wavenet-D" }, { "type": "audiogram", "color": "#00FF00", "amplitude": 5 }, { "type": "subtitles", "captions": "1\n00:00:00,000 --> 00:00:02,000\nHello world!" } ] } ] }
Notes for Users:
width
and height
.get_video_status
.Output:
get_video_status
.get_video_status
)Check the status or retrieve the result of a video generation job.
Description: Retrieves the status or result of a previously started video generation job. Note: Video rendering is asynchronous and may take some time. If the status is not "done", please try again later using the same project ID.
Input Schema:
{ "project": "string (required)", "apiKey": "string (optional)" }
Example Input:
{ "project": "q663vmm2" }
Example Output:
{ "success": true, "movie": { "success": true, "status": "done", "message": "", "project": "q663vmm2", "url": "https://assets.json2video.com/clients/yourclient/renders/yourvideo.mp4", "created_at": "2025-04-27T10:44:18.880Z", "ended_at": "2025-04-27T10:44:28.589Z", "duration": 11, "size": 359630, "width": 640, "height": 360, "rendering_time": 10 } }
create_template
)Create a new template in json2video.
Description: Creates a new template with a given name and optional description.
Input Schema:
{ "name": "string (required, name of the template)", "description": "string (optional, description of the template)", "apiKey": "string (optional)" }
Example Input:
{ "name": "MyTemplate", "description": "A reusable video template." }
Output:
get_template
)Get template details from json2video.
Description: Retrieves details of a template by its name.
Input Schema:
{ "name": "string (required, name of the template)", "apiKey": "string (optional)" }
Example Input:
{ "name": "MyTemplate" }
Output:
{ "updated_at": "YYYY-MM-DDTHH:MM:SSZ", "created_at": "YYYY-MM-DDTHH:MM:SSZ", "movie": "{\"id\":\"template1\",\"comment\":\"Example template\",\"resolution\":\"full-hd\",\"quality\":\"high\",\"scenes\":[{\"id\":\"scene1\",\"comment\":\"Scene 1\",\"elements\":[]}],\"elements\":[],\"width\":1920,\"height\":1080}", "name": "MyTemplate", "id": "MyTemplate_ID" }
list_templates
)List all available templates from json2video.
Description: Lists all templates available to the user.
Input Schema:
{ "apiKey": "string (optional)" }
Example Input:
{ }
Output:
[ { "updated_at": "YYYY-MM-DDTHH:MM:SSZ", "created_at": "YYYY-MM-DDTHH:MM:SSZ", "movie": "{\"id\":\"template1\",\"comment\":\"Example template\",\"resolution\":\"full-hd\",\"quality\":\"high\",\"scenes\":[{\"id\":\"scene1\",\"comment\":\"Scene 1\",\"elements\":[]}],\"elements\":[],\"width\":1920,\"height\":1080}", "name": "MyTemplate1", "id": "TEMPLATE_ID_1" }, { "updated_at": "YYYY-MM-DDTHH:MM:SSZ", "created_at": "YYYY-MM-DDTHH:MM:SSZ", "movie": "{\"id\":\"template2\",\"resolution\":\"instagram-story\",\"quality\":\"medium\",\"scenes\":[{\"id\":\"scene2\",\"comment\":\"Scene 2\",\"elements\":[]}],\"elements\":[],\"comment\":\"Another template\"}", "name": "MyTemplate2", "id": "TEMPLATE_ID_2" } ]