Skip to content

Commit b6b83cf

Browse files
authored
Merge pull request docker#248 from docker/mcpt-217-add-metadata-to-snapshot
Add metadata to snapshot
2 parents 2e8d233 + 82ab4c4 commit b6b83cf

File tree

2 files changed

+80
-19
lines changed

2 files changed

+80
-19
lines changed

pkg/catalog/types.go

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,36 @@ type topLevel struct {
1515
// MCP Servers
1616

1717
type Server struct {
18-
Name string `yaml:"name,omitempty" json:"name,omitempty"`
19-
Type string `yaml:"type" json:"type"`
20-
Image string `yaml:"image" json:"image"`
21-
Description string `yaml:"description,omitempty" json:"description,omitempty"`
22-
Title string `yaml:"title,omitempty" json:"title,omitempty"`
23-
LongLived bool `yaml:"longLived,omitempty" json:"longLived,omitempty"`
24-
Remote Remote `yaml:"remote" json:"remote"`
25-
SSEEndpoint string `yaml:"sseEndpoint,omitempty" json:"sseEndpoint,omitempty"` // Deprecated: Use Remote instead
26-
OAuth *OAuth `yaml:"oauth,omitempty" json:"oauth,omitempty"`
27-
Secrets []Secret `yaml:"secrets,omitempty" json:"secrets,omitempty"`
28-
Env []Env `yaml:"env,omitempty" json:"env,omitempty"`
29-
Command []string `yaml:"command,omitempty" json:"command,omitempty"`
30-
Volumes []string `yaml:"volumes,omitempty" json:"volumes,omitempty"`
31-
User string `yaml:"user,omitempty" json:"user,omitempty"`
32-
DisableNetwork bool `yaml:"disableNetwork,omitempty" json:"disableNetwork,omitempty"`
33-
AllowHosts []string `yaml:"allowHosts,omitempty" json:"allowHosts,omitempty"`
34-
Tools []Tool `yaml:"tools,omitempty" json:"tools,omitempty"`
35-
Config []any `yaml:"config,omitempty" json:"config,omitempty"`
36-
Prefix string `yaml:"prefix,omitempty" json:"prefix,omitempty"`
18+
Name string `yaml:"name,omitempty" json:"name,omitempty"`
19+
Type string `yaml:"type" json:"type"`
20+
Image string `yaml:"image" json:"image"`
21+
Description string `yaml:"description,omitempty" json:"description,omitempty"`
22+
Title string `yaml:"title,omitempty" json:"title,omitempty"`
23+
LongLived bool `yaml:"longLived,omitempty" json:"longLived,omitempty"`
24+
Remote Remote `yaml:"remote" json:"remote"`
25+
SSEEndpoint string `yaml:"sseEndpoint,omitempty" json:"sseEndpoint,omitempty"` // Deprecated: Use Remote instead
26+
OAuth *OAuth `yaml:"oauth,omitempty" json:"oauth,omitempty"`
27+
Secrets []Secret `yaml:"secrets,omitempty" json:"secrets,omitempty"`
28+
Env []Env `yaml:"env,omitempty" json:"env,omitempty"`
29+
Command []string `yaml:"command,omitempty" json:"command,omitempty"`
30+
Volumes []string `yaml:"volumes,omitempty" json:"volumes,omitempty"`
31+
User string `yaml:"user,omitempty" json:"user,omitempty"`
32+
DisableNetwork bool `yaml:"disableNetwork,omitempty" json:"disableNetwork,omitempty"`
33+
AllowHosts []string `yaml:"allowHosts,omitempty" json:"allowHosts,omitempty"`
34+
Tools []Tool `yaml:"tools,omitempty" json:"tools,omitempty"`
35+
Config []any `yaml:"config,omitempty" json:"config,omitempty"`
36+
Prefix string `yaml:"prefix,omitempty" json:"prefix,omitempty"`
37+
Metadata *Metadata `yaml:"metadata,omitempty" json:"metadata,omitempty"`
38+
}
39+
40+
type Metadata struct {
41+
Pulls int `yaml:"pulls,omitempty" json:"pulls,omitempty"`
42+
Stars int `yaml:"stars,omitempty" json:"stars,omitempty"`
43+
GithubStars int `yaml:"githubStars,omitempty" json:"githubStars,omitempty"`
44+
Category string `yaml:"category,omitempty" json:"category,omitempty"`
45+
Tags []string `yaml:"tags,omitempty" json:"tags,omitempty"`
46+
License string `yaml:"license,omitempty" json:"license,omitempty"`
47+
Owner string `yaml:"owner,omitempty" json:"owner,omitempty"`
3748
}
3849

3950
func (s *Server) IsOAuthServer() bool {

pkg/workingset/workingset_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -634,6 +634,47 @@ type: remote`,
634634
},
635635
},
636636
},
637+
{
638+
name: "image with full metadata including pulls and owner",
639+
server: Server{
640+
Type: ServerTypeImage,
641+
Image: "testimage:v1.0",
642+
},
643+
labels: map[string]string{
644+
"io.docker.server.metadata": `name: GitHub Server
645+
type: server
646+
image: testimage:v1.0
647+
description: Official GitHub MCP Server
648+
title: GitHub Official
649+
metadata:
650+
pulls: 42055
651+
githubStars: 24479
652+
category: devops
653+
tags:
654+
- github
655+
- devops
656+
license: MIT License
657+
owner: github`,
658+
},
659+
expectError: false,
660+
expected: &ServerSnapshot{
661+
Server: catalog.Server{
662+
Name: "GitHub Server",
663+
Type: "server",
664+
Image: "testimage:v1.0",
665+
Description: "Official GitHub MCP Server",
666+
Title: "GitHub Official",
667+
Metadata: &catalog.Metadata{
668+
Pulls: 42055,
669+
GithubStars: 24479,
670+
Category: "devops",
671+
Tags: []string{"github", "devops"},
672+
License: "MIT License",
673+
Owner: "github",
674+
},
675+
},
676+
},
677+
},
637678
}
638679

639680
for _, tt := range tests {
@@ -671,6 +712,15 @@ type: remote`,
671712
if tt.expected.Server.Description != "" {
672713
assert.Equal(t, tt.expected.Server.Description, snapshot.Server.Description)
673714
}
715+
if tt.expected.Server.Metadata != nil {
716+
require.NotNil(t, snapshot.Server.Metadata)
717+
assert.Equal(t, tt.expected.Server.Metadata.Pulls, snapshot.Server.Metadata.Pulls)
718+
assert.Equal(t, tt.expected.Server.Metadata.GithubStars, snapshot.Server.Metadata.GithubStars)
719+
assert.Equal(t, tt.expected.Server.Metadata.Category, snapshot.Server.Metadata.Category)
720+
assert.Equal(t, tt.expected.Server.Metadata.Tags, snapshot.Server.Metadata.Tags)
721+
assert.Equal(t, tt.expected.Server.Metadata.License, snapshot.Server.Metadata.License)
722+
assert.Equal(t, tt.expected.Server.Metadata.Owner, snapshot.Server.Metadata.Owner)
723+
}
674724
}
675725
})
676726
}

0 commit comments

Comments
 (0)