refactor(MCP): Simplify IPC handlers and improve server management

This commit is contained in:
kangfenmao 2025-03-11 13:52:36 +08:00
parent 632b0c17aa
commit db2b92421a
3 changed files with 16 additions and 38 deletions

View File

@ -214,43 +214,23 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
) )
// Register MCP handlers // Register MCP handlers
ipcMain.on('mcp:servers-from-renderer', (_event, servers) => { ipcMain.on('mcp:servers-from-renderer', (_, servers) => mcpService.setServers(servers))
mcpService.setServers(servers) ipcMain.handle('mcp:list-servers', async () => mcpService.listAvailableServices())
}) ipcMain.handle('mcp:add-server', async (_, server: MCPServer) => mcpService.addServer(server))
ipcMain.handle('mcp:update-server', async (_, server: MCPServer) => mcpService.updateServer(server))
ipcMain.handle('mcp:list-servers', async () => { ipcMain.handle('mcp:delete-server', async (_, serverName: string) => mcpService.deleteServer(serverName))
return mcpService.listAvailableServices() ipcMain.handle('mcp:set-server-active', async (_, { name, isActive }) =>
}) mcpService.setServerActive({ name, isActive })
)
ipcMain.handle('mcp:add-server', async (_, server: MCPServer) => {
return mcpService.addServer(server)
})
ipcMain.handle('mcp:update-server', async (_, server: MCPServer) => {
return mcpService.updateServer(server)
})
ipcMain.handle('mcp:delete-server', async (_, serverName: string) => {
return mcpService.deleteServer(serverName)
})
ipcMain.handle('mcp:set-server-active', async (_, { name, isActive }) => {
return mcpService.setServerActive({ name, isActive })
})
// According to preload, this should take no parameters, but our implementation accepts // According to preload, this should take no parameters, but our implementation accepts
// an optional serverName for better flexibility // an optional serverName for better flexibility
ipcMain.handle('mcp:list-tools', async (_, serverName?: string) => { ipcMain.handle('mcp:list-tools', async (_, serverName?: string) => mcpService.listTools(serverName))
return mcpService.listTools(serverName) ipcMain.handle('mcp:call-tool', async (_, params: { client: string; name: string; args: any }) =>
}) mcpService.callTool(params)
)
ipcMain.handle('mcp:call-tool', async (_, params: { client: string; name: string; args: any }) => { ipcMain.handle('mcp:cleanup', async () => mcpService.cleanup())
return mcpService.callTool(params)
})
ipcMain.handle('mcp:cleanup', async () => {
return mcpService.cleanup()
})
// Listen for changes in MCP servers and notify renderer // Listen for changes in MCP servers and notify renderer
mcpService.on('servers-updated', (servers) => { mcpService.on('servers-updated', (servers) => {
@ -258,7 +238,5 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
}) })
// Clean up MCP services when app quits // Clean up MCP services when app quits
app.on('before-quit', async () => { app.on('before-quit', () => mcpService.cleanup())
await mcpService.cleanup()
})
} }

View File

@ -134,6 +134,7 @@ const MCPSettings: FC = () => {
window.api.mcp window.api.mcp
.addServer(mcpServer) .addServer(mcpServer)
.then(() => { .then(() => {
dispatch(addMCPServer(mcpServer))
window.message.success(t('settings.mcp.addSuccess')) window.message.success(t('settings.mcp.addSuccess'))
setLoading(false) setLoading(false)
setIsModalVisible(false) setIsModalVisible(false)
@ -143,7 +144,6 @@ const MCPSettings: FC = () => {
window.message.error(`${t('settings.mcp.addError')}: ${error.message}`) window.message.error(`${t('settings.mcp.addError')}: ${error.message}`)
setLoading(false) setLoading(false)
}) })
dispatch(addMCPServer(mcpServer))
} }
}) })
.catch(() => { .catch(() => {

View File

@ -3,7 +3,7 @@ import { FunctionCall, FunctionDeclaration, SchemaType, Tool as geminiToool } fr
import { MCPServer, MCPTool, MCPToolResponse } from '@renderer/types' import { MCPServer, MCPTool, MCPToolResponse } from '@renderer/types'
import { ChatCompletionMessageToolCall, ChatCompletionTool } from 'openai/resources' import { ChatCompletionMessageToolCall, ChatCompletionTool } from 'openai/resources'
import { ChunkCallbackData } from '.' import { ChunkCallbackData } from '../providers'
const supportedAttributes = [ const supportedAttributes = [
'type', 'type',