2026-05-12 07:58:19 +00:00
|
|
|
package app
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
2026-05-12 08:18:35 +00:00
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
"strings"
|
2026-05-12 07:58:19 +00:00
|
|
|
|
|
|
|
|
"github.com/mark3labs/mcp-go/server"
|
|
|
|
|
|
|
|
|
|
"forge.lclr.dev/AI/xdebug-mcp/internal/cache"
|
|
|
|
|
"forge.lclr.dev/AI/xdebug-mcp/internal/tools"
|
|
|
|
|
"forge.lclr.dev/AI/xdebug-mcp/mcpgen"
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-12 08:18:35 +00:00
|
|
|
func Run(_ context.Context, args []string, version string) error {
|
2026-05-12 07:58:19 +00:00
|
|
|
c := cache.New(cache.DefaultCapacity)
|
2026-05-12 08:18:35 +00:00
|
|
|
return dispatch(args, version, c, os.Stdout)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func dispatch(args []string, version string, c *cache.Cache, stdout io.Writer) error {
|
|
|
|
|
cmd := "mcp"
|
|
|
|
|
if len(args) > 0 {
|
|
|
|
|
cmd = strings.TrimSpace(args[0])
|
|
|
|
|
}
|
2026-05-12 07:58:19 +00:00
|
|
|
|
2026-05-12 08:18:35 +00:00
|
|
|
switch cmd {
|
|
|
|
|
case "", "mcp":
|
|
|
|
|
return runMCP(c, version)
|
|
|
|
|
case "version":
|
|
|
|
|
_, err := fmt.Fprintln(stdout, version)
|
|
|
|
|
return err
|
|
|
|
|
case "help", "-h", "--help":
|
|
|
|
|
_, err := fmt.Fprintf(stdout,
|
|
|
|
|
"%s\n\nUsage:\n %s [command]\n\nCommands:\n mcp Run the MCP server (default)\n version Print the version\n\nOptions:\n -h, --help Show this help\n",
|
|
|
|
|
mcpgen.DefaultDescription,
|
|
|
|
|
mcpgen.BinaryName,
|
|
|
|
|
)
|
|
|
|
|
return err
|
|
|
|
|
default:
|
|
|
|
|
return fmt.Errorf("unknown command %q — run '%s --help' for usage", cmd, mcpgen.BinaryName)
|
|
|
|
|
}
|
2026-05-12 07:58:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func runMCP(c *cache.Cache, version string) error {
|
|
|
|
|
s := server.NewMCPServer(mcpgen.BinaryName, version)
|
|
|
|
|
s.AddTool(tools.AnalyzeTool(), tools.AnalyzeHandler(c))
|
|
|
|
|
s.AddTool(tools.CallersTool(), tools.CallersHandler(c))
|
|
|
|
|
s.AddTool(tools.CalleesTool(), tools.CalleesHandler(c))
|
|
|
|
|
return server.ServeStdio(s)
|
|
|
|
|
}
|