| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- // Code generated by `go generate`. DO NOT EDIT.
- // source: server/internal/gen/request_handler.go.tmpl
- package server
- import (
- "context"
- "encoding/json"
- "fmt"
- "net/http"
- "github.com/mark3labs/mcp-go/mcp"
- )
- // HandleMessage processes an incoming JSON-RPC message and returns an appropriate response
- func (s *MCPServer) HandleMessage(
- ctx context.Context,
- message json.RawMessage,
- ) mcp.JSONRPCMessage {
- // Add server to context
- ctx = context.WithValue(ctx, serverKey{}, s)
- var err *requestError
- var baseMessage struct {
- JSONRPC string `json:"jsonrpc"`
- Method mcp.MCPMethod `json:"method"`
- ID any `json:"id,omitempty"`
- Result any `json:"result,omitempty"`
- }
- if err := json.Unmarshal(message, &baseMessage); err != nil {
- return createErrorResponse(
- nil,
- mcp.PARSE_ERROR,
- "Failed to parse message",
- )
- }
- // Check for valid JSONRPC version
- if baseMessage.JSONRPC != mcp.JSONRPC_VERSION {
- return createErrorResponse(
- baseMessage.ID,
- mcp.INVALID_REQUEST,
- "Invalid JSON-RPC version",
- )
- }
- if baseMessage.ID == nil {
- var notification mcp.JSONRPCNotification
- if err := json.Unmarshal(message, ¬ification); err != nil {
- return createErrorResponse(
- nil,
- mcp.PARSE_ERROR,
- "Failed to parse notification",
- )
- }
- s.handleNotification(ctx, notification)
- return nil // Return nil for notifications
- }
- if baseMessage.Result != nil {
- // this is a response to a request sent by the server (e.g. from a ping
- // sent due to WithKeepAlive option)
- return nil
- }
- handleErr := s.hooks.onRequestInitialization(ctx, baseMessage.ID, message)
- if handleErr != nil {
- return createErrorResponse(
- baseMessage.ID,
- mcp.INVALID_REQUEST,
- handleErr.Error(),
- )
- }
- // Get request header from ctx
- h := ctx.Value(requestHeader)
- headers, ok := h.(http.Header)
- if headers == nil || !ok {
- headers = make(http.Header)
- }
- switch baseMessage.Method {
- case mcp.MethodInitialize:
- var request mcp.InitializeRequest
- var result *mcp.InitializeResult
- if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeInitialize(ctx, baseMessage.ID, &request)
- result, err = s.handleInitialize(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterInitialize(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodPing:
- var request mcp.PingRequest
- var result *mcp.EmptyResult
- if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforePing(ctx, baseMessage.ID, &request)
- result, err = s.handlePing(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterPing(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodSetLogLevel:
- var request mcp.SetLevelRequest
- var result *mcp.EmptyResult
- if s.capabilities.logging == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("logging %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeSetLevel(ctx, baseMessage.ID, &request)
- result, err = s.handleSetLevel(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterSetLevel(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodResourcesList:
- var request mcp.ListResourcesRequest
- var result *mcp.ListResourcesResult
- if s.capabilities.resources == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("resources %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeListResources(ctx, baseMessage.ID, &request)
- result, err = s.handleListResources(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterListResources(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodResourcesTemplatesList:
- var request mcp.ListResourceTemplatesRequest
- var result *mcp.ListResourceTemplatesResult
- if s.capabilities.resources == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("resources %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeListResourceTemplates(ctx, baseMessage.ID, &request)
- result, err = s.handleListResourceTemplates(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterListResourceTemplates(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodResourcesRead:
- var request mcp.ReadResourceRequest
- var result *mcp.ReadResourceResult
- if s.capabilities.resources == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("resources %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeReadResource(ctx, baseMessage.ID, &request)
- result, err = s.handleReadResource(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterReadResource(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodPromptsList:
- var request mcp.ListPromptsRequest
- var result *mcp.ListPromptsResult
- if s.capabilities.prompts == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("prompts %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeListPrompts(ctx, baseMessage.ID, &request)
- result, err = s.handleListPrompts(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterListPrompts(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodPromptsGet:
- var request mcp.GetPromptRequest
- var result *mcp.GetPromptResult
- if s.capabilities.prompts == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("prompts %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeGetPrompt(ctx, baseMessage.ID, &request)
- result, err = s.handleGetPrompt(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterGetPrompt(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodToolsList:
- var request mcp.ListToolsRequest
- var result *mcp.ListToolsResult
- if s.capabilities.tools == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("tools %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeListTools(ctx, baseMessage.ID, &request)
- result, err = s.handleListTools(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterListTools(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- case mcp.MethodToolsCall:
- var request mcp.CallToolRequest
- var result *mcp.CallToolResult
- if s.capabilities.tools == nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.METHOD_NOT_FOUND,
- err: fmt.Errorf("tools %w", ErrUnsupported),
- }
- } else if unmarshalErr := json.Unmarshal(message, &request); unmarshalErr != nil {
- err = &requestError{
- id: baseMessage.ID,
- code: mcp.INVALID_REQUEST,
- err: &UnparsableMessageError{message: message, err: unmarshalErr, method: baseMessage.Method},
- }
- } else {
- request.Header = headers
- s.hooks.beforeCallTool(ctx, baseMessage.ID, &request)
- result, err = s.handleToolCall(ctx, baseMessage.ID, request)
- }
- if err != nil {
- s.hooks.onError(ctx, baseMessage.ID, baseMessage.Method, &request, err)
- return err.ToJSONRPCError()
- }
- s.hooks.afterCallTool(ctx, baseMessage.ID, &request, result)
- return createResponse(baseMessage.ID, *result)
- default:
- return createErrorResponse(
- baseMessage.ID,
- mcp.METHOD_NOT_FOUND,
- fmt.Sprintf("Method %s not found", baseMessage.Method),
- )
- }
- }
|