39 """Register MCP server handlers."""
41 @self.server.list_tools()
42 async def handle_list_tools() -> list[types.Tool]:
43 return get_all_tools()
45 @self.server.call_tool()
46 async def handle_call_tool(
47 name: str, arguments: dict[str, Any] |
None =
None
48 ) -> list[types.TextContent]:
54 result = await self.
_call_tool(name, arguments)
55 return [types.TextContent(type=
"text", text=str(result))]
56 except DaVinciResolveError
as e:
57 error_msg = f
"DaVinci Resolve error: {e}"
58 logger.exception(error_msg)
59 return [types.TextContent(type=
"text", text=error_msg)]
60 except Exception
as e:
61 error_msg = f
"Unexpected error: {e}"
62 logger.exception(error_msg)
63 return [types.TextContent(type=
"text", text=error_msg)]
65 @self.server.list_resources()
66 async def handle_list_resources() -> list[types.Resource]:
67 return get_all_resources()
69 @self.server.read_resource()
70 async def handle_read_resource(
72 ) -> list[types.TextResourceContents]:
78 types.TextResourceContents(
81 mimeType=
"text/plain",
84 except DaVinciResolveError
as e:
85 error_msg = f
"DaVinci Resolve error: {e}"
86 logger.exception(error_msg)
87 return [types.TextResourceContents(uri=uri, text=error_msg, mimeType=
"text/plain")]
88 except Exception
as e:
89 error_msg = f
"Unexpected error: {e}"
90 logger.exception(error_msg)
91 return [types.TextResourceContents(uri=uri, text=error_msg, mimeType=
"text/plain")]
93 async def _call_tool(self, name: str, arguments: dict[str, Any]) -> Any:
94 """Dispatch a tool call to the resolve client."""
95 if name ==
"get_version":
97 elif name ==
"get_current_page":
99 elif name ==
"switch_page":
101 elif name ==
"list_projects":
103 elif name ==
"get_current_project":
105 elif name ==
"open_project":
106 name_arg = arguments.get(
"name",
"")
109 f
"Successfully opened project '{name_arg}'"
111 else f
"Failed to open project '{name_arg}'"
113 elif name ==
"create_project":
114 name_arg = arguments.get(
"name",
"")
117 f
"Successfully created project '{name_arg}'"
119 else f
"Failed to create project '{name_arg}'"
121 elif name ==
"list_timelines":
123 elif name ==
"get_current_timeline":
125 elif name ==
"create_timeline":
126 name_arg = arguments.get(
"name",
"")
129 f
"Successfully created timeline '{name_arg}'"
131 else f
"Failed to create timeline '{name_arg}'"
133 elif name ==
"switch_timeline":
134 name_arg = arguments.get(
"name",
"")
137 f
"Successfully switched to timeline '{name_arg}'"
139 else f
"Failed to switch to timeline '{name_arg}'"
141 elif name ==
"list_media_clips":
143 elif name ==
"import_media":
144 file_path = arguments.get(
"file_path",
"")
147 f
"Successfully imported media '{file_path}'"
149 else f
"Failed to import media '{file_path}'"
152 raise ValueError(f
"Unknown tool: {name}")
175 async def run(self) -> None:
176 """Run the MCP server."""
177 logger.info(
"Starting DaVinci Resolve MCP Server...")
179 async with mcp.server.stdio.stdio_server()
as (read_stream, write_stream):
183 InitializationOptions(
184 server_name=
"davinci-mcp-professional",
185 server_version=__version__,
186 capabilities=self.
server.get_capabilities(
187 notification_options=NotificationOptions(),
188 experimental_capabilities={},