host.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. package controller
  2. import (
  3. "net/http"
  4. "strings"
  5. "github.com/gin-gonic/gin"
  6. "github.com/labring/aiproxy/core/common"
  7. "github.com/labring/aiproxy/core/common/config"
  8. "github.com/labring/aiproxy/core/middleware"
  9. "github.com/labring/aiproxy/core/model"
  10. mcpservers "github.com/labring/aiproxy/mcp-servers"
  11. "github.com/mark3labs/mcp-go/mcp"
  12. )
  13. func routeHostMCP(
  14. c *gin.Context,
  15. publicHandler, groupHandler func(c *gin.Context, mcpID string),
  16. ) {
  17. log := common.GetLogger(c)
  18. host := c.Request.Host
  19. log.Debugf("route host mcp: %s", host)
  20. publicMCPHost := config.GetPublicMCPHost()
  21. groupMCPHost := config.GetGroupMCPHost()
  22. switch {
  23. case publicMCPHost != "" && strings.HasSuffix(host, publicMCPHost):
  24. mcpID := strings.TrimSuffix(host, "."+publicMCPHost)
  25. publicHandler(c, mcpID)
  26. case groupMCPHost != "" && strings.HasSuffix(host, groupMCPHost):
  27. mcpID := strings.TrimSuffix(host, "."+groupMCPHost)
  28. groupHandler(c, mcpID)
  29. default:
  30. http.Error(c.Writer, "invalid host", http.StatusNotFound)
  31. }
  32. }
  33. // HostMCPSSEServer godoc
  34. //
  35. // @Summary Public MCP SSE Server
  36. // @Security ApiKeyAuth
  37. // @Router /sse [get]
  38. func HostMCPSSEServer(c *gin.Context) {
  39. routeHostMCP(c, func(c *gin.Context, mcpID string) {
  40. publicMcp, err := model.CacheGetPublicMCP(mcpID)
  41. if err != nil {
  42. http.Error(c.Writer, err.Error(), http.StatusBadRequest)
  43. return
  44. }
  45. if publicMcp.Status != model.PublicMCPStatusEnabled {
  46. http.Error(c.Writer, "mcp is not enabled", http.StatusBadRequest)
  47. return
  48. }
  49. group := middleware.GetGroup(c)
  50. paramsFunc := newGroupParams(publicMcp.ID, group.ID)
  51. handlePublicSSEMCP(c, publicMcp, paramsFunc, sseEndpoint)
  52. }, func(c *gin.Context, mcpID string) {
  53. group := middleware.GetGroup(c)
  54. groupMcp, err := model.CacheGetGroupMCP(group.ID, mcpID)
  55. if err != nil {
  56. http.Error(c.Writer, err.Error(), http.StatusNotFound)
  57. return
  58. }
  59. if groupMcp.Status != model.GroupMCPStatusEnabled {
  60. http.Error(c.Writer, "mcp is not enabled", http.StatusNotFound)
  61. return
  62. }
  63. handleGroupSSEMCPServer(c, groupMcp, sseEndpoint)
  64. })
  65. }
  66. // HostMCPStreamable godoc
  67. //
  68. // @Summary Host MCP Streamable Server
  69. // @Security ApiKeyAuth
  70. // @Router /mcp [get]
  71. // @Router /mcp [post]
  72. // @Router /mcp [delete]
  73. func HostMCPStreamable(c *gin.Context) {
  74. routeHostMCP(c, func(c *gin.Context, mcpID string) {
  75. publicMcp, err := model.CacheGetPublicMCP(mcpID)
  76. if err != nil {
  77. c.JSON(http.StatusBadRequest, mcpservers.CreateMCPErrorResponse(
  78. mcp.NewRequestId(nil),
  79. mcp.INVALID_REQUEST,
  80. err.Error(),
  81. ))
  82. return
  83. }
  84. if publicMcp.Status != model.PublicMCPStatusEnabled {
  85. c.JSON(http.StatusNotFound, mcpservers.CreateMCPErrorResponse(
  86. mcp.NewRequestId(nil),
  87. mcp.INVALID_REQUEST,
  88. "mcp is not enabled",
  89. ))
  90. return
  91. }
  92. group := middleware.GetGroup(c)
  93. paramsFunc := newGroupParams(publicMcp.ID, group.ID)
  94. handlePublicStreamable(c, publicMcp, paramsFunc)
  95. }, func(c *gin.Context, mcpID string) {
  96. group := middleware.GetGroup(c)
  97. groupMcp, err := model.CacheGetGroupMCP(group.ID, mcpID)
  98. if err != nil {
  99. c.JSON(http.StatusNotFound, mcpservers.CreateMCPErrorResponse(
  100. mcp.NewRequestId(nil),
  101. mcp.INVALID_REQUEST,
  102. err.Error(),
  103. ))
  104. return
  105. }
  106. if groupMcp.Status != model.GroupMCPStatusEnabled {
  107. c.JSON(http.StatusNotFound, mcpservers.CreateMCPErrorResponse(
  108. mcp.NewRequestId(nil),
  109. mcp.INVALID_REQUEST,
  110. "mcp is not enabled",
  111. ))
  112. return
  113. }
  114. handleGroupStreamable(c, groupMcp)
  115. })
  116. }