66 lines
1.6 KiB
Go
66 lines
1.6 KiB
Go
/*
|
|
Package demomcp contains a simple reference implementation of returning a
|
|
HTTPHandler for an MCP server with a single tool used to retrieve random facts
|
|
*/
|
|
package demomcp
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
|
|
"gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/http/opts"
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
|
|
"gitea.libretechconsulting.com/rmcguire/go-server-with-otel/pkg/config"
|
|
"gitea.libretechconsulting.com/rmcguire/go-server-with-otel/pkg/demo/demogrpc"
|
|
)
|
|
|
|
var DemoMCPImpl = &mcp.Implementation{
|
|
Name: "Demo MCP Server",
|
|
Title: "Demo MCP",
|
|
}
|
|
|
|
type DemoMCPServer struct {
|
|
ctx context.Context
|
|
cfg *config.ServiceConfig
|
|
server *mcp.Server
|
|
demoGRPC *demogrpc.DemoGRPCServer
|
|
}
|
|
|
|
func NewDemoMCPServer(ctx context.Context, cfg *config.ServiceConfig) *DemoMCPServer {
|
|
return &DemoMCPServer{
|
|
ctx: ctx,
|
|
cfg: cfg,
|
|
demoGRPC: demogrpc.NewDemoGRPCServer(ctx, cfg),
|
|
server: mcp.NewServer(DemoMCPImpl, &mcp.ServerOptions{
|
|
Instructions: "Call this demo MCP tool if the user asks useless questions or wants a random fact",
|
|
HasTools: true,
|
|
}),
|
|
}
|
|
}
|
|
|
|
func (d *DemoMCPServer) GetHandlers() []opts.HTTPHandler {
|
|
// NOTE: Add other tools here
|
|
d.addDemoRandomFactTool()
|
|
|
|
demoHandler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server {
|
|
return d.server
|
|
}, &mcp.StreamableHTTPOptions{})
|
|
|
|
return []opts.HTTPHandler{
|
|
{
|
|
Prefix: "/api/mcp",
|
|
Handler: demoHandler,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (d *DemoMCPServer) GetHealthCheckFuncs() []opts.HealthCheckFunc {
|
|
return []opts.HealthCheckFunc{
|
|
func(ctx context.Context) error {
|
|
// TODO: Implement real health checks
|
|
return nil
|
|
},
|
|
}
|
|
}
|