@@ -13,6 +13,8 @@ Profiles are decoupled from catalogs, meaning the servers in a profile can come
1313- ** MCP Registry references** : HTTP(S) URLs pointing to servers in the Model Context Protocol registry
1414- ** OCI image references** : Docker images with the ` docker:// ` prefix
1515
16+ ⚠️ ** Important Caveat:** MCP Registry references are not fully implemented and are not expected to work yet.
17+
1618## Enabling Profiles
1719
1820Profiles are a feature that must be enabled first:
@@ -64,6 +66,107 @@ docker mcp profile create --name "My Servers" --id my-servers \
6466 - ` docker:// ` prefix for OCI images
6567 - ` http:// ` or ` https:// ` URLs for MCP Registry references
6668
69+ ### Adding Servers to a Profile
70+
71+ After creating a profile, you can add more servers to it:
72+
73+ ``` bash
74+ # Add servers with OCI references
75+ docker mcp profile server add dev-tools \
76+ --server docker://mcp/github:latest \
77+ --server docker://mcp/slack:latest
78+
79+ # Add servers with MCP Registry references
80+ docker mcp profile server add dev-tools \
81+ --server https://registry.modelcontextprotocol.io/v0/servers/71de5a2a-6cfb-4250-a196-f93080ecc860
82+
83+ # Mix MCP Registry references and OCI references
84+ docker mcp profile server add dev-tools \
85+ --server https://registry.modelcontextprotocol.io/v0/servers/71de5a2a-6cfb-4250-a196-f93080ecc860 \
86+ --server docker://mcp/github:latest
87+
88+ # Add servers from a catalog
89+ docker mcp profile server add dev-tools \
90+ --catalog my-catalog \
91+ --catalog-server github \
92+ --catalog-server slack
93+
94+ # Mix catalog servers with direct server references
95+ docker mcp profile server add dev-tools \
96+ --catalog my-catalog \
97+ --catalog-server github \
98+ --server docker://mcp/slack:latest
99+ ```
100+
101+ ** Server References:**
102+ - Use ` --server ` flag for direct server references (can be specified multiple times)
103+ - Server references must start with:
104+ - ` docker:// ` for OCI images
105+ - ` http:// ` or ` https:// ` for MCP Registry URLs
106+ - Use ` --catalog ` with ` --catalog-server ` to add servers from a catalog
107+ - Catalog servers are referenced by their name within the catalog
108+
109+ ** Notes:**
110+ - You can add multiple servers in a single command
111+ - You can mix direct server references with catalog-based references
112+ - If a server already exists in the profile, the operation will skip it or update it
113+
114+ ### Removing Servers from a Profile
115+
116+ Remove servers from a profile by their server name:
117+
118+ ``` bash
119+ # Remove servers by name
120+ docker mcp profile server remove dev-tools \
121+ --name github \
122+ --name slack
123+
124+ # Remove a single server
125+ docker mcp profile server remove dev-tools --name github
126+
127+ # Using alias
128+ docker mcp profile server rm dev-tools --name github
129+ ```
130+
131+ ** Server Names:**
132+ - Use ` --name ` flag to specify server names to remove (can be specified multiple times)
133+ - Server names are determined by the server's snapshot (not the image name or source URL)
134+ - Use ` docker mcp profile show <profile-id> ` to see available server names in a profile
135+
136+ ### Listing Servers Across Profiles
137+
138+ View all servers grouped by profile, with filtering capabilities:
139+
140+ ``` bash
141+ # List all servers across all profiles
142+ docker mcp profile servers
143+
144+ # Filter servers by name (case-insensitive substring matching)
145+ docker mcp profile servers --filter github
146+
147+ # Show servers from a specific profile only
148+ docker mcp profile servers --profile dev-tools
149+
150+ # Combine filter and profile
151+ docker mcp profile servers --profile dev-tools --filter slack
152+
153+ # Output in JSON format
154+ docker mcp profile servers --format json
155+
156+ # Output in YAML format
157+ docker mcp profile servers --format yaml
158+ ```
159+
160+ ** Output options:**
161+ - ` --filter ` : Search for servers matching a query (case-insensitive substring matching on image names or source URLs)
162+ - ` --profile ` or ` -p ` : Show servers only from a specific profile
163+ - ` --format ` : Output format - ` human ` (default), ` json ` , or ` yaml `
164+
165+ ** Notes:**
166+ - This command provides a global view of all servers across your profiles
167+ - Useful for finding which profiles contain specific servers
168+ - The filter applies to both image names and source URLs
169+
67170### Listing Profiles
68171
69172View all profiles in your system:
@@ -177,6 +280,49 @@ docker mcp profile config my-profile --get-all --format yaml
177280- You cannot both ` --set ` and ` --del ` the same key in a single command
178281- ** Note** : Config is for non-sensitive settings. Use secrets management for API keys, tokens, and passwords.
179282
283+ ### Managing Tools for Profile Servers
284+
285+ Control which tools are enabled or disabled for servers in a profile:
286+
287+ ``` bash
288+ # Enable specific tools for a server
289+ docker mcp profile tools my-profile \
290+ --enable github.create_issue \
291+ --enable github.list_repos
292+
293+ # Disable specific tools for a server
294+ docker mcp profile tools my-profile \
295+ --disable github.create_issue \
296+ --disable github.search_code
297+
298+ # Enable and disable in one command
299+ docker mcp profile tools my-profile \
300+ --enable github.create_issue \
301+ --disable github.search_code
302+
303+ # Enable all tools for a server
304+ docker mcp profile tools my-profile --enable-all github
305+
306+ # Disable all tools for a server
307+ docker mcp profile tools my-profile --disable-all github
308+
309+ # View all enabled tools in the profile
310+ docker mcp profile show my-profile
311+ ```
312+
313+ ** Tool management format:**
314+ - ` --enable ` : Format is ` <server-name>.<tool-name> ` (can be specified multiple times)
315+ - ` --disable ` : Format is ` <server-name>.<tool-name> ` (can be specified multiple times)
316+ - ` --enable-all ` : Format is ` <server-name> ` to enable all tools for a server (can be specified multiple times)
317+ - ` --disable-all ` : Format is ` <server-name> ` to disable all tools for a server (can be specified multiple times)
318+
319+ ** Important notes:**
320+ - Tool names use dot notation: ` <serverName>.<toolName> `
321+ - The server name must match the name from the server's snapshot
322+ - Use ` docker mcp profile show <profile-id> ` to see which tools are currently enabled
323+ - By default, all tools are enabled unless explicitly disabled
324+ - Changes take effect immediately and persist in the profile
325+
180326### Managing Secrets for Profile Servers
181327
182328Secrets provide secure storage for sensitive values like API keys, tokens, and passwords. Unlike configuration values, secrets are stored securely and never displayed in plain text.
@@ -374,7 +520,20 @@ docker mcp profile create --name dev \
374520# 2. Test it with the gateway
375521docker mcp gateway run --profile dev
376522
377- # 3. Once satisfied, export for sharing
523+ # 3. Add more servers as needed
524+ docker mcp profile server add dev \
525+ --server docker://mcp/postgres:latest
526+
527+ # 4. Remove servers you don't need
528+ docker mcp profile server remove dev --name filesystem
529+
530+ # 5. Disable dangerous tools in filesystem server for safety
531+ docker mcp profile tools dev --disable filesystem.delete_file
532+
533+ # 6. View all servers across profiles to check your setup
534+ docker mcp profile servers
535+
536+ # 7. Once satisfied, export for sharing
378537docker mcp profile export dev ./dev-profile.yaml
379538```
380539
@@ -453,6 +612,68 @@ docker mcp profile pull docker.io/myorg/my-tools:1.0
453612docker mcp profile pull docker.io/myorg/my-tools:1.1
454613```
455614
615+ ### Building Profiles from Catalogs
616+
617+ ``` bash
618+ # 1. Import Docker's official catalog (or pull from OCI registry)
619+ docker mcp catalog-next create docker-mcp-catalog \
620+ --from-legacy-catalog https://desktop.docker.com/mcp/catalog/v3/catalog.json
621+
622+ # Or pull a team catalog from OCI registry
623+ docker mcp catalog-next pull myorg/team-catalog:latest
624+
625+ # 2. Create an initial profile
626+ docker mcp profile create --name my-workflow
627+
628+ # 3. Add specific servers from Docker's official catalog
629+ docker mcp profile server add my-workflow \
630+ --catalog docker-mcp-catalog \
631+ --catalog-server github \
632+ --catalog-server slack
633+
634+ # 4. Optionally add servers from another catalog or direct references
635+ docker mcp profile server add my-workflow \
636+ --catalog myorg/team-catalog \
637+ --catalog-server custom-tool
638+
639+ # Or add a direct OCI reference
640+ docker mcp profile server add my-workflow \
641+ --server docker://mcp/custom-tool:latest
642+
643+ # 5. Configure and use
644+ docker mcp profile config my-workflow --set github.timeout=30
645+ docker mcp gateway run --profile my-workflow
646+ ```
647+
648+ ### Fine-Tuning Tool Access
649+
650+ ``` bash
651+ # Create a production profile with restricted tool access
652+ docker mcp profile create --name production \
653+ --server docker://mcp/github:latest \
654+ --server docker://mcp/slack:latest
655+
656+ # Disable all tools first, then enable only what's needed
657+ docker mcp profile tools production --disable-all github --disable-all slack
658+
659+ # Enable only safe, read-only tools for GitHub
660+ docker mcp profile tools production \
661+ --enable github.list_repos \
662+ --enable github.get_file \
663+ --enable github.search_code
664+
665+ # Enable only message sending for Slack (no channel management)
666+ docker mcp profile tools production \
667+ --enable slack.send_message \
668+ --enable slack.list_channels
669+
670+ # Verify the tool configuration
671+ docker mcp profile show production --format yaml
672+
673+ # Use the restricted profile
674+ docker mcp gateway run --profile production
675+ ```
676+
456677## Best Practices
457678
458679### Naming Conventions
@@ -482,6 +703,9 @@ docker mcp profile pull docker.io/myorg/my-tools:1.1
482703- Secrets are stored in Docker Desktop's secure secret store
483704- Use private OCI registries for proprietary server configurations
484705- Review server references before importing from external sources
706+ - Use ` docker mcp profile tools ` to disable dangerous or unnecessary tools in production
707+ - Apply the principle of least privilege: enable only the tools actually needed
708+ - Create separate profiles for different security contexts (dev vs. production)
485709
486710## Troubleshooting
487711
@@ -574,6 +798,77 @@ docker mcp profile config my-set --del github.timeout
574798docker mcp profile config my-set --set github.timeout=60
575799```
576800
801+ ### Missing Catalog Reference
802+
803+ ``` bash
804+ Error: --catalog-server requires --catalog to be specified
805+ ```
806+
807+ ** Solution** : When using ` --catalog-server ` , you must also provide ` --catalog ` :
808+ ``` bash
809+ docker mcp profile server add my-profile \
810+ --catalog my-catalog \
811+ --catalog-server github
812+ ```
813+
814+ ### Server Not Found in Catalog
815+
816+ ``` bash
817+ Error: server ' nonexistent' not found in catalog
818+ ```
819+
820+ ** Solution** :
821+ - Use ` docker mcp catalog-next show <catalog-name> ` to see available servers in the catalog
822+ - Check that the server name is spelled correctly (names are case-sensitive)
823+
824+ ### Cannot Remove Server
825+
826+ ``` bash
827+ Error: server ' github' not found in profile
828+ ```
829+
830+ ** Solution** :
831+ - Use ` docker mcp profile show <profile-id> --format yaml ` to see current servers in the profile
832+ - Ensure you're using the correct server name in the snapshot (not the image name or source URL)
833+ - Server names are case-sensitive
834+
835+ ### Invalid Tool Name Format
836+
837+ ``` bash
838+ Error: invalid tool specification: github
839+ ```
840+
841+ ** Solution** : Tool names must use dot notation with both server and tool name:
842+ ``` bash
843+ # Wrong
844+ docker mcp profile tools my-profile --enable github
845+
846+ # Correct
847+ docker mcp profile tools my-profile --enable github.create_issue
848+ ```
849+
850+ ### Server Not Found When Managing Tools
851+
852+ ``` bash
853+ Error: server ' github' not found in profile
854+ ```
855+
856+ ** Solution** :
857+ - Ensure the server with that snapshot name exists in the profile: ` docker mcp profile show <profile-id> --format yaml `
858+ - Server names are case-sensitive and must match the snapshot name
859+ - Add the server first if it doesn't exist: ` docker mcp profile server add <profile-id> --server docker://my-org/my-server `
860+
861+ ### Tool Not Found in Server
862+
863+ ``` bash
864+ Error: tool ' invalid_tool' not found in server ' github'
865+ ```
866+
867+ ** Solution** :
868+ - Use ` docker mcp profile show <profile-id> --format yaml ` to see available tools for each server
869+ - Tool names are case-sensitive and must match exactly
870+ - Check the server's documentation for available tool names
871+
577872## Limitations and Future Enhancements
578873
579874### Current Limitations
@@ -626,6 +921,13 @@ docker mcp catalog-next pull myorg/my-catalog:latest
626921- Catalogs can be pushed to/pulled from OCI registries like Docker images
627922- Output supports ` --format ` flag: ` human ` (default), ` json ` , or ` yaml `
628923
924+ ** 💡 Tip:** You can import Docker's official MCP catalog as a starting point:
925+ ``` bash
926+ docker mcp catalog-next create docker-mcp-catalog \
927+ --from-legacy-catalog https://desktop.docker.com/mcp/catalog/v3/catalog.json
928+ ```
929+ This gives you access to Docker's curated collection of MCP servers, which you can then use to build your profiles with the ` --catalog ` and ` --catalog-server ` flags.
930+
629931## Related Documentation
630932
631933- [ MCP Gateway] ( ./mcp-gateway.md ) - Running the MCP gateway
0 commit comments