Amazon Nova Reel 1.1 MCP Server provides a Model Context Protocol (MCP) server for video generation using AWS Bedrock. It supports asynchronous video generation with comprehensive prompting guidelines and multiple transport methods including stdio and SSE.
Install dependencies:
pip install -e .
Pull multi-architecture images from GitHub Container Registry:
# STDIO version
docker pull ghcr.io/mirecekd/novareel-mcp:latest-stdio
# SSE version
docker pull ghcr.io/mirecekd/novareel-mcp:latest-sse
# HTTP Streaming version
docker pull ghcr.io/mirecekd/novareel-mcp:latest-http
Build containers using provided scripts:
# Build all versions
./build-all.sh
# Or build individual versions
./build-stdio.sh # STDIO version
./build-sse.sh # SSE version
./build-http.sh # HTTP Streaming version
Or use docker-compose:
docker-compose up -d
Or use the quick start script:
# Build all images
./start.sh build
# Build specific version
./start.sh build-stdio
./start.sh build-sse
./start.sh build-http
AWS_ACCESS_KEY_ID
: Your AWS access key IDAWS_SECRET_ACCESS_KEY
: Your AWS secret access keyAWS_REGION
: AWS region (default: us-east-1)S3_BUCKET
: S3 bucket name for video outputCreate a .env
file for docker-compose:
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_REGION=us-east-1
S3_BUCKET=my-video-generation-bucket
Add the server to your MCP client configuration:
Add to your Cline MCP settings:
{
"mcpServers": {
"Nova Reel Video MCP": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/mirecekd/novareel-mcp:latest-stdio",
"--aws-access-key-id",
"YOUR_AWS_ACCESS_KEY_ID",
"--aws-secret-access-key",
"YOUR_AWS_SECRET_ACCESS_KEY",
"--s3-bucket",
"YOUR_S3_BUCKET_NAME"
]
}
}
}
Add to your Claude Desktop claude_desktop_config.json
:
{
"mcpServers": {
"novareel-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/mirecekd/novareel-mcp:latest-stdio",
"--aws-access-key-id",
"YOUR_AWS_ACCESS_KEY_ID",
"--aws-secret-access-key",
"YOUR_AWS_SECRET_ACCESS_KEY",
"--s3-bucket",
"YOUR_S3_BUCKET_NAME"
]
}
}
}
If you prefer running without Docker:
{
"mcpServers": {
"novareel-mcp": {
"command": "uvx",
"args": [
"--from", "git+https://github.com/mirecekd/novareel-mcp.git",
"novareel-mcp-server",
"--aws-access-key-id", "YOUR_AWS_ACCESS_KEY_ID",
"--aws-secret-access-key", "YOUR_AWS_SECRET_ACCESS_KEY",
"--s3-bucket", "YOUR_S3_BUCKET_NAME"
]
}
}
}
Important: Replace the placeholder values with your actual AWS credentials and S3 bucket name.
# First build the package
./build.sh
# Then run from wheel file
uvx --from ./dist/novareel_mcp-1.0.0-py3-none-any.whl novareel-mcp-server --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET
# Or from current directory during development (without build)
uvx --from . novareel-mcp-server --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET
# Local execution
python main.py --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET
# Docker execution
docker run --rm -i mirecekd/novareel-mcp-server:stdio --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET
# Local execution
python -m novareel_mcp_server.server_sse --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET --host 0.0.0.0 --port 8000
# Docker execution
docker run -p 8000:8000 -e AWS_ACCESS_KEY_ID=YOUR_KEY -e AWS_SECRET_ACCESS_KEY=YOUR_SECRET -e S3_BUCKET=YOUR_BUCKET mirecekd/novareel-mcp-server:sse
Then access http://localhost:8000/sse/
for the SSE endpoint.
# Local execution
python -m novareel_mcp_server.server_http --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET --host 0.0.0.0 --port 8001
# Docker execution
docker run -p 8001:8001 -e AWS_ACCESS_KEY_ID=YOUR_KEY -e AWS_SECRET_ACCESS_KEY=YOUR_SECRET -e S3_BUCKET=YOUR_BUCKET ghcr.io/mirecekd/novareel-mcp:latest-http
Then access http://localhost:8001
for the HTTP streaming transport.
start_async_invoke
Start a new video generation job.
Parameters:
prompt
(required): Text description for video generationduration_seconds
(optional): Video duration (12-120 seconds, multiples of 6, default: 12)fps
(optional): Frames per second (default: 24)dimension
(optional): Video dimensions (default: "1280x720")seed
(optional): Random seed for reproducible resultstask_type
(optional): Task type (default: "MULTI_SHOT_AUTOMATED")Returns: Job details including job_id
, invocation_arn
, and estimated video URL.
list_async_invokes
List all tracked video generation jobs with their current status.
Returns: Summary of all jobs with status counts and individual job details.
get_async_invoke
Get detailed information about a specific video generation job.
Parameters:
identifier
(required): Either job_id
or invocation_arn
Returns: Detailed job information including video URL when completed.
get_prompting_guide
Get comprehensive prompting guidelines for effective video generation.
Returns: Detailed prompting best practices, examples, and templates.
# Start a video generation job
result = start_async_invoke(
prompt="A majestic eagle soars over a mountain valley, camera tracking its flight as it circles above a pristine lake",
duration_seconds=24,
fps=24,
dimension="1920x1080"
)
job_id = result["job_id"]
print(f"Started job: {job_id}")
# Check job status
status = get_async_invoke(job_id)
print(f"Status: {status['status']}")
# When completed, get video URL
if status["status"] == "Completed":
print(f"Video URL: {status['video_url']}")
# Get overview of all jobs
jobs = list_async_invokes()
print(f"Total jobs: {jobs['total_invocations']}")
print(f"Completed: {jobs['summary']['completed']}")
print(f"In progress: {jobs['summary']['in_progress']}")
Be Specific: Use detailed, descriptive language
Use Camera Terminology: Control shot composition
Include Lighting Details: Specify atmosphere
Structure for Duration: Match complexity to video length
Nature (Short - 12s):
Close-up of morning dew drops on a spider web, with soft sunrise lighting creating rainbow reflections
Urban (Medium - 30s):
A street musician plays violin in a subway station, commuters pause to listen, coins drop into his case, camera slowly pulls back to reveal the bustling underground scene
Portrait (Long - 60s):
Portrait of a chef preparing a signature dish: selecting fresh ingredients at market, returning to kitchen, methodically preparing each component, plating with artistic precision, and presenting the finished masterpiece
AWS Credentials Error
S3 Bucket Access
Duration Validation
Job Not Found
list_async_invokes
to see all tracked jobsEnable debug logging by setting environment variable:
export PYTHONUNBUFFERED=1
To add this MCP server to Claude Code, run this command in your terminal:
claude mcp add-json "Nova-Reel-Video-MCP" '{"disabled":false,"timeout":60,"type":"stdio","command":"docker","args":["run","-i","--rm","ghcr.io/mirecekd/novareel-mcp:latest-stdio","--aws-access-key-id","YOUR_AWS_ACCESS_KEY_ID","--aws-secret-access-key","YOUR_AWS_SECRET_ACCESS_KEY","--s3-bucket","YOUR_S3_BUCKET_NAME"]}'
See the official Claude Code MCP documentation for more details.
There are two ways to add an MCP server to Cursor. The most common way is to add the server globally in the ~/.cursor/mcp.json
file so that it is available in all of your projects.
If you only need the server in a single project, you can add it to the project instead by creating or adding it to the .cursor/mcp.json
file.
To add a global MCP server go to Cursor Settings > Tools & Integrations and click "New MCP Server".
When you click that button the ~/.cursor/mcp.json
file will be opened and you can add your server like this:
{
"mcpServers": {
"Nova Reel Video MCP": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/mirecekd/novareel-mcp:latest-stdio",
"--aws-access-key-id",
"YOUR_AWS_ACCESS_KEY_ID",
"--aws-secret-access-key",
"YOUR_AWS_SECRET_ACCESS_KEY",
"--s3-bucket",
"YOUR_S3_BUCKET_NAME"
]
}
}
}
To add an MCP server to a project you can create a new .cursor/mcp.json
file or add it to the existing one. This will look exactly the same as the global MCP server example above.
Once the server is installed, you might need to head back to Settings > MCP and click the refresh button.
The Cursor agent will then be able to see the available tools the added MCP server has available and will call them when it needs to.
You can also explicitly ask the agent to use the tool by mentioning the tool name and describing what the function does.
To add this MCP server to Claude Desktop:
1. Find your configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json
%APPDATA%\Claude\claude_desktop_config.json
~/.config/Claude/claude_desktop_config.json
2. Add this to your configuration file:
{
"mcpServers": {
"Nova Reel Video MCP": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/mirecekd/novareel-mcp:latest-stdio",
"--aws-access-key-id",
"YOUR_AWS_ACCESS_KEY_ID",
"--aws-secret-access-key",
"YOUR_AWS_SECRET_ACCESS_KEY",
"--s3-bucket",
"YOUR_S3_BUCKET_NAME"
]
}
}
}
3. Restart Claude Desktop for the changes to take effect