Some checks failed
Backend Tests / Static Checks (push) Has been cancelled
Backend Tests / Tests (other) (push) Has been cancelled
Backend Tests / Tests (plugin) (push) Has been cancelled
Backend Tests / Tests (server) (push) Has been cancelled
Backend Tests / Tests (store) (push) Has been cancelled
Build Canary Image / build-frontend (push) Has been cancelled
Build Canary Image / build-push (linux/amd64) (push) Has been cancelled
Build Canary Image / build-push (linux/arm64) (push) Has been cancelled
Build Canary Image / merge (push) Has been cancelled
Frontend Tests / Lint (push) Has been cancelled
Frontend Tests / Build (push) Has been cancelled
Proto Linter / Lint Protos (push) Has been cancelled
57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
package mcp
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/labstack/echo/v5"
|
|
"github.com/labstack/echo/v5/middleware"
|
|
mcpserver "github.com/mark3labs/mcp-go/server"
|
|
|
|
"github.com/usememos/memos/server/auth"
|
|
"github.com/usememos/memos/store"
|
|
)
|
|
|
|
type MCPService struct {
|
|
store *store.Store
|
|
authenticator *auth.Authenticator
|
|
}
|
|
|
|
func NewMCPService(store *store.Store, secret string) *MCPService {
|
|
return &MCPService{
|
|
store: store,
|
|
authenticator: auth.NewAuthenticator(store, secret),
|
|
}
|
|
}
|
|
|
|
func (s *MCPService) RegisterRoutes(echoServer *echo.Echo) {
|
|
mcpSrv := mcpserver.NewMCPServer("Memos", "1.0.0",
|
|
mcpserver.WithToolCapabilities(false),
|
|
)
|
|
s.registerMemoTools(mcpSrv)
|
|
s.registerTagTools(mcpSrv)
|
|
s.registerMemoResources(mcpSrv)
|
|
s.registerPrompts(mcpSrv)
|
|
|
|
httpHandler := mcpserver.NewStreamableHTTPServer(mcpSrv)
|
|
|
|
mcpGroup := echoServer.Group("")
|
|
mcpGroup.Use(middleware.CORSWithConfig(middleware.CORSConfig{
|
|
AllowOrigins: []string{"*"},
|
|
}))
|
|
mcpGroup.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
|
|
return func(c *echo.Context) error {
|
|
authHeader := c.Request().Header.Get("Authorization")
|
|
if authHeader != "" {
|
|
result := s.authenticator.Authenticate(c.Request().Context(), authHeader)
|
|
if result == nil {
|
|
return c.JSON(http.StatusUnauthorized, map[string]string{"message": "invalid or expired token"})
|
|
}
|
|
ctx := auth.ApplyToContext(c.Request().Context(), result)
|
|
c.SetRequest(c.Request().WithContext(ctx))
|
|
}
|
|
return next(c)
|
|
}
|
|
})
|
|
mcpGroup.Any("/mcp", echo.WrapHandler(httpHandler))
|
|
}
|