Files
cc-switch/src/lib/api/mcp.ts
Jason ac09551563 feat(frontend): add unified MCP types and API layer for v3.7.0
## Type Definitions
- Update McpServer interface with new apps field (McpApps)
- Add McpApps interface for multi-app enable state
- Add McpServersMap type for server collections
- Mark enabled field as deprecated (use apps instead)
- Maintain backward compatibility with optional fields

## API Layer Updates
- Add unified MCP management methods to mcpApi:
  * getAllServers() - retrieve all servers with apps state
  * upsertUnifiedServer() - add/update server with apps
  * deleteUnifiedServer() - remove server
  * toggleApp() - enable/disable server for specific app
  * syncAllServers() - sync all enabled servers to live configs
- Import new McpServersMap type

## Code Organization
- Keep all types in src/types.ts (removed duplicate types/mcp.ts)
- Follow existing project structure conventions

Related: v3.7.0 unified MCP management
2025-11-14 13:01:47 +08:00

142 lines
3.6 KiB
TypeScript

import { invoke } from "@tauri-apps/api/core";
import type {
McpConfigResponse,
McpServer,
McpServerSpec,
McpServersMap,
McpStatus,
} from "@/types";
import type { AppId } from "./types";
export const mcpApi = {
async getStatus(): Promise<McpStatus> {
return await invoke("get_claude_mcp_status");
},
async readConfig(): Promise<string | null> {
return await invoke("read_claude_mcp_config");
},
async upsertServer(
id: string,
spec: McpServerSpec | Record<string, any>,
): Promise<boolean> {
return await invoke("upsert_claude_mcp_server", { id, spec });
},
async deleteServer(id: string): Promise<boolean> {
return await invoke("delete_claude_mcp_server", { id });
},
async validateCommand(cmd: string): Promise<boolean> {
return await invoke("validate_mcp_command", { cmd });
},
async getConfig(app: AppId = "claude"): Promise<McpConfigResponse> {
return await invoke("get_mcp_config", { app });
},
async importFromClaude(): Promise<number> {
return await invoke("import_mcp_from_claude");
},
async importFromCodex(): Promise<number> {
return await invoke("import_mcp_from_codex");
},
async upsertServerInConfig(
app: AppId,
id: string,
spec: McpServer,
options?: { syncOtherSide?: boolean },
): Promise<boolean> {
const payload = {
app,
id,
spec,
...(options?.syncOtherSide !== undefined
? { syncOtherSide: options.syncOtherSide }
: {}),
};
return await invoke("upsert_mcp_server_in_config", payload);
},
async deleteServerInConfig(
app: AppId,
id: string,
options?: { syncOtherSide?: boolean },
): Promise<boolean> {
const payload = {
app,
id,
...(options?.syncOtherSide !== undefined
? { syncOtherSide: options.syncOtherSide }
: {}),
};
return await invoke("delete_mcp_server_in_config", payload);
},
async setEnabled(app: AppId, id: string, enabled: boolean): Promise<boolean> {
return await invoke("set_mcp_enabled", { app, id, enabled });
},
async syncEnabledToClaude(): Promise<boolean> {
return await invoke("sync_enabled_mcp_to_claude");
},
async syncEnabledToCodex(): Promise<boolean> {
return await invoke("sync_enabled_mcp_to_codex");
},
async syncEnabledToGemini(): Promise<boolean> {
return await invoke("sync_enabled_mcp_to_gemini");
},
async importFromGemini(): Promise<number> {
return await invoke("import_mcp_from_gemini");
},
// ========================================================================
// v3.7.0 新增:统一 MCP 管理 API
// ========================================================================
/**
* 获取所有 MCP 服务器(统一结构)
*/
async getAllServers(): Promise<McpServersMap> {
return await invoke("get_mcp_servers");
},
/**
* 添加或更新 MCP 服务器(统一结构)
*/
async upsertUnifiedServer(server: McpServer): Promise<void> {
return await invoke("upsert_mcp_server", { server });
},
/**
* 删除 MCP 服务器
*/
async deleteUnifiedServer(id: string): Promise<boolean> {
return await invoke("delete_mcp_server", { id });
},
/**
* 切换 MCP 服务器在指定应用的启用状态
*/
async toggleApp(
serverId: string,
app: AppId,
enabled: boolean,
): Promise<void> {
return await invoke("toggle_mcp_app", { serverId, app, enabled });
},
/**
* 手动同步所有启用的 MCP 服务器到对应的应用
*/
async syncAllServers(): Promise<void> {
return await invoke("sync_all_mcp_servers");
},
};