diff --git a/web/app/components/tools/mcp/mcp-server-modal.tsx b/web/app/components/tools/mcp/mcp-server-modal.tsx
new file mode 100644
index 0000000000..26fb8a17dd
--- /dev/null
+++ b/web/app/components/tools/mcp/mcp-server-modal.tsx
@@ -0,0 +1,83 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import { RiCloseLine } from '@remixicon/react'
+import Modal from '@/app/components/base/modal'
+import Button from '@/app/components/base/button'
+import Textarea from '@/app/components/base/textarea'
+import Divider from '@/app/components/base/divider'
+import MCPServerParamItem from '@/app/components/tools/mcp/mcp-server-param-item'
+import cn from '@/utils/classnames'
+
+export type ModalProps = {
+ latestParams?: any
+ data?: any
+ show: boolean
+ onConfirm: () => void
+ onHide: () => void
+}
+
+const MCPServerModal = ({
+ // latestParams,
+ data,
+ show,
+ onConfirm,
+ onHide,
+}: ModalProps) => {
+ const { t } = useTranslation()
+
+ const [description, setDescription] = React.useState('')
+
+ const submit = async () => {
+ await onConfirm()
+ onHide()
+ }
+
+ return (
+
+
+
+
+
+ {!data ? t('tools.mcp.server.modal.addTitle') : t('tools.mcp.server.modal.editTitle')}
+
+
+
+
+
{t('tools.mcp.server.modal.description')}
+
*
+
+
+
+
+
+
{t('tools.mcp.server.modal.parameters')}
+
+
+
{t('tools.mcp.server.modal.parametersTip')}
+
+ ({})}
+ />
+
+
+
+
+
+
+
+
+ )
+}
+
+export default MCPServerModal
diff --git a/web/app/components/tools/mcp/mcp-server-param-item.tsx b/web/app/components/tools/mcp/mcp-server-param-item.tsx
new file mode 100644
index 0000000000..c1465753ce
--- /dev/null
+++ b/web/app/components/tools/mcp/mcp-server-param-item.tsx
@@ -0,0 +1,35 @@
+'use client'
+import React from 'react'
+import { useTranslation } from 'react-i18next'
+import Textarea from '@/app/components/base/textarea'
+
+type Props = {
+ data?: any
+ onChange: (value: string) => void
+}
+
+const MCPServerParamItem = ({
+ data,
+ onChange,
+}: Props) => {
+ const { t } = useTranslation()
+
+ return (
+
+
+
{data.label}
+
·
+
{data.name}
+
{data.type}
+
+
+
+ )
+}
+
+export default MCPServerParamItem
diff --git a/web/app/components/tools/mcp/mcp-service-card.tsx b/web/app/components/tools/mcp/mcp-service-card.tsx
index c1e87d2f23..aaf8acc924 100644
--- a/web/app/components/tools/mcp/mcp-service-card.tsx
+++ b/web/app/components/tools/mcp/mcp-service-card.tsx
@@ -19,6 +19,7 @@ import type { AppDetailResponse } from '@/models/app'
import { useAppContext } from '@/context/app-context'
import type { AppSSO } from '@/types/app'
import Indicator from '@/app/components/header/indicator'
+import MCPServerModal from '@/app/components/tools/mcp/mcp-server-modal'
import cn from '@/utils/classnames'
export type IAppCardProps = {
@@ -53,80 +54,91 @@ function MCPServiceCard({
// TODO
}
+ const [showMCPServerModal, setShowMCPServerModal] = useState(false)
+
return (
-
-
-
-
-
-
-
-
-
-
- {t('tools.mcp.server.title')}
+ <>
+
+
+
+
-
-
-
- {runningStatus
- ? t('appOverview.overview.status.running')
- : t('appOverview.overview.status.disable')}
-
-
-
-
-
-
- {t('tools.mcp.server.url')}
-
-
-
-
-
- {/* button copy link/ button regenerate */}
- {showConfirmDelete && (
-
{
- onGenCode()
- setShowConfirmDelete(false)
- }}
- onCancel={() => setShowConfirmDelete(false)}
- />
- )}
- {isCurrentWorkspaceManager && (
-
- setShowConfirmDelete(true)}
- >
-
+
+
+ {t('tools.mcp.server.title')}
-
- )}
+
+
+
+
+
+ {runningStatus
+ ? t('appOverview.overview.status.running')
+ : t('appOverview.overview.status.disable')}
+
+
+
+
+
+
+ {t('tools.mcp.server.url')}
+
+
+
+
+
+ {/* button copy link/ button regenerate */}
+ {showConfirmDelete && (
+
{
+ onGenCode()
+ setShowConfirmDelete(false)
+ }}
+ onCancel={() => setShowConfirmDelete(false)}
+ />
+ )}
+ {isCurrentWorkspaceManager && (
+
+ setShowConfirmDelete(true)}
+ >
+
+
+
+ )}
+
-
-
-
+
+
+
-
+ {showMCPServerModal && (
+
setShowMCPServerModal(false)}
+ onHide={() => setShowMCPServerModal(false)}
+ />
+ )}
+ >
)
}
diff --git a/web/i18n/en-US/tools.ts b/web/i18n/en-US/tools.ts
index 2635d4e06b..fd264f381b 100644
--- a/web/i18n/en-US/tools.ts
+++ b/web/i18n/en-US/tools.ts
@@ -199,6 +199,7 @@ const translation = {
modal: {
addTitle: 'Add description to enable MCP server',
editTitle: 'Edit description',
+ description: 'Description',
descriptionPlaceholder: 'Explain what this tool does and how it should be used by the LLM',
parameters: 'Parameters',
parametersTip: 'Add descriptions for each parameter to help the LLM understand their purpose and constraints.',
diff --git a/web/i18n/zh-Hans/tools.ts b/web/i18n/zh-Hans/tools.ts
index a082e33119..be8b67de4f 100644
--- a/web/i18n/zh-Hans/tools.ts
+++ b/web/i18n/zh-Hans/tools.ts
@@ -199,6 +199,7 @@ const translation = {
modal: {
addTitle: '添加描述以启用 MCP 服务',
editTitle: '编辑 MCP 服务描述',
+ description: '描述',
descriptionPlaceholder: '解释此工具的功能以及 LLM 应如何使用它',
parameters: '参数',
parametersTip: '为每个参数添加描述,以帮助 LLM 理解其目的和约束条件。',