blob: b6d7b1094366451dfff8892df7221739106402ad [file] [log] [blame]
Akron90f65212025-06-12 14:32:55 +02001package mcp
2
3import (
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
12type Server struct {
13 mcpServer *server.MCPServer
14 name string
15 version string
16}
17
18// NewServer creates a new KorAP MCP server
19func 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
34func (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
52func (s *Server) Serve() error {
53 return server.ServeStdio(s.mcpServer)
54}
55
56// GetMCPServer returns the underlying mcp-go server for advanced usage
57func (s *Server) GetMCPServer() *server.MCPServer {
58 return s.mcpServer
59}
60
61// GetServerInfo returns server information
62func (s *Server) GetServerInfo() (string, string) {
63 return s.name, s.version
64}