import { useSelectFile } from '@/web/common/file/hooks/useSelectFile'; import { getMCPTools, postCreateMCPTools } from '@/web/core/app/api/plugin'; import { Box, Button, Center, Flex, Input, ModalBody, ModalFooter, Table, TableContainer, Tbody, Td, Th, Thead, Tr } from '@chakra-ui/react'; import Avatar from '@fastgpt/web/components/common/Avatar'; import MyModal from '@fastgpt/web/components/common/MyModal'; import MyTooltip from '@fastgpt/web/components/common/MyTooltip'; import { useRequest2 } from '@fastgpt/web/hooks/useRequest'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; import { AppListContext } from './context'; import { useContextSelector } from 'use-context-selector'; import { type ToolType } from '@fastgpt/global/core/app/type'; import type { getMCPToolsBody } from '@/pages/api/support/mcp/client/getTools'; export type MCPToolSetData = { url: string; toolList: ToolType[]; }; export type EditMCPToolsProps = { avatar: string; name: string; mcpData: MCPToolSetData; }; const MCPToolsEditModal = ({ onClose }: { onClose: () => void }) => { const { t } = useTranslation(); const { toast } = useToast(); const { parentId, loadMyApps } = useContextSelector(AppListContext, (v) => v); const { register, setValue, handleSubmit, watch } = useForm({ defaultValues: { avatar: 'core/app/type/mcpToolsFill', name: '', mcpData: { url: '', toolList: [] } } }); const avatar = watch('avatar'); const mcpData = watch('mcpData'); const { runAsync: onCreate, loading: isCreating } = useRequest2( async (data: EditMCPToolsProps) => { return postCreateMCPTools({ name: data.name, avatar: data.avatar, toolList: data.mcpData.toolList, url: data.mcpData.url, parentId }); }, { onSuccess() { onClose(); loadMyApps(); }, successToast: t('common:create_success'), errorToast: t('common:create_failed') } ); const { runAsync: runGetMCPTools, loading: isGettingTools } = useRequest2( (data: getMCPToolsBody) => getMCPTools(data), { onSuccess: (res: ToolType[]) => { setValue('mcpData.toolList', res); }, errorToast: t('app:MCP_tools_parse_failed') } ); const { File, onOpen: onOpenSelectFile, onSelectImage } = useSelectFile({ fileType: 'image/*', multiple: false }); return ( <> {t('common:input_name')} {t('app:MCP_tools_url')} {t('app:MCP_tools_list')} {mcpData.toolList.map((item) => ( ))}
{t('common:Name')} {t('common:plugin.Description')}
{item.name} {item.description}
{mcpData.toolList.length === 0 && (
{t('app:no_mcp_tools_list')}
)}
onSelectImage(e, { maxH: 300, maxW: 300, callback: (e) => setValue('avatar', e) }) } /> ); }; export default MCPToolsEditModal;