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:
2025-12-12 20:41:49 +08:00
parent 5a482f78ff
commit bad7bfcc36
11 changed files with 1225 additions and 5 deletions
+109
View File
@@ -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');
}
+65
View File
@@ -171,3 +171,68 @@ export interface CommandContent {
source: string;
sourcePath?: string;
}
// ============ MCP 相关 ============
/** MCP 服务器状态类型 */
export type MCPServerStatusType =
| 'connected'
| 'connecting'
| 'disconnected'
| 'disabled'
| 'error';
/** MCP 服务器状态 */
export interface MCPServerStatus {
/** 服务器名称 */
name: string;
/** 服务器类型 */
type: 'local' | 'remote';
/** 当前状态 */
status: MCPServerStatusType;
/** 工具数量 */
toolCount: number;
/** 错误信息 */
error?: string;
/** 配置信息 */
config?: {
type: 'local' | 'remote';
command?: string[];
url?: string;
timeout?: number;
cwd?: string;
};
/** 工具列表(仅详情接口返回) */
tools?: MCPToolInfo[];
}
/** MCP 工具信息 */
export interface MCPToolInfo {
/** 完整工具名: {server}-{originalName} */
name: string;
/** 来源服务器名称 */
server: string;
/** MCP 服务器中的原始名称 */
originalName: string;
/** 工具描述 */
description: string;
/** 输入参数 JSON Schema */
inputSchema?: Record<string, unknown>;
}
/** MCP 配置 */
export interface MCPConfig {
/** MCP 服务器配置 */
mcp?: Record<string, MCPServerConfigInfo>;
/** 工具启用/禁用配置 */
tools?: Record<string, boolean>;
}
/** MCP 服务器配置信息 */
export interface MCPServerConfigInfo {
type: 'local' | 'remote';
command?: string[];
url?: string;
enabled?: boolean;
timeout?: number;
}