Nuke-MCP 是一个使用模型上下文协议(MCP)连接 The Foundry 的 Nuke 和 AI 系统的桥梁。
Nuke-MCP 允许 AI 助手通过套接字连接与 Nuke 进行交互,使它们能够:
nuke_mcp_addon.py):在 Nuke 内创建套接字服务器的 Nuke 脚本。nuke_mcp_server.py):一个 Python 服务器,连接到 Nuke 插件并向 AI 系统暴露工具。main.py):一个简单的脚本以启动 MCP 服务器。pip install fastmcp
nuke_mcp_addon.py 文件复制到您的 Nuke 脚本文件夹或 Nuke Python 路径中的位置。复制插件文件:
nuke_mcp_addon.py 文件放置在 Nuke 可找到的位置:
~/.nuke/python 或 Windows 上的家目录)创建启动脚本(推荐):
.nuke 目录中创建或编辑现有的 init.py 文件nuke.pluginAddPath("./python")
import nuke_mcp_addon
手动加载(替代方案):
import nuke_mcp_addon默认情况下,NukeMCP 面板作为浮动窗口打开。如果您希望将其锚定在 Nuke 的界面中,可以修改 nuke_mcp_addon.py 中的 NukeMCPPanel 类:
# 查找 NukeMCPPanel 类定义(大约在第 380 行)
class NukeMCPPanel(nukescripts.PythonPanel):
def __init__(self):
nukescripts.PythonPanel.__init__(self, 'Nuke MCP', 'com.example.NukeMCP')
# ... 现有代码 ...
# 添加此方法以启用锚定
def addToPane(self):
pane = nuke.getPaneFor('Properties.1')
if not pane:
pane = nuke.getPaneFor('Viewer.1')
self.setMinimumSize(300, 200) # 设置合理的最小尺寸
return pane.addPermanentAsQWidget(self)
# 修改 show_panel 函数以使用锚定
def show_panel():
"""显示 NukeMCP 面板"""
global _panel
if _panel is None:
_panel = NukeMCPPanel()
# 显示为锚定面板而不是浮动窗口
pane = _panel.addToPane()
if pane:
_panel.setParent(pane)
您还可以修改面板在菜单中的显示方式。基于您的 menu.py 文件,您有:
# MCP 工具
nuke.toolbar("Nodes").addCommand('NukeMCP/NukeMCP 面板', 'nuke_mcp_addon.show_panel()')
为了确保它正确集成到您的现有工具栏结构中,请确保在您的 menu.py 文件中取消注释这一行。
要使用 Nuke-MCP 与 Claude Desktop 一起工作,请遵循以下步骤:
下载并安装 Claude Desktop:
启用开发者模式:
编辑配置文件:
claude_desktop_config.json 文件){
"mcpServers": {
"nuke": {
"command": "python",
"args": [
"/path/to/your/nuke-mcp/main.py"
],
"trusted": true
}
}
}
替换路径:
main.py 文件的实际路径"args": ["Z:/path/to/nuke_mcp/main.py"]
或
"args": ["Z:\\path\\to\\nuke_mcp\\main.py"]
"trusted": true 标志对于完全功能是必需的重启 Claude Desktop:
现在当您使用 Claude Desktop 时,您可以指示它通过 MCP 连接与 Nuke 进行交互。
该系统由三个主要组件组成,协同工作:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ │ │ │ │ │
│ AI 客户端 │◄───►│ MCP 服务器 │◄───►│ Nuke 插件 │
│ (Claude) │ │ │ │ (在 Nuke 内) │
│ │ │ │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
MCP 服务器暴露了以下工具:
get_script_info():获取当前 Nuke 脚本的信息get_node_info(node_name):获取特定节点的详细信息create_node(node_type, name, position, inputs, parameters):创建新节点modify_node(name, parameters, position, inputs):更改现有节点delete_node(name):删除节点position_node(name, x, y):在节点图中定位节点connect_nodes(output_node, input_node, input_index):连接节点render(frame_range, write_node, proxy_mode):渲染帧viewer_playback(action, start_frame, end_frame):控制查看器播放execute_nuke_code(code):在 Nuke 中运行 Python 代码auto_layout_nodes(selected_only):自动排列节点set_frames(first_frame, last_frame, current_frame):设置帧范围create_viewer(input_node):创建查看器节点create_node(node_type="Blur", parameters={"size": 10})
create_node(node_type="Read", name="input", parameters={"file": "/path/to/image.exr"})
create_node(node_type="Grade", name="grade1", position=[200, 0])
create_node(node_type="Grade", name="grade2", position=[400, 0])
create_node(node_type="Write", name="output", position=[600, 0], parameters={"file": "/path/to/output.exr"})
connect_nodes(output_node="input", input_node="grade1")
connect_nodes(output_node="grade1", input_node="grade2")
connect_nodes(output_node="grade2", input_node="output")
render(frame_range="1-10", write_node="output")
当与 Claude Desktop 一起工作时,您可以给它自然语言指令来控制 Nuke。这里有一些示例命令:
"你能告诉我我的当前 Nuke 脚本里有什么吗?"
"在 Nuke 中创建一个带有读取节点、色彩校正、分级和写入节点的合成设置,所有节点都正确连接。"
"在 Nuke 中创建一个专业的绿幕抠像设置,包括抠像、去溢色、边缘模糊和背景上的合成。"
"使用噪声、粒子发射器和合并节点在 Nuke 中构建一个粒子系统,以创建火焰效果。"
"分析我当前的 Nuke 脚本,然后通过创建一个分别调整阴影、中间调和高光的色彩分级链来增强它。添加微妙的胶片颗粒效果和柔和的晕影。"
"在 Nuke 中设置一个带有相机、3D 对象和适当照明的 3D 场景。"
您可以通过向 nuke_mcp_server.py 文件添加新工具来扩展系统。MCP 工具使用 @mcp.tool() 装饰器模式定义。
每个工具遵循以下基本结构:
@mcp.tool()
def tool_name(ctx: Context, param1: type, param2: type = default_value) -> str:
"""
工具描述用于文档。
参数:
- param1: param1 的描述
- param2: param2 的描述,具有默认值
"""
try:
logger.info(f"调用工具:tool_name,参数")
nuke = get_nuke_connection()
result = nuke.send_command("command_name", {
"param1": param1,
"param2": param2
})
# 处理结果并格式化响应
return "人类可读的响应"
except Exception as e:
logger.error(f"错误在 tool_name:{str(e)}")
return f"错误消息:{str(e)}"
要添加新工具:
确定您想要添加的功能
在 Nuke 插件中添加新方法(在 nuke_mcp_addon.py 中):
NukeMCPServer 类中execute_command 方法的 handlers 字典中添加条目在 nuke_mcp_server.py 中创建相应的工具:
@mcp.tool() 装饰器彻底测试新工具
这是一个如何添加一个创建变换节点的专用工具的例子:
@mcp.tool()
def create_transform(
ctx: Context,
name: str = None,
position: List[int] = None,
rotation: float = 0.0,
scale: float = 1.0,
center: List[float] = None
) -> str:
"""
使用指定参数创建变换节点。
参数:
- name: 变换节点的可选名称
- position: 可选 [x, y] 节点位置坐标
- rotation: 旋转角度
- scale: 统一缩放因子
- center: 可选 [x, y] 转换中心
"""
try:
logger.info(f"调用工具:create_transform")
nuke = get_nuke_connection()
# 准备变换节点的参数
parameters = {
"rotate": rotation,
"scale": scale
}
if center:
parameters["center"] = center
# 调用通用 create_node 命令
result = nuke.send_command("create_node", {
"node_type": "Transform",
"name": name,
"position": position,
"parameters": parameters
})
actual_name = result.get("name", "unknown")
return f"创建名为 '{actual_name}' 的变换节点,旋转={rotation}°,缩放={scale}"
except Exception as e:
logger.error(f"错误在 create_transform:{str(e)}")
return f"创建变换节点失败:{str(e)}"
这种模式允许您构建提供高级功能的专用工具,同时利用现有的命令基础设施。
如果 Claude 无法连接到 Nuke,请检查以下内容:
这是初始实现。未来改进可能包括: