mirror of
https://github.com/APIParkLab/APIPark.git
synced 2026-06-12 18:11:34 +08:00
79 lines
1.8 KiB
Go
79 lines
1.8 KiB
Go
package mcp_server
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/mark3labs/mcp-go/server"
|
|
|
|
"github.com/eolinker/eosc"
|
|
)
|
|
|
|
var (
|
|
mcpServer = NewServer()
|
|
ServiceBasePath = "mcp/service"
|
|
GlobalBasePath = "mcp/global"
|
|
)
|
|
|
|
func NewServer() *Server {
|
|
return &Server{
|
|
sseServers: eosc.BuildUntyped[string, *server.SSEServer](),
|
|
}
|
|
}
|
|
|
|
type Server struct {
|
|
sseServers eosc.Untyped[string, *server.SSEServer]
|
|
}
|
|
|
|
func (s *Server) Set(path string, sseServer *server.SSEServer) {
|
|
s.sseServers.Set(path, sseServer)
|
|
}
|
|
|
|
func (s *Server) Del(path string) {
|
|
s.sseServers.Del(path)
|
|
}
|
|
|
|
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
sseServer, has := s.sseServers.Get(trimPath(r.URL.Path))
|
|
if has {
|
|
sseServer.ServeHTTP(w, r)
|
|
return
|
|
}
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
|
|
func trimPath(path string) string {
|
|
path = strings.TrimSuffix(path, "/")
|
|
path = strings.TrimSuffix(path, "/message")
|
|
path = strings.TrimSuffix(path, "/sse")
|
|
return path
|
|
}
|
|
|
|
func SetSSEServer(sid string, name string, version string, tools ...ITool) {
|
|
s := server.NewMCPServer(name, version)
|
|
for _, tool := range tools {
|
|
tool.RegisterMCP(s)
|
|
}
|
|
apiPath := fmt.Sprintf("/api/v1/%s/%s", ServiceBasePath, sid)
|
|
openAPIPath := fmt.Sprintf("/openapi/v1/%s/%s", ServiceBasePath, sid)
|
|
mcpServer.Set(apiPath, server.NewSSEServer(s, server.WithBasePath(apiPath)))
|
|
mcpServer.Set(openAPIPath, server.NewSSEServer(s, server.WithBasePath(openAPIPath)))
|
|
}
|
|
|
|
func DelSSEServer(sid string) {
|
|
apiPath := fmt.Sprintf("/api/v1/%s/%s", ServiceBasePath, sid)
|
|
openAPIPath := fmt.Sprintf("/openapi/v1/%s/%s", ServiceBasePath, sid)
|
|
mcpServer.Del(apiPath)
|
|
mcpServer.Del(openAPIPath)
|
|
}
|
|
|
|
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
mcpServer.ServeHTTP(w, r)
|
|
}
|
|
|
|
func DefaultMCPServer() *Server {
|
|
return mcpServer
|
|
}
|