generated from rmcguire/go-server-with-otel
move to generated mcp for econet
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
Package econetmcpgen exposes an MCP server, mounted as an HTTP handler at
|
||||
/api/mcp, whose tools are generated from the EconetService proto by
|
||||
protoc-gen-go-mcp and forwarded to the in-process gRPC server.
|
||||
|
||||
It is the generated-code counterpart to econetmcp (which hand-writes a single
|
||||
list_water_heaters tool). Both expose an identical package API, so switching
|
||||
between them is a one-line import change in pkg/econet/econet.go.
|
||||
*/
|
||||
package econetmcpgen
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/http/opts"
|
||||
"github.com/modelcontextprotocol/go-sdk/mcp"
|
||||
"github.com/redpanda-data/protoc-gen-go-mcp/pkg/runtime/gosdk"
|
||||
"github.com/rs/zerolog"
|
||||
|
||||
v1alpha1mcp "gitea.libretechconsulting.com/rmcguire/econet-exporter/api/econet/v1alpha1/v1alpha1mcp"
|
||||
"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 {
|
||||
// Register the generated tools against the in-process gRPC server via the
|
||||
// go-sdk adapter, so the generated code shares our configured *mcp.Server.
|
||||
v1alpha1mcp.RegisterEconetServiceHandler(gosdk.Wrap(m.server), m.econetGRPC)
|
||||
|
||||
handler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server {
|
||||
return m.server
|
||||
}, &mcp.StreamableHTTPOptions{})
|
||||
|
||||
m.log.Debug().Msg("Econet MCP tools ready (generated)")
|
||||
|
||||
return []opts.HTTPHandler{
|
||||
{
|
||||
Prefix: "/api/mcp",
|
||||
Handler: handler,
|
||||
},
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user