feat(mcp): 添加 MCP 服务器管理功能
- 新增 Server MCP API 路由 (/api/mcp/*) - GET /servers - 获取所有服务器状态 - POST /servers/:name/connect|disconnect|enable|disable - GET /tools - 获取所有 MCP 工具 - GET /config - 获取 MCP 配置 - 新增 UI MCPPanel 组件 - 显示服务器列表和状态指示灯 - 支持连接/断开/启用/禁用操作 - 展开查看服务器配置和工具列表 - 响应式设计支持移动端 - 集成到 Web 和 Desktop - 添加 Plug 图标按钮到工具栏 - 点击打开 MCP 管理面板
This commit is contained in:
@@ -17,6 +17,9 @@ import type {
|
||||
CreateCommandInput,
|
||||
UpdateCommandInput,
|
||||
CommandContent,
|
||||
MCPServerStatus,
|
||||
MCPToolInfo,
|
||||
MCPConfig,
|
||||
} from './types.js';
|
||||
|
||||
// Re-export types
|
||||
@@ -37,6 +40,11 @@ export type {
|
||||
CreateCommandInput,
|
||||
UpdateCommandInput,
|
||||
CommandContent,
|
||||
MCPServerStatus,
|
||||
MCPServerStatusType,
|
||||
MCPToolInfo,
|
||||
MCPConfig,
|
||||
MCPServerConfigInfo,
|
||||
} from './types.js';
|
||||
|
||||
// API Configuration
|
||||
@@ -235,3 +243,104 @@ export async function deleteCommand(
|
||||
): Promise<{ success: boolean; data?: { name: string; path: string }; error?: string }> {
|
||||
return request('DELETE', `/commands/${encodeURIComponent(name)}`);
|
||||
}
|
||||
|
||||
// ============ MCP API ============
|
||||
|
||||
/**
|
||||
* 获取所有 MCP 服务器状态
|
||||
*/
|
||||
export async function listMCPServers(): Promise<{
|
||||
success: boolean;
|
||||
data: MCPServerStatus[];
|
||||
error?: string;
|
||||
}> {
|
||||
return request('GET', '/mcp/servers');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个 MCP 服务器详情
|
||||
*/
|
||||
export async function getMCPServer(name: string): Promise<{
|
||||
success: boolean;
|
||||
data?: MCPServerStatus;
|
||||
error?: string;
|
||||
}> {
|
||||
return request('GET', `/mcp/servers/${encodeURIComponent(name)}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 连接 MCP 服务器
|
||||
*/
|
||||
export async function connectMCPServer(name: string): Promise<{
|
||||
success: boolean;
|
||||
data?: { message: string; status: MCPServerStatus };
|
||||
error?: string;
|
||||
}> {
|
||||
return request('POST', `/mcp/servers/${encodeURIComponent(name)}/connect`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 断开 MCP 服务器
|
||||
*/
|
||||
export async function disconnectMCPServer(name: string): Promise<{
|
||||
success: boolean;
|
||||
data?: { message: string; status: MCPServerStatus };
|
||||
error?: string;
|
||||
}> {
|
||||
return request('POST', `/mcp/servers/${encodeURIComponent(name)}/disconnect`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用 MCP 服务器
|
||||
*/
|
||||
export async function enableMCPServer(name: string): Promise<{
|
||||
success: boolean;
|
||||
data?: { message: string; status: MCPServerStatus };
|
||||
error?: string;
|
||||
}> {
|
||||
return request('POST', `/mcp/servers/${encodeURIComponent(name)}/enable`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用 MCP 服务器
|
||||
*/
|
||||
export async function disableMCPServer(name: string): Promise<{
|
||||
success: boolean;
|
||||
data?: { message: string; status: MCPServerStatus };
|
||||
error?: string;
|
||||
}> {
|
||||
return request('POST', `/mcp/servers/${encodeURIComponent(name)}/disable`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有 MCP 工具
|
||||
*/
|
||||
export async function listMCPTools(): Promise<{
|
||||
success: boolean;
|
||||
data: MCPToolInfo[];
|
||||
error?: string;
|
||||
}> {
|
||||
return request('GET', '/mcp/tools');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个 MCP 工具详情
|
||||
*/
|
||||
export async function getMCPTool(name: string): Promise<{
|
||||
success: boolean;
|
||||
data?: MCPToolInfo;
|
||||
error?: string;
|
||||
}> {
|
||||
return request('GET', `/mcp/tools/${encodeURIComponent(name)}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 MCP 配置
|
||||
*/
|
||||
export async function getMCPConfig(): Promise<{
|
||||
success: boolean;
|
||||
data?: MCPConfig;
|
||||
error?: string;
|
||||
}> {
|
||||
return request('GET', '/mcp/config');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user