generated from rmcguire/go-server-with-otel
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
/*
|
|
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,
|
|
},
|
|
}
|
|
}
|