move to generated mcp for econet

This commit is contained in:
2026-07-16 15:02:17 -04:00
parent 18e9cbecea
commit 22137e7ebe
8 changed files with 424 additions and 6 deletions
+5 -1
View File
@@ -16,7 +16,11 @@ import (
"gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/config"
"gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetclient"
"gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetgrpc"
"gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetmcp"
// MCP server. Aliased so switching implementations is a one-line change.
// Generated (protoc-gen-go-mcp) tools:
econetmcp "gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetmcpgen"
// Hand-written tools (switch back by using this import instead):
// econetmcp "gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetmcp"
"gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/econet/econetmetrics"
"gitea.libretechconsulting.com/rmcguire/econet-exporter/pkg/service"
)
+72
View File
@@ -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,
},
}
}