Initial commit
This commit is contained in:
173
server/api/v1/system/auto_code_mcp.go
Normal file
173
server/api/v1/system/auto_code_mcp.go
Normal file
@@ -0,0 +1,173 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/flipped-aurora/gin-vue-admin/server/global"
|
||||
mcpTool "github.com/flipped-aurora/gin-vue-admin/server/mcp"
|
||||
"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"
|
||||
)
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCP(c *gin.Context) {
|
||||
var info request.AutoMcpTool
|
||||
if err := c.ShouldBindJSON(&info); 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)
|
||||
}
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCPStatus(c *gin.Context) {
|
||||
response.OkWithData(gin.H{
|
||||
"status": mcpTool.GetManagedStandaloneStatus(c.Request.Context()),
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, c)
|
||||
}
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCPStart(c *gin.Context) {
|
||||
status, err := mcpTool.StartManagedStandalone(c.Request.Context())
|
||||
if err != nil {
|
||||
response.FailWithDetailed(gin.H{
|
||||
"status": status,
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithDetailed(gin.H{
|
||||
"status": status,
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, "MCP独立服务已启动", c)
|
||||
}
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCPStop(c *gin.Context) {
|
||||
status, err := mcpTool.StopManagedStandalone(c.Request.Context())
|
||||
if err != nil {
|
||||
response.FailWithDetailed(gin.H{
|
||||
"status": status,
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithDetailed(gin.H{
|
||||
"status": status,
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, "MCP独立服务已停用", c)
|
||||
}
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCPList(c *gin.Context) {
|
||||
baseURL := mcpTool.ResolveMCPServiceURL()
|
||||
testClient, err := client.NewClient(baseURL, "testClient", "v1.0.0", mcpServerName(), incomingMCPHeaders(c))
|
||||
if err != nil {
|
||||
response.FailWithDetailed(gin.H{
|
||||
"status": mcpTool.GetManagedStandaloneStatus(c.Request.Context()),
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, "连接MCP服务失败:"+err.Error(), c)
|
||||
return
|
||||
}
|
||||
defer testClient.Close()
|
||||
|
||||
list, err := testClient.ListTools(c.Request.Context(), mcp.ListToolsRequest{})
|
||||
if err != nil {
|
||||
response.FailWithDetailed(gin.H{
|
||||
"status": mcpTool.GetManagedStandaloneStatus(c.Request.Context()),
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
}, "获取工具列表失败:"+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithData(gin.H{
|
||||
"status": mcpTool.GetManagedStandaloneStatus(c.Request.Context()),
|
||||
"mcpServerConfig": buildMCPServerConfig(),
|
||||
"list": list,
|
||||
}, c)
|
||||
}
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCPRoutes(c *gin.Context) {
|
||||
response.OkWithData(gin.H{
|
||||
"routes": global.GVA_ROUTERS,
|
||||
}, c)
|
||||
}
|
||||
|
||||
func (a *AutoCodeTemplateApi) MCPTest(c *gin.Context) {
|
||||
var testRequest struct {
|
||||
Name string `json:"name" binding:"required"`
|
||||
Arguments map[string]interface{} `json:"arguments" binding:"required"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&testRequest); err != nil {
|
||||
response.FailWithMessage("参数解析失败:"+err.Error(), c)
|
||||
return
|
||||
}
|
||||
|
||||
baseURL := mcpTool.ResolveMCPServiceURL()
|
||||
testClient, err := client.NewClient(baseURL, "testClient", "v1.0.0", mcpServerName(), incomingMCPHeaders(c))
|
||||
if err != nil {
|
||||
response.FailWithMessage("连接MCP服务失败:"+err.Error(), c)
|
||||
return
|
||||
}
|
||||
defer testClient.Close()
|
||||
|
||||
callRequest := mcp.CallToolRequest{}
|
||||
callRequest.Params.Name = testRequest.Name
|
||||
callRequest.Params.Arguments = testRequest.Arguments
|
||||
|
||||
result, err := testClient.CallTool(c.Request.Context(), callRequest)
|
||||
if err != nil {
|
||||
response.FailWithMessage("工具调用失败:"+err.Error(), c)
|
||||
return
|
||||
}
|
||||
if len(result.Content) == 0 {
|
||||
response.FailWithMessage("工具未返回任何内容", c)
|
||||
return
|
||||
}
|
||||
|
||||
response.OkWithData(result.Content, c)
|
||||
}
|
||||
|
||||
func incomingMCPHeaders(c *gin.Context) map[string]string {
|
||||
headerName := mcpTool.ConfiguredAuthHeader()
|
||||
headerValue := c.GetHeader(headerName)
|
||||
if headerValue == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
return map[string]string{
|
||||
headerName: headerValue,
|
||||
}
|
||||
}
|
||||
|
||||
func buildMCPServerConfig() map[string]interface{} {
|
||||
baseURL := mcpTool.ResolveMCPServiceURL()
|
||||
authHeader := mcpTool.ConfiguredAuthHeader()
|
||||
serverName := mcpServerName()
|
||||
|
||||
return map[string]interface{}{
|
||||
"mcpServers": map[string]interface{}{
|
||||
serverName: map[string]interface{}{
|
||||
"url": baseURL,
|
||||
"headers": map[string]string{
|
||||
authHeader: "${YOUR_GVA_TOKEN}",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func mcpServerName() string {
|
||||
if name := strings.TrimSpace(global.GVA_CONFIG.MCP.Name); name != "" {
|
||||
return name
|
||||
}
|
||||
return "gva"
|
||||
}
|
||||
Reference in New Issue
Block a user