Skip to content

Commit e007143

Browse files
authored
Merge pull request #211 from docker/add-mcp-workingset-servers
Add server search feature to workingsets
2 parents f788f54 + 688c46a commit e007143

File tree

5 files changed

+1948
-0
lines changed

5 files changed

+1948
-0
lines changed

cmd/docker-mcp/commands/workingset.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func workingSetCommand() *cobra.Command {
2121
cmd.AddCommand(importWorkingSetCommand())
2222
cmd.AddCommand(showWorkingSetCommand())
2323
cmd.AddCommand(listWorkingSetsCommand())
24+
cmd.AddCommand(serversCommand())
2425
cmd.AddCommand(pushWorkingSetCommand())
2526
cmd.AddCommand(pullWorkingSetCommand())
2627
cmd.AddCommand(createWorkingSetCommand())
@@ -199,3 +200,55 @@ func removeWorkingSetCommand() *cobra.Command {
199200
},
200201
}
201202
}
203+
204+
func serversCommand() *cobra.Command {
205+
var opts struct {
206+
WorkingSetID string
207+
Filter string
208+
Format string
209+
}
210+
211+
cmd := &cobra.Command{
212+
Use: "servers",
213+
Short: "List servers across working sets",
214+
Long: `List all servers grouped by working set.
215+
216+
Use --filter to search for servers matching a query (case-insensitive substring matching on image names or source URLs).
217+
Use --workingset to show servers only from a specific working set.`,
218+
Example: ` # List all servers across all working sets
219+
docker mcp workingset servers
220+
221+
# Filter servers by name
222+
docker mcp workingset servers --filter github
223+
224+
# Show servers from a specific working set
225+
docker mcp workingset servers --workingset my-dev-env
226+
227+
# Combine filter and working set
228+
docker mcp workingset servers --workingset my-dev-env --filter slack
229+
230+
# Output in JSON format
231+
docker mcp workingset servers --format json`,
232+
Args: cobra.NoArgs,
233+
RunE: func(cmd *cobra.Command, _ []string) error {
234+
supported := slices.Contains(workingset.SupportedFormats(), opts.Format)
235+
if !supported {
236+
return fmt.Errorf("unsupported format: %s", opts.Format)
237+
}
238+
239+
dao, err := db.New()
240+
if err != nil {
241+
return err
242+
}
243+
244+
return workingset.Servers(cmd.Context(), dao, opts.Filter, opts.WorkingSetID, workingset.OutputFormat(opts.Format))
245+
},
246+
}
247+
248+
flags := cmd.Flags()
249+
flags.StringVarP(&opts.WorkingSetID, "workingset", "w", "", "Show servers only from specified working set")
250+
flags.StringVar(&opts.Filter, "filter", "", "Filter servers by image name or source URL")
251+
flags.StringVar(&opts.Format, "format", string(workingset.OutputFormatHumanReadable), fmt.Sprintf("Supported: %s.", strings.Join(workingset.SupportedFormats(), ", ")))
252+
253+
return cmd
254+
}

pkg/db/workingset.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type WorkingSetDAO interface {
1414
CreateWorkingSet(ctx context.Context, workingSet WorkingSet) error
1515
UpdateWorkingSet(ctx context.Context, workingSet WorkingSet) error
1616
RemoveWorkingSet(ctx context.Context, id string) error
17+
SearchWorkingSets(ctx context.Context, query string, workingSetID string) ([]WorkingSet, error)
1718
}
1819

1920
type ServerList []Server
@@ -134,3 +135,26 @@ func (d *dao) ListWorkingSets(ctx context.Context) ([]WorkingSet, error) {
134135
}
135136
return workingSets, nil
136137
}
138+
139+
func (d *dao) SearchWorkingSets(ctx context.Context, query string, workingSetID string) ([]WorkingSet, error) {
140+
sqlQuery := `
141+
SELECT id, name, servers, secrets
142+
FROM working_set
143+
WHERE ($1 = '' OR id = $1)
144+
AND ($2 = '' OR EXISTS (
145+
SELECT 1
146+
FROM json_each(servers)
147+
WHERE LOWER(json_extract(value, '$.image')) LIKE '%' || LOWER($2) || '%'
148+
OR LOWER(json_extract(value, '$.source')) LIKE '%' || LOWER($2) || '%'
149+
))
150+
ORDER BY id
151+
`
152+
args := []any{workingSetID, query}
153+
154+
var workingSets []WorkingSet
155+
err := d.db.SelectContext(ctx, &workingSets, sqlQuery, args...)
156+
if err != nil {
157+
return nil, err
158+
}
159+
return workingSets, nil
160+
}

0 commit comments

Comments
 (0)