Commit d67e930
pkg/mcp/server.go
@@ -18,7 +18,6 @@ type Server struct {
capabilities ServerCapabilities
// Handler functions
- toolHandlers map[string]ToolHandler
toolDefinitions map[string]Tool
promptHandlers map[string]PromptHandler
promptDefinitions map[string]Prompt
@@ -37,7 +36,6 @@ type Server struct {
}
// Handler types
-type ToolHandler func(CallToolRequest) (CallToolResult, error)
type PromptHandler func(GetPromptRequest) (GetPromptResult, error)
type ResourceHandler func(ReadResourceRequest) (ReadResourceResult, error)
@@ -46,7 +44,6 @@ func NewServer(name, version string, tools []Tool, resources []Resource) *Server
server := &Server{
name: name,
version: version,
- toolHandlers: make(map[string]ToolHandler),
toolDefinitions: make(map[string]Tool),
promptHandlers: make(map[string]PromptHandler),
promptDefinitions: make(map[string]Prompt),
@@ -64,7 +61,6 @@ func NewServer(name, version string, tools []Tool, resources []Resource) *Server
}
for _, tool := range tools {
- server.toolHandlers[tool.Name] = tool.Handler
server.toolDefinitions[tool.Name] = tool
}
@@ -76,12 +72,10 @@ func NewServer(name, version string, tools []Tool, resources []Resource) *Server
return server
}
-
// RegisterToolWithDefinition registers a tool with its full definition and handler
func (s *Server) RegisterToolWithDefinition(tool Tool, handler ToolHandler) {
s.mu.Lock()
defer s.mu.Unlock()
- s.toolHandlers[tool.Name] = handler
s.toolDefinitions[tool.Name] = tool
}
@@ -310,14 +304,14 @@ func (s *Server) handleCallTool(req JSONRPCRequest) JSONRPCResponse {
}
s.mu.RLock()
- handler, exists := s.toolHandlers[callReq.Name]
+ tool, exists := s.toolDefinitions[callReq.Name]
s.mu.RUnlock()
if !exists {
return s.createErrorResponse(req.ID, MethodNotFound, "Tool not found")
}
- result, err := handler(callReq)
+ result, err := tool.Handler(callReq)
if err != nil {
return s.createErrorResponse(req.ID, InternalError, err.Error())
}
@@ -376,9 +370,9 @@ func (s *Server) handleReadResource(req JSONRPCRequest) JSONRPCResponse {
if !exists {
// Try to find a pattern-based handler (e.g., for "file://" prefix)
for pattern, h := range s.resourceHandlers {
- if pattern != "" && readReq.URI != pattern &&
- ((pattern == "file://" && strings.HasPrefix(readReq.URI, "file://")) ||
- (strings.HasSuffix(pattern, "*") && strings.HasPrefix(readReq.URI, strings.TrimSuffix(pattern, "*")))) {
+ if pattern != "" && readReq.URI != pattern &&
+ ((pattern == "file://" && strings.HasPrefix(readReq.URI, "file://")) ||
+ (strings.HasSuffix(pattern, "*") && strings.HasPrefix(readReq.URI, strings.TrimSuffix(pattern, "*")))) {
handler = h
exists = true
break
pkg/mcp/types.go
@@ -91,6 +91,8 @@ type ServerInfo struct {
}
// Tool types
+type ToolHandler func(CallToolRequest) (CallToolResult, error)
+
type Tool struct {
Name string `json:"name"`
Description string `json:"description"`