1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| package mcpserver
import ( "context" "encoding/base64"
"github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" "github.com/samber/lo"
"{{{ .Package }}}/app" "{{{ .Package }}}/app/util" )
type Resource struct { Name string `json:"name"` Description string `json:"description,omitzero"` Icon string `json:"icon,omitzero"` URI string `json:"uri"` MIMEType string `json:"mimeType"` Content string `json:"content"` Binary bool `json:"binary,omitzero"` }
func NewTextResource(name string, description string, uri string, mimeType string, content string) *Resource { if mimeType == "" { mimeType = util.MIMETypeJSON } return &Resource{Name: name, Description: description, URI: uri, MIMEType: mimeType, Content: content} }
func NewBlobResource(name string, description string, uri string, mimeType string, content []byte) *Resource { if mimeType == "" { mimeType = util.MIMETypeJSON } out := base64.StdEncoding.EncodeToString(content) return &Resource{Name: name, Description: description, URI: uri, MIMEType: mimeType, Content: out, Binary: true} }
func (r *Resource) ToMCP() (mcp.Resource, error) { return mcp.NewResource(r.URI, r.Name, mcp.WithResourceDescription(r.Description)), nil }
func (r *Resource) IconSafe() string { return util.Choose(r.Icon == "", "file", r.Icon) }
func (r *Resource) Extension() string { return util.ExtensionFromMIME(r.MIMEType) }
func (r *Resource) Handler(as *app.State, logger util.Logger) server.ResourceHandlerFunc { return func(ctx context.Context, req mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) { var ret []mcp.ResourceContents if r.Binary { ret = append(ret, mcp.BlobResourceContents{URI: r.URI, MIMEType: r.MIMEType, Blob: r.Content}) } else { ret = append(ret, mcp.TextResourceContents{URI: r.URI, MIMEType: r.MIMEType, Text: r.Content}) } return ret, nil } }
type Resources []*Resource
func (r Resources) Get(n string) *Resource { return lo.FindOrElse(r, nil, func(x *Resource) bool { return x.Name == n }) }
func (s *Server) AddResources(as *app.State, logger util.Logger, resources ...*Resource) error { for _, r := range resources { s.Resources = append(s.Resources, r) m, err := r.ToMCP() if err != nil { return err } s.MCP.AddResource(m, r.Handler(as, logger)) } return nil }
|