145 lines
4.3 KiB
Go
145 lines
4.3 KiB
Go
package system
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/mcp/client"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
|
|
"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/mark3labs/mcp-go/mcp"
|
|
)
|
|
|
|
// Create
|
|
// @Tags mcp
|
|
// @Summary 自动McpTool
|
|
// @Security ApiKeyAuth
|
|
// @accept application/json
|
|
// @Produce application/json
|
|
// @Param data body request.AutoMcpTool true "创建自动代码"
|
|
// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
|
|
// @Router /autoCode/mcp [post]
|
|
func (a *AutoCodeTemplateApi) MCP(c *gin.Context) {
|
|
var info request.AutoMcpTool
|
|
err := c.ShouldBindJSON(&info)
|
|
if err != nil {
|
|
response.FailWithMessage(err.Error(), c)
|
|
return
|
|
}
|
|
|
|
toolFilePath, err := autoCodeTemplateService.CreateMcp(c.Request.Context(), info)
|
|
if err != nil {
|
|
response.FailWithMessage("创建失败", c)
|
|
global.GVA_LOG.Error(err.Error())
|
|
return
|
|
}
|
|
response.OkWithMessage("创建成功,MCP Tool路径:"+toolFilePath, c)
|
|
}
|
|
|
|
// Create
|
|
// @Tags mcp
|
|
// @Summary 自动McpTool
|
|
// @Security ApiKeyAuth
|
|
// @accept application/json
|
|
// @Produce application/json
|
|
// @Param data body request.AutoMcpTool true "创建自动代码"
|
|
// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
|
|
// @Router /autoCode/mcpList [post]
|
|
func (a *AutoCodeTemplateApi) MCPList(c *gin.Context) {
|
|
|
|
baseUrl := fmt.Sprintf("http://127.0.0.1:%d%s", global.GVA_CONFIG.System.Addr, global.GVA_CONFIG.MCP.SSEPath)
|
|
|
|
testClient, err := client.NewClient(baseUrl, "testClient", "v1.0.0", global.GVA_CONFIG.MCP.Name)
|
|
defer testClient.Close()
|
|
toolsRequest := mcp.ListToolsRequest{}
|
|
|
|
list, err := testClient.ListTools(c.Request.Context(), toolsRequest)
|
|
|
|
if err != nil {
|
|
response.FailWithMessage("创建失败", c)
|
|
global.GVA_LOG.Error(err.Error())
|
|
return
|
|
}
|
|
|
|
mcpServerConfig := map[string]interface{}{
|
|
"mcpServers": map[string]interface{}{
|
|
global.GVA_CONFIG.MCP.Name: map[string]string{
|
|
"url": baseUrl,
|
|
},
|
|
},
|
|
}
|
|
response.OkWithData(gin.H{
|
|
"mcpServerConfig": mcpServerConfig,
|
|
"list": list,
|
|
}, c)
|
|
}
|
|
|
|
// Create
|
|
// @Tags mcp
|
|
// @Summary 测试McpTool
|
|
// @Security ApiKeyAuth
|
|
// @accept application/json
|
|
// @Produce application/json
|
|
// @Param data body object true "调用MCP Tool的参数"
|
|
// @Success 200 {object} response.Response "{"success":true,"data":{},"msg":"测试成功"}"
|
|
// @Router /autoCode/mcpTest [post]
|
|
func (a *AutoCodeTemplateApi) MCPTest(c *gin.Context) {
|
|
// 定义接口请求结构
|
|
var testRequest struct {
|
|
Name string `json:"name" binding:"required"` // 工具名称
|
|
Arguments map[string]interface{} `json:"arguments" binding:"required"` // 工具参数
|
|
}
|
|
|
|
// 绑定JSON请求体
|
|
if err := c.ShouldBindJSON(&testRequest); err != nil {
|
|
response.FailWithMessage("参数解析失败:"+err.Error(), c)
|
|
return
|
|
}
|
|
|
|
// 创建MCP客户端
|
|
baseUrl := fmt.Sprintf("http://127.0.0.1:%d%s", global.GVA_CONFIG.System.Addr, global.GVA_CONFIG.MCP.SSEPath)
|
|
testClient, err := client.NewClient(baseUrl, "testClient", "v1.0.0", global.GVA_CONFIG.MCP.Name)
|
|
if err != nil {
|
|
response.FailWithMessage("创建MCP客户端失败:"+err.Error(), c)
|
|
return
|
|
}
|
|
defer testClient.Close()
|
|
|
|
ctx := c.Request.Context()
|
|
|
|
// 初始化MCP连接
|
|
initRequest := mcp.InitializeRequest{}
|
|
initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION
|
|
initRequest.Params.ClientInfo = mcp.Implementation{
|
|
Name: "testClient",
|
|
Version: "v1.0.0",
|
|
}
|
|
|
|
_, err = testClient.Initialize(ctx, initRequest)
|
|
if err != nil {
|
|
response.FailWithMessage("初始化MCP连接失败:"+err.Error(), c)
|
|
return
|
|
}
|
|
|
|
// 构建工具调用请求
|
|
request := mcp.CallToolRequest{}
|
|
request.Params.Name = testRequest.Name
|
|
request.Params.Arguments = testRequest.Arguments
|
|
|
|
// 调用工具
|
|
result, err := testClient.CallTool(ctx, request)
|
|
if err != nil {
|
|
response.FailWithMessage("工具调用失败:"+err.Error(), c)
|
|
return
|
|
}
|
|
|
|
// 处理响应结果
|
|
if len(result.Content) == 0 {
|
|
response.FailWithMessage("工具未返回任何内容", c)
|
|
return
|
|
}
|
|
|
|
// 返回结果
|
|
response.OkWithData(result.Content, c)
|
|
}
|