🚀 Amazon Nova Reel 1.1 MCP 服务器
这是一个用于借助 AWS Bedrock 进行 Amazon Nova Reel 1.1 视频生成的模型上下文协议(MCP)服务器。该服务器提供了异步视频生成工具,具备全面的提示指南,支持标准输入输出(stdio)和服务器发送事件(SSE)传输方式。
✨ 主要特性
- 异步视频生成:可启动、监控和获取视频生成任务。
- 多种传输方式:支持标准输入输出(stdio)、服务器发送事件(SSE)和 HTTP 流传输。
- 全面的提示指南:基于 AWS 文档内置了相关指南。
- Docker 支持:为所有传输方式提供了即用型 Docker 容器。
- AWS 集成:与 AWS Bedrock 和 S3 完全集成。
📦 安装指南
前提条件
- Python 3.8 及以上版本
- 具备 Bedrock 访问权限的 AWS 账户
- 用于存储视频输出的 S3 存储桶
- 拥有适当权限的 AWS 凭证
本地安装
- 克隆或下载服务器文件。
- 安装依赖项:
pip install -e .
Docker 安装
使用预构建镜像(推荐)
从 GitHub 容器注册表拉取多架构镜像:
docker pull ghcr.io/mirecekd/novareel-mcp:latest-stdio
docker pull ghcr.io/mirecekd/novareel-mcp:latest-sse
docker pull ghcr.io/mirecekd/novareel-mcp:latest-http
本地构建
- 使用提供的脚本构建容器:
./build-all.sh
./build-stdio.sh
./build-sse.sh
./build-http.sh
- 或者使用 Docker Compose:
docker-compose up -d
- 或者使用快速启动脚本:
./start.sh build
./start.sh build-stdio
./start.sh build-sse
./start.sh build-http
🔧 配置
环境变量
AWS_ACCESS_KEY_ID
:你的 AWS 访问密钥 ID
AWS_SECRET_ACCESS_KEY
:你的 AWS 秘密访问密钥
AWS_REGION
:AWS 区域(默认:us-east-1)
S3_BUCKET
:用于存储视频输出的 S3 存储桶名称
.env 文件示例
为 Docker Compose 创建一个 .env
文件:
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
AWS_REGION=us-east-1
S3_BUCKET=my-video-generation-bucket
💻 使用示例
MCP 客户端集成(Cline/Claude Desktop)
将服务器添加到你的 MCP 客户端配置中:
Cline 配置
添加到你的 Cline MCP 设置中:
{
"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"
]
}
}
}
Claude Desktop 配置
添加到你的 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"
]
}
}
}
替代方案:本地 Python 安装
如果你更喜欢不使用 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"
]
}
}
}
重要提示:请将占位符值替换为你实际的 AWS 凭证和 S3 存储桶名称。
使用 uvx 运行(推荐)
./build.sh
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
uvx --from . novareel-mcp-server --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET
./start.sh build-package
STDIO 版本(直接 MCP 客户端)
python main.py --aws-access-key-id YOUR_KEY --aws-secret-access-key YOUR_SECRET --s3-bucket YOUR_BUCKET
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
SSE 版本(Web 界面)
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 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
然后访问 http://localhost:8000/sse/
以获取 SSE 端点。
HTTP 流版本(双向传输)
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 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
然后访问 http://localhost:8001
以获取 HTTP 流传输。
包构建
要创建分发包:
pip install build
python3 -m build
基础用法
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}")
status = get_async_invoke(job_id)
print(f"Status: {status['status']}")
if status["status"] == "Completed":
print(f"Video URL: {status['video_url']}")
列出所有任务
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']}")
📚 详细文档
可用工具
1. start_async_invoke
启动一个新的视频生成任务。
参数:
prompt
(必需):用于视频生成的文本描述
duration_seconds
(可选):视频时长(12 - 120 秒,6 的倍数,默认:12)
fps
(可选):每秒帧数(默认:24)
dimension
(可选):视频尺寸(默认:"1280x720")
seed
(可选):用于可重现结果的随机种子
task_type
(可选):任务类型(默认:"MULTI_SHOT_AUTOMATED")
返回值:包含 job_id
、invocation_arn
和估计视频 URL 的任务详情。
2. list_async_invokes
列出所有跟踪的视频生成任务及其当前状态。
返回值:所有任务的摘要,包括状态计数和单个任务详情。
3. get_async_invoke
获取特定视频生成任务的详细信息。
参数:
identifier
(必需):job_id
或 invocation_arn
返回值:详细的任务信息,包括任务完成时的视频 URL。
4. get_prompting_guide
获取用于有效视频生成的全面提示指南。
返回值:详细的提示最佳实践、示例和模板。
提示指南
该服务器包含基于 AWS 文档的全面提示指南。可使用以下代码访问:
guide = get_prompting_guide()
关键提示技巧
- 具体描述:使用详细、描述性的语言。
- 好的示例:"A red cardinal perched on a snow-covered pine branch, morning sunlight filtering through the trees"
- 不好的示例:"A bird on a tree"
- 使用相机术语:控制镜头组成。
- "Close-up shot of hands carving wood"
- "Wide shot establishing the mountain landscape"
- "Camera pans left across the valley"
- 包含照明细节:指定氛围。
- "Golden hour lighting casting long shadows"
- "Soft blue hour twilight"
- "Dramatic storm clouds overhead"
- 根据时长构建内容:使复杂度与视频长度相匹配。
- 12 - 24 秒:单个动作或瞬间
- 30 - 60 秒:2 - 3 个不同的动作
- 60 - 120 秒:具有多个场景的完整叙事
按类别划分的示例提示
自然场景(短时长 - 12 秒):
Close-up of morning dew drops on a spider web, with soft sunrise lighting creating rainbow reflections
城市场景(中等时长 - 30 秒):
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
肖像场景(长时长 - 60 秒):
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 权限
你的 AWS 凭证需要以下权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:StartAsyncInvoke",
"bedrock:GetAsyncInvoke",
"bedrock:ListFoundationModels"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
]
}
]
}
视频输出
生成的视频将存储在你的 S3 存储桶中,结构如下:
s3://your-bucket/
├── job-id-1/
│ └── output.mp4
├── job-id-2/
│ └── output.mp4
└── ...
视频可通过 HTTPS URL 访问:
https://your-bucket.s3.region.amazonaws.com/job-id/output.mp4
支持的视频规格
- 时长:12 - 120 秒(必须是 6 的倍数)
- 帧率:24 fps(推荐)
- 尺寸:
- 格式:MP4
- 模型:amazon.nova-reel-v1:1
故障排除
常见问题
- AWS 凭证错误
- 验证你的 AWS 凭证是否正确。
- 确保你的账户已启用 Bedrock 访问权限。
- 检查 IAM 权限。
- S3 存储桶访问问题
- 验证存储桶是否存在且可访问。
- 检查存储桶权限。
- 确保存储桶与 Bedrock 位于同一区域。
- 时长验证问题
- 时长必须在 12 - 120 秒之间。
- 必须是 6 的倍数。
- 有效取值:12、18、24、30、36、42、48、54、60、66、72、78、84、90、96、102、108、114、120
- 任务未找到
- 使用
list_async_invokes
查看所有跟踪的任务。
- 任务存储在内存中,服务器重启后会丢失。
- 对于生产环境,建议实现持久化存储。
调试模式
通过设置环境变量启用调试日志:
export PYTHONUNBUFFERED=1
开发
项目结构
novareel-mcp-server/
├── main.py # 主 MCP 服务器(stdio)
├── main_sse.py # MCP 服务器的 SSE 版本
├── main_http.py # MCP 服务器的 HTTP 流版本
├── prompting_guide.py # AWS 提示指南
├── pyproject.toml # Python 依赖项
├── Dockerfile.stdio # STDIO 版本的 Docker 文件
├── Dockerfile.sse # SSE 版本的 Docker 文件
├── Dockerfile.http # HTTP 流版本的 Docker 文件
├── docker-compose.yml # 容器编排
└── README.md # 本文档
贡献
- 分叉仓库。
- 创建功能分支。
- 进行更改。
- 使用所有传输版本(stdio、SSE、HTTP 流)进行测试。
- 提交拉取请求。
📄 许可证
本项目采用 MIT 许可证 - 详情请参阅 LICENSE 文件。
支持
如有问题和疑问:
- 查看故障排除部分。
- 查阅 AWS Bedrock 文档。
- 在仓库中创建一个问题。
相关链接