Akron | 90f6521 | 2025-06-12 14:32:55 +0200 | [diff] [blame] | 1 | package mcp |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "fmt" |
| 6 | |
| 7 | "github.com/mark3labs/mcp-go/mcp" |
| 8 | "github.com/mark3labs/mcp-go/server" |
| 9 | ) |
| 10 | |
| 11 | // Server wraps the mcp-go server with KorAP-specific functionality |
| 12 | type Server struct { |
| 13 | mcpServer *server.MCPServer |
| 14 | name string |
| 15 | version string |
| 16 | } |
| 17 | |
| 18 | // NewServer creates a new KorAP MCP server |
| 19 | func NewServer(name, version string) *Server { |
| 20 | mcpServer := server.NewMCPServer( |
| 21 | name, |
| 22 | version, |
| 23 | server.WithToolCapabilities(true), |
| 24 | ) |
| 25 | |
| 26 | return &Server{ |
| 27 | mcpServer: mcpServer, |
| 28 | name: name, |
| 29 | version: version, |
| 30 | } |
| 31 | } |
| 32 | |
| 33 | // AddTool registers a new tool with the server |
| 34 | func (s *Server) AddTool(name, description string, inputSchema map[string]interface{}, handler func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error)) error { |
| 35 | if name == "" { |
| 36 | return fmt.Errorf("tool name cannot be empty") |
| 37 | } |
| 38 | if description == "" { |
| 39 | return fmt.Errorf("tool description cannot be empty") |
| 40 | } |
| 41 | |
| 42 | // Create tool using mcp-go's NewTool function |
| 43 | tool := mcp.NewTool(name, mcp.WithDescription(description)) |
| 44 | |
| 45 | // Add the tool and handler to the MCP server |
| 46 | s.mcpServer.AddTool(tool, handler) |
| 47 | |
| 48 | return nil |
| 49 | } |
| 50 | |
| 51 | // Serve starts the MCP server using stdio transport |
| 52 | func (s *Server) Serve() error { |
| 53 | return server.ServeStdio(s.mcpServer) |
| 54 | } |
| 55 | |
| 56 | // GetMCPServer returns the underlying mcp-go server for advanced usage |
| 57 | func (s *Server) GetMCPServer() *server.MCPServer { |
| 58 | return s.mcpServer |
| 59 | } |
| 60 | |
| 61 | // GetServerInfo returns server information |
| 62 | func (s *Server) GetServerInfo() (string, string) { |
| 63 | return s.name, s.version |
| 64 | } |