44 """Register MCP server handlers."""
46 @self.server.list_tools()
47 async def handle_list_tools() -> List[types.Tool]:
48 """List available tools."""
49 return get_all_tools()
51 @self.server.call_tool()
52 async def handle_call_tool(
53 name: str, arguments: Optional[Dict[str, Any]] =
None
54 ) -> List[types.TextContent]:
55 """Handle tool calls."""
65 result = await self.
_call_tool(name, arguments)
67 return [types.TextContent(type=
"text", text=str(result))]
69 except DaVinciResolveError
as e:
70 error_msg = f
"DaVinci Resolve error: {e}"
71 logger.error(error_msg)
72 return [types.TextContent(type=
"text", text=error_msg)]
73 except Exception
as e:
74 error_msg = f
"Unexpected error: {e}"
75 logger.error(error_msg)
76 return [types.TextContent(type=
"text", text=error_msg)]
78 @self.server.list_resources()
79 async def handle_list_resources() -> List[types.Resource]:
80 """List available resources."""
81 return get_all_resources()
83 @self.server.read_resource()
84 async def handle_read_resource(uri: str) -> str:
85 """Handle resource reads."""
95 except DaVinciResolveError
as e:
96 error_msg = f
"DaVinci Resolve error: {e}"
97 logger.error(error_msg)
99 except Exception
as e:
100 error_msg = f
"Unexpected error: {e}"
101 logger.error(error_msg)
114 async def _call_tool(self, name: str, arguments: Dict[str, Any]) -> Any:
115 """Call a specific tool."""
117 if name ==
"get_version":
120 elif name ==
"get_current_page":
123 elif name ==
"switch_page":
124 page = arguments.get(
"page",
"")
128 elif name ==
"list_projects":
131 elif name ==
"get_current_project":
134 elif name ==
"open_project":
135 name_arg = arguments.get(
"name",
"")
137 return f
"Successfully opened project '{name_arg}'" if result
else f
"Failed to open project '{name_arg}'"
139 elif name ==
"create_project":
140 name_arg = arguments.get(
"name",
"")
142 return f
"Successfully created project '{name_arg}'" if result
else f
"Failed to create project '{name_arg}'"
145 elif name ==
"list_timelines":
148 elif name ==
"get_current_timeline":
151 elif name ==
"create_timeline":
152 name_arg = arguments.get(
"name",
"")
154 return f
"Successfully created timeline '{name_arg}'" if result
else f
"Failed to create timeline '{name_arg}'"
156 elif name ==
"switch_timeline":
157 name_arg = arguments.get(
"name",
"")
159 return f
"Successfully switched to timeline '{name_arg}'" if result
else f
"Failed to switch to timeline '{name_arg}'"
162 elif name ==
"list_media_clips":
165 elif name ==
"import_media":
166 file_path = arguments.get(
"file_path",
"")
168 return f
"Successfully imported media '{file_path}'" if result
else f
"Failed to import media '{file_path}'"
171 raise ValueError(f
"Unknown tool: {name}")
205 async def run(self) -> None:
206 """Run the MCP server."""
207 logger.info(
"Starting DaVinci Resolve MCP Server...")
209 async with mcp.server.stdio.stdio_server()
as (read_stream, write_stream):
213 InitializationOptions(
214 server_name=
"davinci-mcp-professional",
215 server_version=
"2.1.0",
216 capabilities=self.
server.get_capabilities(
217 notification_options=NotificationOptions(),
218 experimental_capabilities={},