fix: add Clear button to MCP server edit page

This commit is contained in:
Yang Luo
2026-04-05 16:41:17 +08:00
parent a69c4454ca
commit 2762390c32
4 changed files with 34 additions and 4 deletions

View File

@@ -115,11 +115,13 @@ func (c *ApiController) UpdateServer() {
// @Tag Server API
// @Description sync MCP tools for a server and return sync errors directly
// @Param id query string true "The id ( owner/name ) of the server"
// @Param isCleared query bool false "Whether to clear all tools instead of syncing"
// @Param body body object.Server true "The details of the server"
// @Success 200 {object} controllers.Response The Response object
// @router /sync-mcp-tool [post]
func (c *ApiController) SyncMcpTool() {
id := c.Ctx.Input.Query("id")
isCleared := c.Ctx.Input.Query("isCleared") == "1"
var server object.Server
err := json.Unmarshal(c.Ctx.Input.RequestBody, &server)
@@ -128,7 +130,7 @@ func (c *ApiController) SyncMcpTool() {
return
}
c.Data["json"] = wrapActionResponse(object.SyncMcpTool(id, &server))
c.Data["json"] = wrapActionResponse(object.SyncMcpTool(id, &server, isCleared))
c.ServeJSON()
}

View File

@@ -96,8 +96,19 @@ func UpdateServer(id string, server *Server) (bool, error) {
return true, nil
}
func SyncMcpTool(id string, server *Server) (bool, error) {
func SyncMcpTool(id string, server *Server, isCleared bool) (bool, error) {
owner, name := util.GetOwnerAndNameFromIdNoCheck(id)
if isCleared {
server.Tools = nil
server.UpdatedTime = util.GetCurrentTime()
_, err := ormer.Engine.ID(core.PK{owner, name}).Cols("tools", "updated_time").Update(server)
if err != nil {
return false, err
}
return true, nil
}
oldServer, err := getServer(owner, name)
if err != nil {
return false, err

View File

@@ -136,6 +136,22 @@ class ServerEditPage extends React.Component {
});
}
clearMcpTool() {
const server = Setting.deepCopy(this.state.server);
ServerBackend.syncMcpTool(this.state.owner, this.state.serverName, server, true)
.then((res) => {
if (res.status === "ok") {
Setting.showMessage("success", i18next.t("general:Successfully modified"));
this.getServer();
} else {
Setting.showMessage("error", `${i18next.t("general:Failed to update")}: ${res.msg}`);
}
})
.catch(error => {
Setting.showMessage("error", `${i18next.t("general:Failed to connect to server")}: ${error}`);
});
}
deleteServer() {
ServerBackend.deleteServer(this.state.server)
.then((res) => {
@@ -231,6 +247,7 @@ class ServerEditPage extends React.Component {
</Col>
<Col span={22} >
{this.state.mode !== "add" ? <Button type="primary" style={{marginBottom: "5px"}} onClick={() => this.syncMcpTool()}>{i18next.t("general:Sync")}</Button> : null}
{this.state.mode !== "add" ? <Button style={{marginBottom: "5px", marginLeft: "10px"}} onClick={() => this.clearMcpTool()}>{i18next.t("general:Clear")}</Button> : null}
<ToolTable
tools={this.state.server?.tools || []}
onUpdateTable={(value) => {this.updateServerField("tools", value);}}

View File

@@ -44,9 +44,9 @@ export function updateServer(owner, name, server) {
}).then(res => res.json());
}
export function syncMcpTool(owner, name, server) {
export function syncMcpTool(owner, name, server, isCleared = false) {
const newServer = Setting.deepCopy(server);
return fetch(`${Setting.ServerUrl}/api/sync-mcp-tool?id=${owner}/${encodeURIComponent(name)}`, {
return fetch(`${Setting.ServerUrl}/api/sync-mcp-tool?id=${owner}/${encodeURIComponent(name)}&isCleared=${isCleared ? "1" : "0"}`, {
method: "POST",
credentials: "include",
body: JSON.stringify(newServer),