mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-06-13 10:55:59 +00:00
a17d2ff8f8
GET /api/mcp/config returns 403 for non-admin users, but the previous
client returned the error body as MCPConfig, causing MCPServerList to
crash with 'Cannot convert undefined or null to object' on
Object.entries(config.mcp_servers).
- api.ts: introduce MCPConfigRequestError; loadMCPConfig and
updateMCPConfig now throw it (carrying status + isAdminRequired)
instead of letting non-2xx bodies leak through as parsed config
- tool-settings-page.tsx: render a friendly 'admin privileges required'
empty state when the React Query error is an admin-required
MCPConfigRequestError; keep MCPServerList resilient with
Object.entries(servers ?? {}) and an empty-state for no servers
- i18n: add settings.tools.adminRequired and settings.tools.empty in
en-US, zh-CN and the Translations type
- tests: cover 403 / 5xx / instanceof / detail-fallback for both
loadMCPConfig and updateMCPConfig in tests/unit/core/mcp/api.test.ts
Refs: #3527
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
import { loadMCPConfig, MCPConfigRequestError, updateMCPConfig } from "./api";
|
|
|
|
export function useMCPConfig() {
|
|
const { data, isLoading, error } = useQuery({
|
|
queryKey: ["mcpConfig"],
|
|
queryFn: () => loadMCPConfig(),
|
|
retry: (count, error) =>
|
|
!(error instanceof MCPConfigRequestError) && count < 3,
|
|
});
|
|
return { config: data, isLoading, error };
|
|
}
|
|
|
|
export function useEnableMCPServer() {
|
|
const queryClient = useQueryClient();
|
|
const { config } = useMCPConfig();
|
|
return useMutation({
|
|
mutationFn: async ({
|
|
serverName,
|
|
enabled,
|
|
}: {
|
|
serverName: string;
|
|
enabled: boolean;
|
|
}) => {
|
|
if (!config) {
|
|
throw new Error("MCP config not found");
|
|
}
|
|
if (!config.mcp_servers[serverName]) {
|
|
throw new Error(`MCP server ${serverName} not found`);
|
|
}
|
|
await updateMCPConfig({
|
|
mcp_servers: {
|
|
...config.mcp_servers,
|
|
[serverName]: {
|
|
...config.mcp_servers[serverName],
|
|
enabled,
|
|
},
|
|
},
|
|
});
|
|
},
|
|
onSuccess: () => {
|
|
void queryClient.invalidateQueries({ queryKey: ["mcpConfig"] });
|
|
},
|
|
});
|
|
}
|