File size: 4,882 Bytes
e37ee12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import modelscope_studio.components.antd as antd
import modelscope_studio.components.base as ms
import gradio as gr
import json


def AddMcpServerButton():
    with antd.Button("添加 MCP Server", type="primary",
                     size="small") as add_mcp_server_btn:
        with ms.Slot("icon"):
            antd.Icon("PlusOutlined")
    with antd.Modal(
            title="添加 MCP Server",
            footer=False,
            styles=dict(footer=dict(display="none"))) as add_mcp_server_modal:
        with antd.Tabs():
            with antd.Tabs.Item(label="表单添加"):
                with antd.Form(layout="vertical") as add_mcp_server_form:
                    with antd.Form.Item(form_name="name",
                                        label="名称",
                                        rules=[{
                                            "required": True
                                        }]):
                        antd.Input(placeholder="MCP Server 名称,如 fetch、time 等")
                    with antd.Form.Item(form_name="url",
                                        label="SSE 链接",
                                        rules=[{
                                            "required": True
                                        }]):
                        antd.Input(placeholder="MCP Server SSE 链接")
                    with antd.Flex(gap="small", justify="end"):
                        add_mcp_server_modal_cancel_btn = antd.Button("取消")
                        antd.Button("确定", html_type="submit", type="primary")
            with antd.Tabs.Item(label="JSON 添加"):
                with antd.Form(layout="vertical") as add_mcp_server_json_form:
                    with antd.Form.Item(form_name="json",
                                        label="JSON",
                                        rules=[{
                                            "required":
                                            True,
                                            "validator":
                                            """(_, value) => {
                                                if (!value) {
                                                    return Promise.reject('请输入 JSON 值');
                                                }
                                                try {
                                                    const parsedValue = JSON.parse(value);
                                                    if (!parsedValue.mcpServers || typeof parsedValue.mcpServers !== 'object') {
                                                        return Promise.reject('配置必须包含正确的 mcpServers 字段');
                                                    }
                                                    return Promise.resolve()
                                                } catch {
                                                    return Promise.reject('请输入有效的 JSON 值');
                                                }
                                            } """
                                        }]):
                        antd.Input.Textarea(
                            auto_size=dict(minRows=4, maxRows=8),
                            placeholder=json.dumps(
                                {
                                    "mcpServers": {
                                        "fetch": {
                                            "type": "sse",
                                            "url": "mcp server sse url"
                                        }
                                    }
                                },
                                indent=4))
                    with antd.Flex(gap="small", justify="end"):
                        add_mcp_server_modal_json_cancel_btn = antd.Button(
                            "取消")
                        antd.Button("确定", html_type="submit", type="primary")
    add_mcp_server_btn.click(fn=lambda: gr.update(open=True),
                             outputs=[add_mcp_server_modal],
                             queue=False)
    gr.on(triggers=[
        add_mcp_server_modal_cancel_btn.click,
        add_mcp_server_modal_json_cancel_btn.click, add_mcp_server_modal.cancel
    ],
          queue=False,
          fn=lambda: gr.update(open=False),
          outputs=[add_mcp_server_modal])
    add_mcp_server_form.finish(
        lambda: (gr.update(value={
            "name": "",
            "url": "",
        }), gr.update(open=False)),
        outputs=[add_mcp_server_form, add_mcp_server_modal])
    add_mcp_server_json_form.finish(
        lambda: (gr.update(value={"json": ""}), gr.update(open=False)),
        outputs=[add_mcp_server_json_form, add_mcp_server_modal])
    return add_mcp_server_form, add_mcp_server_json_form