mirror of
https://github.com/sun-guannan/CapCutAPI.git
synced 2025-11-25 03:15:00 +08:00
339 lines
11 KiB
Python
339 lines
11 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
CapCut API MCP 测试客户端 (Complete Version)
|
||
|
||
测试完整版本的MCP服务器,包含所有CapCut API接口
|
||
"""
|
||
|
||
import subprocess
|
||
import json
|
||
import time
|
||
import sys
|
||
|
||
def send_request(process, request_data):
|
||
"""发送请求并接收响应"""
|
||
try:
|
||
request_json = json.dumps(request_data, ensure_ascii=False)
|
||
print(f"发送请求: {request_json}")
|
||
|
||
# 发送请求
|
||
process.stdin.write(request_json + "\n")
|
||
process.stdin.flush()
|
||
|
||
# 等待响应
|
||
response_line = process.stdout.readline()
|
||
if not response_line.strip():
|
||
print("❌ 收到空响应")
|
||
return None
|
||
|
||
try:
|
||
response = json.loads(response_line.strip())
|
||
print(f"收到响应: {json.dumps(response, ensure_ascii=False, indent=2)}")
|
||
return response
|
||
except json.JSONDecodeError as e:
|
||
print(f"❌ JSON解析错误: {e}")
|
||
print(f"原始响应: {response_line}")
|
||
return None
|
||
|
||
except Exception as e:
|
||
print(f"❌ 发送请求时出错: {e}")
|
||
return None
|
||
|
||
def send_notification(process, notification_data):
|
||
"""发送通知(不需要响应)"""
|
||
try:
|
||
notification_json = json.dumps(notification_data, ensure_ascii=False)
|
||
print(f"发送通知: {notification_json}")
|
||
|
||
process.stdin.write(notification_json + "\n")
|
||
process.stdin.flush()
|
||
|
||
except Exception as e:
|
||
print(f"❌ 发送通知时出错: {e}")
|
||
|
||
def main():
|
||
print("🚀 CapCut API MCP 测试客户端 (Complete Version)")
|
||
print("🎯 测试所有CapCut API接口功能")
|
||
print("=" * 60)
|
||
|
||
# 启动MCP服务器
|
||
try:
|
||
process = subprocess.Popen(
|
||
[sys.executable, "mcp_server.py"], # 修改为正确的文件名
|
||
stdin=subprocess.PIPE,
|
||
stdout=subprocess.PIPE,
|
||
stderr=subprocess.PIPE,
|
||
text=True,
|
||
bufsize=0 # 无缓冲
|
||
)
|
||
|
||
print("✅ MCP服务器已启动 (mcp_server.py)")
|
||
time.sleep(1) # 等待服务器启动
|
||
|
||
# 1. 初始化
|
||
init_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 1,
|
||
"method": "initialize",
|
||
"params": {
|
||
"protocolVersion": "2024-11-05",
|
||
"capabilities": {
|
||
"tools": {},
|
||
"resources": {}
|
||
},
|
||
"clientInfo": {
|
||
"name": "CapCut-Test-Client-Complete",
|
||
"version": "1.0.0"
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, init_request)
|
||
if response and "result" in response:
|
||
print("✅ 初始化成功")
|
||
else:
|
||
print("❌ 初始化失败")
|
||
return
|
||
|
||
# 发送初始化完成通知
|
||
init_notification = {
|
||
"jsonrpc": "2.0",
|
||
"method": "notifications/initialized",
|
||
"params": {}
|
||
}
|
||
send_notification(process, init_notification)
|
||
|
||
print("\n=== 📋 获取工具列表 ===")
|
||
# 2. 获取工具列表
|
||
tools_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 2,
|
||
"method": "tools/list",
|
||
"params": {}
|
||
}
|
||
|
||
response = send_request(process, tools_request)
|
||
if response and "result" in response:
|
||
tools = response["result"]["tools"]
|
||
print(f"✅ 成功获取 {len(tools)} 个工具:")
|
||
for tool in tools:
|
||
print(f" • {tool['name']}: {tool['description']}")
|
||
else:
|
||
print("❌ 获取工具列表失败")
|
||
return
|
||
|
||
print("\n=== 🎬 测试核心功能 ===\n")
|
||
|
||
# 3. 测试创建草稿
|
||
print("📝 测试创建草稿")
|
||
create_draft_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 3,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "create_draft",
|
||
"arguments": {
|
||
"width": 1080,
|
||
"height": 1920
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, create_draft_request)
|
||
if response and "result" in response:
|
||
print("✅ 创建草稿成功")
|
||
# 提取draft_id用于后续测试
|
||
draft_data = json.loads(response["result"]["content"][0]["text"])
|
||
draft_id = draft_data["result"]["draft_id"]
|
||
print(f"📋 草稿ID: {draft_id}")
|
||
else:
|
||
print("❌ 创建草稿失败")
|
||
draft_id = None
|
||
|
||
# 4. 测试添加文本(带多样式)
|
||
print("\n📝 测试添加文本(多样式)")
|
||
add_text_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 4,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "add_text",
|
||
"arguments": {
|
||
"text": "Hello CapCut API!",
|
||
"start": 0,
|
||
"end": 5,
|
||
"draft_id": draft_id,
|
||
"font_color": "#ff0000",
|
||
"font_size": 32,
|
||
"shadow_enabled": True,
|
||
"shadow_color": "#000000",
|
||
"shadow_alpha": 0.8,
|
||
"background_color": "#ffffff",
|
||
"background_alpha": 0.5,
|
||
"text_styles": [
|
||
{
|
||
"start": 0,
|
||
"end": 5,
|
||
"font_size": 36,
|
||
"font_color": "#00ff00",
|
||
"bold": True
|
||
},
|
||
{
|
||
"start": 6,
|
||
"end": 12,
|
||
"font_size": 28,
|
||
"font_color": "#0000ff",
|
||
"italic": True
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, add_text_request)
|
||
if response and "result" in response:
|
||
print("✅ 添加文本成功")
|
||
else:
|
||
print("❌ 添加文本失败")
|
||
|
||
# 5. 测试添加视频
|
||
print("\n🎬 测试添加视频")
|
||
add_video_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 5,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "add_video",
|
||
"arguments": {
|
||
"video_url": "https://example.com/video.mp4",
|
||
"draft_id": draft_id,
|
||
"start": 0,
|
||
"end": 10,
|
||
"target_start": 5,
|
||
"transition": "fade",
|
||
"volume": 0.8
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, add_video_request)
|
||
if response and "result" in response:
|
||
print("✅ 添加视频成功")
|
||
else:
|
||
print("❌ 添加视频失败")
|
||
|
||
# 6. 测试添加音频
|
||
print("\n🎵 测试添加音频")
|
||
add_audio_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 6,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "add_audio",
|
||
"arguments": {
|
||
"audio_url": "https://example.com/audio.mp3",
|
||
"draft_id": draft_id,
|
||
"start": 0,
|
||
"end": 15,
|
||
"volume": 0.6
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, add_audio_request)
|
||
if response and "result" in response:
|
||
print("✅ 添加音频成功")
|
||
else:
|
||
print("❌ 添加音频失败")
|
||
|
||
# 7. 测试添加图片
|
||
print("\n🖼️ 测试添加图片")
|
||
add_image_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 7,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "add_image",
|
||
"arguments": {
|
||
"image_url": "https://example.com/image.jpg",
|
||
"draft_id": draft_id,
|
||
"start": 10,
|
||
"end": 15,
|
||
"intro_animation": "fade_in",
|
||
"outro_animation": "fade_out"
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, add_image_request)
|
||
if response and "result" in response:
|
||
print("✅ 添加图片成功")
|
||
else:
|
||
print("❌ 添加图片失败")
|
||
|
||
# 8. 测试获取视频时长
|
||
print("\n⏱️ 测试获取视频时长")
|
||
get_duration_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 8,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "get_video_duration",
|
||
"arguments": {
|
||
"video_url": "https://example.com/video.mp4"
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, get_duration_request)
|
||
if response and "result" in response:
|
||
print("✅ 获取视频时长成功")
|
||
else:
|
||
print("❌ 获取视频时长失败")
|
||
|
||
# 9. 测试保存草稿
|
||
print("\n💾 测试保存草稿")
|
||
save_draft_request = {
|
||
"jsonrpc": "2.0",
|
||
"id": 9,
|
||
"method": "tools/call",
|
||
"params": {
|
||
"name": "save_draft",
|
||
"arguments": {
|
||
"draft_id": draft_id
|
||
}
|
||
}
|
||
}
|
||
|
||
response = send_request(process, save_draft_request)
|
||
if response and "result" in response:
|
||
print("✅ 保存草稿成功")
|
||
else:
|
||
print("❌ 保存草稿失败")
|
||
|
||
print("\n🎉 所有测试完成!CapCut API MCP服务器功能验证成功!")
|
||
|
||
print("\n✅ 已验证的功能:")
|
||
print(" • 草稿管理 (创建、保存)")
|
||
print(" • 文本处理 (多样式、阴影、背景)")
|
||
print(" • 视频处理 (添加、转场、音量控制)")
|
||
print(" • 音频处理 (添加、音量控制)")
|
||
print(" • 图片处理 (添加、动画效果)")
|
||
print(" • 工具信息 (时长获取)")
|
||
|
||
except Exception as e:
|
||
print(f"❌ 测试过程中出错: {e}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
|
||
finally:
|
||
# 关闭服务器
|
||
try:
|
||
process.terminate()
|
||
process.wait(timeout=5)
|
||
except:
|
||
process.kill()
|
||
print("🔴 MCP服务器已关闭")
|
||
|
||
if __name__ == "__main__":
|
||
main() |