61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package demomcp
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
"k8s.io/utils/ptr"
|
|
|
|
demo "gitea.libretechconsulting.com/rmcguire/go-server-with-otel/api/demo/app/v1alpha1"
|
|
)
|
|
|
|
var DemoTool = &mcp.Tool{
|
|
Name: "Demo Tool",
|
|
Title: "Demo Random Fact Tool",
|
|
Description: "Returns a random fact for demo or boredom purposes",
|
|
Annotations: &mcp.ToolAnnotations{
|
|
ReadOnlyHint: true,
|
|
OpenWorldHint: ptr.To(true),
|
|
},
|
|
}
|
|
|
|
type DemoToolParams struct {
|
|
Language string `json:"language,omitempty" jsonschema:"Random Fact Language Abbreviation (e.g. en)"`
|
|
}
|
|
|
|
func (d *DemoMCPServer) addDemoRandomFactTool() {
|
|
d.server.AddTool(
|
|
mcp.ToolFor(DemoTool, d.demoToolHandler),
|
|
)
|
|
}
|
|
|
|
func (d *DemoMCPServer) demoToolHandler(ctx context.Context, req *mcp.CallToolRequest, args *DemoToolParams) (
|
|
*mcp.CallToolResult, any, error,
|
|
) {
|
|
d.log.Debug().Str("language", args.Language).Msg("demo fact tool called")
|
|
|
|
fact, err := d.demoGRPC.GetDemo(ctx, &demo.GetDemoRequest{
|
|
Language: &args.Language,
|
|
})
|
|
if err != nil {
|
|
return &mcp.CallToolResult{
|
|
IsError: true,
|
|
Meta: mcp.Meta{
|
|
"error": err,
|
|
},
|
|
}, nil, err
|
|
}
|
|
|
|
return &mcp.CallToolResult{
|
|
Meta: mcp.Meta{
|
|
"language": fact.GetLanguage(),
|
|
"source": fact.GetSource(),
|
|
},
|
|
Content: []mcp.Content{
|
|
&mcp.TextContent{
|
|
Text: fact.GetFact(),
|
|
},
|
|
},
|
|
}, nil, nil
|
|
}
|