feat(mcp): implement mcp server management with CRUD operations
This commit is contained in:
@@ -6,6 +6,8 @@ import userService from "@/services/user_service";
|
||||
import { rsaPsw } from "../utils/encryption";
|
||||
import type { IFactory, IMyLlmModel } from "@/interfaces/database/llm";
|
||||
import type { LLMFactory } from "@/constants/llm";
|
||||
import type { IMcpServer, IMcpServerListResponse } from "@/interfaces/database/mcp";
|
||||
import type { IImportMcpServersRequestBody, ITestMcpRequestBody, ICreateMcpServerRequestBody } from "@/interfaces/request/mcp";
|
||||
|
||||
/**
|
||||
* 个人中心设置
|
||||
@@ -249,3 +251,239 @@ export function useTeamSetting() {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* MCP 设置
|
||||
*/
|
||||
export function useMcpSetting() {
|
||||
const [mcpServers, setMcpServers] = useState<IMcpServer[]>([]);
|
||||
const [loading, setLoading] = useState(false);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [total, setTotal] = useState(0);
|
||||
|
||||
// 获取 MCP 服务器列表
|
||||
const fetchMcpServers = useCallback(async () => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.listMcpServer({
|
||||
page: 1,
|
||||
size: 10,
|
||||
});
|
||||
if (res.data.code === 0) {
|
||||
const data: IMcpServerListResponse = res.data.data;
|
||||
setMcpServers(data.mcp_servers || []);
|
||||
setTotal(data.total || 0);
|
||||
} else {
|
||||
throw new Error(res.data.message || '获取 MCP 服务器列表失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '获取 MCP 服务器列表失败';
|
||||
setError(errorMessage);
|
||||
logger.error('获取 MCP 服务器列表失败:', error);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 导入 MCP 服务器
|
||||
const importMcpServers = useCallback(async (data: IImportMcpServersRequestBody) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.importMcpServer(data);
|
||||
if (res.data.code === 0) {
|
||||
await fetchMcpServers(); // 重新获取列表
|
||||
return { success: true };
|
||||
} else {
|
||||
throw new Error(res.data.message || '导入 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '导入 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
logger.error('导入 MCP 服务器失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [fetchMcpServers]);
|
||||
|
||||
// 导出 MCP 服务器
|
||||
const exportMcpServers = useCallback(async (mcpIds: string[]) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.exportMcpServer(mcpIds);
|
||||
if (res.data.code === 0) {
|
||||
// 处理导出数据,创建下载
|
||||
const exportData = res.data.data;
|
||||
const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' });
|
||||
const url = URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.download = 'mcp-servers.json';
|
||||
a.click();
|
||||
URL.revokeObjectURL(url);
|
||||
return { success: true };
|
||||
} else {
|
||||
throw new Error(res.data.message || '导出 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '导出 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
logger.error('导出 MCP 服务器失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 测试 MCP 服务器
|
||||
const testMcpServer = useCallback(async (data: ITestMcpRequestBody) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.testMcpServer(data);
|
||||
if (res.data.code === 0) {
|
||||
return { success: true, data: res.data.data };
|
||||
} else {
|
||||
throw new Error(res.data.message || '测试 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '测试 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 获取 MCP 服务器详情
|
||||
const getMcpServerDetail = useCallback(async (mcpId: string) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.mcpDetail(mcpId);
|
||||
if (res.data.code === 0) {
|
||||
const detail: IMcpServer = res.data.data;
|
||||
return { success: true, data: detail };
|
||||
} else {
|
||||
throw new Error(res.data.message || '获取 MCP 服务器详情失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '获取 MCP 服务器详情失败';
|
||||
setError(errorMessage);
|
||||
logger.error('获取 MCP 服务器详情失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, []);
|
||||
|
||||
// 创建 MCP 服务器
|
||||
const createMcpServer = useCallback(async (data: ICreateMcpServerRequestBody) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.createMcpServer(data);
|
||||
if (res.data.code === 0) {
|
||||
await fetchMcpServers(); // 重新获取列表
|
||||
return { success: true, data: res.data.data };
|
||||
} else {
|
||||
throw new Error(res.data.message || '创建 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '创建 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
logger.error('创建 MCP 服务器失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [fetchMcpServers]);
|
||||
|
||||
// 更新 MCP 服务器
|
||||
const updateMcpServer = useCallback(async (data: ICreateMcpServerRequestBody & { mcp_id: string }) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.updateMcpServer(data);
|
||||
if (res.data.code === 0) {
|
||||
await fetchMcpServers(); // 重新获取列表
|
||||
return { success: true, data: res.data.data };
|
||||
} else {
|
||||
throw new Error(res.data.message || '更新 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '更新 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
logger.error('更新 MCP 服务器失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [fetchMcpServers]);
|
||||
|
||||
// 删除 MCP 服务器
|
||||
const deleteMcpServer = useCallback(async (mcpId: string) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.removeMcpServer([mcpId]);
|
||||
if (res.data.code === 0) {
|
||||
await fetchMcpServers(); // 重新获取列表
|
||||
return { success: true };
|
||||
} else {
|
||||
throw new Error(res.data.message || '删除 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '删除 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
logger.error('删除 MCP 服务器失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [fetchMcpServers]);
|
||||
|
||||
// 批量删除 MCP 服务器
|
||||
const deleteMcpServers = useCallback(async (mcpIds: string[]) => {
|
||||
try {
|
||||
setLoading(true);
|
||||
setError(null);
|
||||
const res = await userService.removeMcpServer(mcpIds);
|
||||
if (res.data.code === 0) {
|
||||
await fetchMcpServers(); // 重新获取列表
|
||||
return { success: true };
|
||||
} else {
|
||||
throw new Error(res.data.message || '批量删除 MCP 服务器失败');
|
||||
}
|
||||
} catch (error: any) {
|
||||
const errorMessage = error.response?.data?.message || error.message || '批量删除 MCP 服务器失败';
|
||||
setError(errorMessage);
|
||||
logger.error('批量删除 MCP 服务器失败:', error);
|
||||
return { success: false, error: errorMessage };
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [fetchMcpServers]);
|
||||
|
||||
return {
|
||||
// 状态
|
||||
mcpServers,
|
||||
loading,
|
||||
error,
|
||||
total,
|
||||
|
||||
// 方法
|
||||
fetchMcpServers,
|
||||
importMcpServers,
|
||||
exportMcpServers,
|
||||
testMcpServer,
|
||||
getMcpServerDetail,
|
||||
createMcpServer,
|
||||
updateMcpServer,
|
||||
deleteMcpServer,
|
||||
deleteMcpServers,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user