blob: 0cf7fb3c7fcaf776d2fab08dd4decd55c9c6f73e [file] [log] [blame]
Akron90f65212025-06-12 14:32:55 +02001package main
2
3import (
4 "context"
5 "fmt"
6 "os"
7
8 "github.com/korap/korap-mcp/mcp"
9 mcplib "github.com/mark3labs/mcp-go/mcp"
10)
11
12// Run is the default command that starts the MCP server
13func (c *CLI) Run() error {
14 // Handle version flag
15 if c.Version {
16 fmt.Printf("%s version %s\n", c.GetServerName(), c.GetServerVersion())
17 os.Exit(0)
18 }
19
20 // Validate configuration and setup logging
21 logger, err := c.ValidateAndSetupLogging()
22 if err != nil {
23 return err
24 }
25
26 logger.Info().
27 Str("version", c.GetServerVersion()).
28 Str("korap_url", c.KorAP.BaseURL).
29 Bool("oauth_enabled", c.OAuth.Enabled).
30 Msg("KorAP MCP Server starting...")
31
32 // Create MCP server
33 server := mcp.NewServer(c.GetServerName(), c.GetServerVersion())
34
35 // Add a simple ping tool for testing
36 err = server.AddTool(
37 "ping",
38 "Simple ping tool to test server connectivity",
39 map[string]interface{}{
40 "type": "object",
41 "properties": map[string]interface{}{
42 "message": map[string]interface{}{
43 "type": "string",
44 "description": "Message to echo back",
45 },
46 },
47 },
48 func(ctx context.Context, request mcplib.CallToolRequest) (*mcplib.CallToolResult, error) {
49 message, err := request.RequireString("message")
50 if err != nil {
51 message = "pong"
52 }
53 logger.Debug().
54 Str("message", message).
55 Msg("Ping tool called")
56 return mcplib.NewToolResultText(fmt.Sprintf("KorAP Server response: %s", message)), nil
57 },
58 )
59
60 if err != nil {
61 return fmt.Errorf("failed to add ping tool: %w", err)
62 }
63
64 logger.Info().Msg("Server ready - serving MCP via stdio")
65
66 // Start the MCP server
67 if err := server.Serve(); err != nil {
68 return fmt.Errorf("server error: %w", err)
69 }
70
71 return nil
72}
73
74func main() {
75 // Setup CLI and parser
76 cli, parser, err := SetupCLI()
77 if err != nil {
78 fmt.Fprintf(os.Stderr, "Failed to setup CLI: %v\n", err)
79 os.Exit(1)
80 }
81
82 // Parse command line arguments and run
83 ctx, err := parser.Parse(os.Args[1:])
84 if err != nil {
85 parser.FatalIfErrorf(err)
86 }
87
88 // Run the appropriate command (default or subcommand)
89 err = ctx.Run(cli)
90 ctx.FatalIfErrorf(err)
91}