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');
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user