/* Package econetmcp exposes an MCP server, mounted as an HTTP handler at /api/mcp, whose tools wrap the EconetService gRPC API. */ package econetmcp import ( "context" "net/http" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/http/opts" "github.com/modelcontextprotocol/go-sdk/mcp" "github.com/rs/zerolog" "gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/config" "gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetgrpc" ) var EconetMCPImpl = &mcp.Implementation{ Name: "Econet MCP Server", Title: "Econet Exporter MCP", } type EconetMCPServer struct { ctx context.Context cfg *config.ServiceConfig log *zerolog.Logger server *mcp.Server econetGRPC *econetgrpc.EconetGRPCServer } func NewEconetMCPServer(ctx context.Context, cfg *config.ServiceConfig, grpc *econetgrpc.EconetGRPCServer, ) *EconetMCPServer { return &EconetMCPServer{ ctx: ctx, cfg: cfg, log: zerolog.Ctx(ctx), econetGRPC: grpc, server: mcp.NewServer(EconetMCPImpl, &mcp.ServerOptions{ Instructions: "Use these tools to inspect Rheem EcoNet water heaters: " + "current mode, setpoint, hot water availability, connectivity, and alerts.", HasTools: true, }), } } func (m *EconetMCPServer) GetHandlers() []opts.HTTPHandler { // NOTE: Add other tools here m.addListDevicesTool() handler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server { return m.server }, &mcp.StreamableHTTPOptions{}) m.log.Debug().Msg("Econet MCP tools ready") return []opts.HTTPHandler{ { Prefix: "/api/mcp", Handler: handler, }, } }