From 1a49fa72a6b1aff61a4f13ea250ca9e99a0704b1 Mon Sep 17 00:00:00 2001 From: David Karlsson <35727626+dvdksn@users.noreply.github.com> Date: Fri, 24 Oct 2025 10:08:47 +0200 Subject: [PATCH] mcp: rewrite mcp toolkit/gateway documentation Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com> --- .../ai/mcp-catalog-and-toolkit/_index.md | 124 ++++++------- .../ai/mcp-catalog-and-toolkit/get-started.md | 57 +++--- .../images/mcp-servers-2.svg | 65 ------- .../images/mcp-servers.svg | 43 ----- .../images/mcp-toolkit-overview.png | Bin 27850 -> 0 bytes .../ai/mcp-catalog-and-toolkit/mcp-gateway.md | 169 ++++++++---------- .../ai/mcp-catalog-and-toolkit/toolkit.md | 122 ++++++------- hugo_stats.json | 4 - 8 files changed, 220 insertions(+), 364 deletions(-) delete mode 100644 content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers-2.svg delete mode 100644 content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers.svg delete mode 100644 content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-toolkit-overview.png diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/_index.md b/content/manuals/ai/mcp-catalog-and-toolkit/_index.md index 8000223bec98..14926e5ef58e 100644 --- a/content/manuals/ai/mcp-catalog-and-toolkit/_index.md +++ b/content/manuals/ai/mcp-catalog-and-toolkit/_index.md @@ -11,7 +11,7 @@ weight: 30 description: Learn about Docker's MCP catalog on Docker Hub keywords: Docker, ai, mcp servers, ai agents, extension, docker desktop, llm, docker hub grid: - - title: Get started + - title: Get started with MCP Toolkit description: Learn how to quickly install and use the MCP Toolkit to set up servers and clients. icon: explore link: /ai/mcp-catalog-and-toolkit/get-started/ @@ -23,77 +23,67 @@ grid: description: Learn about the MCP Toolkit to manage MCP servers and clients icon: /icons/toolkit.svg link: /ai/mcp-catalog-and-toolkit/toolkit/ + - title: MCP Gateway + description: Learn about the underlying technology that powers the MCP Toolkit + icon: developer_board + link: /ai/mcp-catalog-and-toolkit/toolkit/ + - title: Docker Hub MCP server + description: Explore about the Docker Hub server for searching images, managing repositories, and more + icon: device_hub + link: /ai/mcp-catalog-and-toolkit/toolkit/ --- {{< summary-bar feature_name="Docker MCP Catalog and Toolkit" >}} [Model Context Protocol](https://modelcontextprotocol.io/introduction) (MCP) is -an open protocol that standardizes how AI applications access external tools and data sources. Through a client-server architecture, applications such as [Gordon](/manuals/ai/gordon/_index.md) or Claude Desktop act as clients that send requests to MCP servers, which then process these requests and deliver the necessary context to AI models. - -Building and managing MCP tools can be complex. Docker MCP Catalog and Toolkit simplifies this by providing a secure, streamlined way to build, share, and run MCP tools, addressing common challenges developers face. - -Docker MCP Catalog and Toolkit simplifies the developer experience across the following areas: - -- Discovery: Centralized discovery through a verified catalog of versioned tools. -- Credential management: Secure credential management with OAuth-based authentication. -- Execution: Safe execution by running tools in isolated, containerized environments. -- Portability: True portability. MCP tools work seamlessly across Claude, Cursor, Visual Studio Code, and other platforms without requiring code changes. - -This integrated approach means you can launch MCP servers in seconds, add new tools through either CLI or GUI interfaces, and rely on Docker's pull-based infrastructure for trusted delivery of your tools. - - ![MCP overview](./images/mcp-overview.svg) - -To understand how Docker MCP Catalog and Toolkit achieves this streamlined experience, let's explore the underlying architecture and how its key components work together. - -## MCP architecture overview - -MCP follows a client-server architecture that enables standardized communication between AI applications and external tools. This foundational understanding helps you build and integrate MCP solutions effectively. - -### MCP servers - -MCP servers are specialized programs that provide specific tools and capabilities to AI models through [Model Context Protocol](https://modelcontextprotocol.io/introduction). Each server focuses on a particular domain, like GitHub integration, database access, or file management. You can think of them as extensions that give AI models the ability to interact with external systems and data sources. - -### MCP clients - -MCP clients are the bridge between AI applications and MCP servers. They enable AI systems to discover, connect to, and interact with external tools and data sources through the standardized MCP protocol. A single client can connect to multiple MCP servers, while each server can also serve multiple clients, creating a flexible many-to-many relationship that allows for rich integration possibilities. - -When you interact with an AI application that supports MCP, the client establishes connections to configured servers, discovers available tools and resources from all connected servers, executes requests when needed, and manages contextual information to enhance AI responses. - -### MCP Gateway - -The [MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) is Docker's open-source solution which connects MCP servers to MCP clients. It provides a unified endpoint that consolidates multiple MCP servers from the Docker MCP Catalog into a single, manageable connection point. Instead of clients connecting directly to individual MCP servers, the MCP Gateway sits in between, providing centralized connectivity, secure layer, and enterprise controls. - -In the context of Docker's MCP ecosystem: - -- MCP Catalog hosts the MCP servers (the tools/capabilities) -- MCP Gateway orchestrates and secures those servers -- MCP clients connect through the Gateway to access cataloged servers - -## How MCP components work together - -MCP components communicate through a structured flow that connects your development environment to external services. The following diagram shows how MCP works in practice with the key components: - -1. The MCP client (VS Code) serves as your development environment where you interact with AI assistance. -2. The MCP Gateway acts as a secure orchestration layer, managing and routing connection between the client (VS Code) and the GitHub Official MCP server. -3. The MCP server acts as the bridge, providing specialized capabilities. In the following example, the GitHub Official server offers tools like creating pull requests, creating branches, and retrieving issues. -4. The data source (GitHub) provides the actual service or platform that the MCP server connects to for real-time information and actions. - -This architecture enables seamless integration where you can access GitHub functionality directly from VS Code through standardized MCP communication. The server translates requests between your development environment and external services, making it easy to incorporate various tools and data sources into your AI-assisted workflow without complex custom integrations. - - ![Example of the GitHub MCP server](./images/mcp-toolkit-overview.png) - -> [!TIP] -> Example: -> If you work in Visual Studio Code's _agent mode_ and ask it to create a -> branch in GitHub, it needs an MCP server provided by GitHub to do that. -> -> The MCP server provided by GitHub provides _tools_ to your model to perform -> atomic actions, like: -> -> - `Create a PR` -> - `Create a branch` -> - ... -> +an open protocol that standardizes how AI applications access external tools +and data sources. By connecting LLMs to local development tools, databases, +APIs, and other resources, MCP extends their capabilities beyond their base +training. + +Through a client-server architecture, applications such as Claude, ChatGPT, and +[Gordon](/manuals/ai/gordon/_index.md) act as clients that send requests to MCP +servers, which then process these requests and deliver the necessary context to +AI models. + +MCP servers extend the utility of AI applications, but running servers locally +also presents several operational challenges. Typically, servers must be +installed directly on your machine and configured individually for each +application. Running untrusted code locally requires careful vetting, and the +responsibility of keeping servers up-to-date and resolving environment +conflicts falls on the user. + +## Docker MCP features + +Docker provides three integrated components that address the challenges of +running local MCP servers: + +MCP Catalog +: A curated collection of verified MCP servers, packaged and distributed as +container images via Docker Hub. All servers are versioned, come with full +provenance and SBOM metadata, and are continuously maintained and updated with +security patches. + +MCP Toolkit +: A graphical interface in Docker Desktop for discovering, configuring, and +managing MCP servers. The Toolkit provides a unified way to search for servers, +handle authentication, and connect them to AI applications. + +MCP Gateway +: The core open source component that powers the MCP Toolkit. The MCP Gateway +manages MCP containers provides a unified endpoint that exposes your enabled +servers to all AI applications you use. + +This integrated approach ensures: + +- Simplified discovery and setup of trusted MCP servers from a curated catalog + of tools +- Centralized configuration and authentication from within Docker Desktop +- A secure, consistent execution environment by default +- Improved performance since applications can share a single server runtime, + compared to having to spin up duplicate servers for each application. + +![MCP overview](./images/mcp-overview.svg) ## Learn more diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/get-started.md b/content/manuals/ai/mcp-catalog-and-toolkit/get-started.md index 6879a297f707..6b52a839318d 100644 --- a/content/manuals/ai/mcp-catalog-and-toolkit/get-started.md +++ b/content/manuals/ai/mcp-catalog-and-toolkit/get-started.md @@ -8,32 +8,34 @@ weight: 10 {{< summary-bar feature_name="Docker MCP Toolkit" >}} -Docker Model Context Protocol (MCP) Toolkit makes it easy to set up, manage, and run containerized MCP servers, and connect them to AI agents. It provides secure defaults, one-click setup, and support for a growing ecosystem of LLM-based clients. This page shows you how to get started quickly with the Docker MCP Toolkit. +The Docker MCP Toolkit makes it easy to set up, manage, and run containerized +Model Context Protocol (MCP) servers, and connect them to AI agents. It +provides secure defaults and support for a growing ecosystem of LLM-based +clients. This page shows you how to get started quickly with the Docker MCP +Toolkit. -## Requirements +## Setup Before you begin, make sure you meet the following requirements to get started with Docker MCP Toolkit. -### Download and install Docker Desktop - -- Install [Docker Desktop version 4.42.0](/manuals/desktop/release-notes.md#4420) and later. -- To try the MCP Toolkit Learning center walkthrough, you must install [Docker Desktop version 4.46.0](/manuals/desktop/release-notes.md#4460) and later. - -### Enable Docker MCP Toolkit - -1. Open the Docker Desktop settings and select **Beta features**. -2. Select **Enable Docker MCP Toolkit**. -3. Select **Apply**. +1. Download and install the latest version of [Docker Desktop](/get-started/get-docker/). +2. Open the Docker Desktop settings and select **Beta features**. +3. Select **Enable Docker MCP Toolkit**. +4. Select **Apply**. There are multiple ways to get started with Docker MCP Toolkit. You can: -- Try the [Learning center](#learning-center) walkthrough in Docker Desktop, available in [Docker Desktop version 4.46.0](/manuals/desktop/release-notes.md#4460) and later. -- Alternatively, follow the step-by-step instructions on this page to use Docker Desktop or the CLI to [Install an MCP server](#install-an-mcp-server), [add a client, and test your setup](#install-an-mcp-client-and-test-your-setup) with example prompts. -## Learning center +- The **Learning center** in Docker Desktop provides walkthroughs and resources + to help you get started with Docker products and features. -The **Learning center** in Docker Desktop provides walkthroughs and resources to help you get started with Docker products and features. + On the **MCP Toolkit** page, the **Get started** walkthrough that guides you + through installing an MCP server, connecting a client, and testing your + setup. -On the **MCP Toolkit** page, Docker Desktop shows the **Get started** walkthrough that guides you through installing an MCP server, connecting a client, and testing your setup. +- Alternatively, follow the step-by-step instructions on this page to use + Docker Desktop or the CLI to [Install an MCP server](#install-an-mcp-server), + [add a client, and test your setup](#install-an-mcp-client-and-test-your-setup) + with example prompts. ## Install an MCP server @@ -44,7 +46,7 @@ On the **MCP Toolkit** page, Docker Desktop shows the **Get started** walkthroug 2. Search for the **GitHub Official** server from the catalog and then select the plus icon to add it. 3. In the **GitHub Official** server page, select the **Configuration** tab and select **OAuth**. - >[!NOTE] + > [!NOTE] > > The type of configuration required depends on the server you select. For the GitHub Official server, you must authenticate using OAuth. @@ -68,7 +70,7 @@ On the **MCP Toolkit** page, Docker Desktop shows the **Get started** walkthroug $ docker mcp oauth authorize github ``` - >[!NOTE] + > [!NOTE] > > The type of configuration required depends on the server you select. For the GitHub Official server, you must authenticate using OAuth. @@ -79,11 +81,11 @@ On the **MCP Toolkit** page, Docker Desktop shows the **Get started** walkthroug ```console $ docker mcp server enable playwright ``` -{{< /tab >}} -{{< /tabs >}} -You’ve now successfully added an MCP server. Next, install an MCP client and test your setup with an example prompt. + {{< /tab >}} + {{< /tabs >}} +You’ve now successfully added an MCP server. Next, install an MCP client and test your setup with an example prompt. ## Install an MCP client and test your setup @@ -96,17 +98,18 @@ After you've installed MCP servers, you can add clients to the MCP Toolkit. Thes 2. Find **Claude Desktop** and select **Connect**. If Claude Desktop isn't installed, select **Download** to install it, then select **Connect**. + 3. Restart Claude Desktop if it's running, and it can now access all the servers in the MCP Toolkit. -4. Open Claude Desktop and run a test by submitting the following prompt using the Sonnet Opus 4.1 model: +4. Open Claude Desktop and run a test by submitting the following prompt: ```text Take a screenshot of the header element on docs.docker.com ``` + Claude prompts you for permissions and shares a screenshot of the header element from the Docker documentation page. ![Screenshot showing the header of Docker docs.](./images/claude-desktop-example.png) - {{< /tab >}} {{< tab name="From the Docker CLI">}} @@ -115,12 +118,14 @@ After you've installed MCP servers, you can add clients to the MCP Toolkit. Thes ```console $ docker mcp client connect claude-desktop --global ``` + 2. Restart Claude Desktop if it's running, and it can now access all the servers in the MCP Toolkit. 3. Open Claude Desktop and run a test by submitting the following prompt using the Sonnet 4 model: ```text Take a screenshot of the header element on docs.docker.com ``` + Claude prompts you for permissions and shares a screenshot of the header element from the Docker documentation page. ![Screenshot showing the header of Docker docs.](./images/claude-desktop-example.png) @@ -128,8 +133,8 @@ After you've installed MCP servers, you can add clients to the MCP Toolkit. Thes {{< /tab >}} {{< /tabs >}} -## Related pages +## Further reading - [MCP Toolkit](/manuals/ai/mcp-catalog-and-toolkit/toolkit.md) - [MCP Catalog](/manuals/ai/mcp-catalog-and-toolkit/catalog.md) -- [Open-source MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) +- [MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers-2.svg b/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers-2.svg deleted file mode 100644 index 74e45fde7919..000000000000 --- a/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers-2.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers.svg b/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers.svg deleted file mode 100644 index b628530b5fff..000000000000 --- a/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-servers.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-toolkit-overview.png b/content/manuals/ai/mcp-catalog-and-toolkit/images/mcp-toolkit-overview.png deleted file mode 100644 index e43d3ca4626aca58a85853657f5f881eef5002f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27850 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 h^#95vnL>UKa3))oU#vPTKR*LrGLniC [!NOTE] +> If you use Docker Desktop with MCP Toolkit enabled, the Gateway runs +> automatically in the background. You don't need to start or configure it +> manually. This documentation is for users who want to understand how the +> Gateway works or run it directly for advanced use cases. + +> [!TIP] > E2B sandboxes now include direct access to the Docker MCP Catalog, giving developers > access to over 200 tools and services to seamlessly build and run AI agents. For > more information, see [E2B Sandboxes](sandboxes.md). -## Who is the MCP Gateway designed for? - -The MCP Gateway solves problems encountered by various groups: - -- Developers: Deploy MCP servers locally and in production using Docker Compose, - with built-in support for protocol handling, credential management, and security policies. -- Security teams: Achieve enterprise-grade isolation and visibility into AI tool - behavior and access patterns. -- Operators: Scale effortlessly from local development environments to production - infrastructure with consistent, low-touch operations. - -## Key features - -- Server management: List, inspect, and call MCP tools, resources and prompts from multiple servers -- Container-based servers: Run MCP servers as Docker containers with proper isolation -- Secrets management: Secure handling of API keys and credentials via Docker Desktop -- Dynamic discovery and reloading: Automatic tool, prompt, and resource discovery from running servers -- Monitoring: Built-in logging and call tracing capabilities - -## Install a pre-release version of the MCP Gateway - -If you use Docker Desktop, the MCP Gateway is readily available. Use the -following instructions to test pre-release versions. - -### Prerequisites +## How it works -- Docker Desktop with the [MCP Toolkit feature enabled](../mcp-catalog-and-toolkit/toolkit.md#enable-docker-mcp-toolkit). -- Go 1.24+ (for development) +MCP Gateway runs MCP servers in isolated Docker containers with restricted +privileges, network access, and resource usage. It includes built-in logging +and call-tracing capabilities to ensure full visibility and governance of AI +tool activity. -### Install using a pre-built binary +The MCP Gateway manages the server's entire lifecycle. When an AI application +needs to use a tool, it sends a request to the Gateway. The Gateway identifies +which server handles that tool and, if the server isn't already running, starts +it as a Docker container. The Gateway then injects any required credentials, +applies security restrictions, and forwards the request to the server. The +server processes the request and returns the result through the Gateway back to +the AI application. -You can download the latest binary from the [GitHub releases page](https://github.com/docker/mcp-gateway/releases/latest). +The MCP Gateway solves a fundamental problem: MCP servers are just programs +that need to run somewhere. Running them directly on your machine means dealing +with installation, dependencies, updates, and security risks. By running them +as containers managed by the Gateway, you get isolation, consistent +environments, and centralized control. -Rename the relevant binary and copy it to the destination matching your OS: +## Usage -| OS | Binary name | Destination folder | -|---------|------------------|-------------------------------------| -| Linux | `docker-mcp` | `$HOME/.docker/cli-plugins` | -| macOS | `docker-mcp` | `$HOME/.docker/cli-plugins` | -| Windows | `docker-mcp.exe` | `%USERPROFILE%\.docker\cli-plugins` | +To use the MCP Gateway, you'll need Docker Desktop with MCP Toolkit enabled. +Follow the [MCP Toolkit guide](toolkit.md) to enable and configure servers +through the graphical interface. -Or copy it into one of these folders for installing it system-wide: +### Manage the MCP Gateway from the CLI +With MCP Toolkit enabled, you can also interact with the MCP Gateway using the +CLI. The `docker mcp` suite of commands lets you manage servers and tools +directly from your terminal. You can also manually run Gateways with custom +configurations, including security restrictions, server catalogs, and more. -{{< tabs group="" >}} -{{< tab name="On Unix environments">}} +To run an MCP Gateway manually, with customized parameters, use the `docker +mcp` suite of commands. -* `/usr/local/lib/docker/cli-plugins` OR `/usr/local/libexec/docker/cli-plugins` -* `/usr/lib/docker/cli-plugins` OR `/usr/libexec/docker/cli-plugins` +1. Browse the [MCP Catalog](https://hub.docker.com/mcp) for a server that you + want to use, and copy the install command from the **Manual installation** + section. -> [!NOTE] -> You may have to make the binaries executable with `chmod +x`: -> ```bash -> $ chmod +x ~/.docker/cli-plugins/docker-mcp -> ``` - -{{< /tab >}} -{{< tab name="On Windows">}} - -* `C:\ProgramData\Docker\cli-plugins` -* `C:\Program Files\Docker\cli-plugins` - -{{< /tab >}} -{{}} - -You can now use the `mcp` command: - -```bash -docker mcp --help -``` - -## Use the MCP Gateway - -1. Select a server of your choice from the [MCP Catalog](https://hub.docker.com/mcp) - and copy the install command from the **Manual installation** section. - -1. For example, run this command in your terminal to install the `duckduckgo` + For example, run this command in your terminal to install the `duckduckgo` MCP server: ```console docker mcp server enable duckduckgo ``` -1. Connect a client, like Visual Studio Code: +2. Connect a client, like Claude Code: ```console - docker mcp client connect vscode + docker mcp client connect claude-code ``` -1. Run the gateway: +3. Run the gateway: ```console docker mcp gateway run ``` Now your MCP gateway is running and you can leverage all the servers set up -behind it from Visual Studio Code. +behind it from Claude Code. + +### Install the MCP Gateway manually + +For Docker Engine without Docker Desktop, you'll need to download and install +the MCP Gateway separately before you can run it. + +1. Download the latest binary from the [GitHub releases page](https://github.com/docker/mcp-gateway/releases/latest). + +2. Move or symlink the binary to the destination matching your OS: -[View the complete docs on GitHub.](https://github.com/docker/mcp-gateway?tab=readme-ov-file#usage) + | OS | Binary destination | + | ------- | ----------------------------------- | + | Linux | `~/.docker/cli-plugins/docker-mcp` | + | macOS | `~/.docker/cli-plugins/docker-mcp` | + | Windows | `%USERPROFILE%\.docker\cli-plugins` | + +3. Make the binaries executable: + + ```bash + $ chmod +x ~/.docker/cli-plugins/docker-mcp + ``` + +You can now use the `docker mcp` command: + +```bash +docker mcp --help +``` -## Related pages +## Additional information -- [Docker MCP Toolkit and catalog](/manuals/ai/mcp-catalog-and-toolkit/_index.md) +For more details on how the MCP Gateway works and available customization +options, see the complete documentation [on GitHub](https://github.com/docker/mcp-gateway). diff --git a/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md b/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md index 595b957b5fdd..86b2e1ea0ee8 100644 --- a/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md +++ b/content/manuals/ai/mcp-catalog-and-toolkit/toolkit.md @@ -11,21 +11,17 @@ aliases: {{< summary-bar feature_name="Docker MCP Toolkit" >}} -The Docker MCP Toolkit is a gateway that lets you set up, manage, and run -containerized MCP servers and connect them to AI agents. It removes friction -from tool usage by offering secure defaults, one-click setup, and support for a -growing ecosystem of LLM-based clients. It is the fastest way from MCP tool -discovery to local execution. - -> [!NOTE] -> If you need to run your own MCP gateway, -> see [Docker MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md). +The Docker MCP Toolkit is a management interface integrated into Docker Desktop +that lets you set up, manage, and run containerized MCP servers and connect +them to AI agents. It removes friction from tool usage by offering secure +defaults, easy setup, and support for a growing ecosystem of LLM-based clients. +It is the fastest way from MCP tool discovery to local execution. ## Key features -- Cross-LLM compatibility: Instantly works with Claude Desktop, Cursor, Continue.dev, and [Gordon](/manuals/ai/gordon/_index.md). +- Cross-LLM compatibility: Works with Claude, Cursor, and other MCP clients. - Integrated tool discovery: Browse and launch MCP servers from the Docker MCP Catalog directly in Docker Desktop. -- Zero manual setup: No dependency management, runtime configuration, or server setup required. +- Zero manual setup: No dependency management, runtime configuration, or setup required. - Functions as both an MCP server aggregator and a gateway for clients to access installed MCP servers. ## How the MCP Toolkit works @@ -44,24 +40,7 @@ can run a container directly, without managing dependencies or configuring runtimes. Depending on the MCP server, the tools it provides might run within the same -container as the server or in dedicated containers: - -{{< tabs group="" >}} -{{< tab name="Single container">}} - -![Screenshot showing a single-container MCP Toolkit setup.](./images/mcp-servers.svg) - -{{< /tab >}} -{{< tab name="Separate containers">}} - -![Screenshot showing a multi-container MCP Toolkit setup.](./images/mcp-servers-2.svg) - -{{< /tab >}} -{{}} - ->[!NOTE] -> -> The Docker MCP Toolkit was originally released as an extension. This extension is now deprecated and should be uninstalled. +container as the server or in dedicated containers for better isolation. ## Security @@ -70,14 +49,18 @@ surfaces and ensure safe runtime behavior. ### Passive security -- Image signing and attestation: All MCP server images under `mcp/` in the [catalog](catalog.md) - are built by Docker and digitally - signed to verify their source and integrity. Each image includes a Software - Bill of Materials (SBOM) for full transparency. +Passive security refers to measures implemented at build-time, when the MCP +server code is packaged into a Docker image. + +- Image signing and attestation: All MCP server images under `mcp/` in the [MCP + Catalog](catalog.md) are built by Docker and digitally signed to verify their + source and integrity. Each image includes a Software Bill of Materials (SBOM) + for full transparency. ### Active security -Security at runtime is enforced through resource and access limitations: +Active security refers to security measures at runtime, before and after tools +are invoked, enforced through resource and access limitations. - CPU allocation: MCP tools are run in their own container. They are restricted to 1 CPU, limiting the impact of potential misuse of computing @@ -91,30 +74,45 @@ Security at runtime is enforced through resource and access limitations: - Interception of tool requests: Requests to and from tools that contain sensitive information such as secrets are blocked. -To learn more about the MCP server catalog, see [Catalog](catalog.md). +### OAuth authentication + +Some MCP servers require authentication to access external services. The MCP +Toolkit handles OAuth flows for supported services, currently limited to +GitHub. When you authorize the MCP Toolkit to access your GitHub account, any +installed MCP server that needs GitHub access can use those credentials without +requiring separate authentication. + +To set up OAuth for a service, use the **OAuth** tab in the MCP Toolkit section +in Docker Desktop. Once authorized, the credentials are available to any MCP +server that needs them. You can revoke access at any time from the same tab. -### Example: Use the **GitHub Official** MCP server +## Usage examples -Imagine you want to enable [Ask Gordon](/manuals/ai/gordon/_index.md) to interact with your GitHub account: +### Example: Use the GitHub Official MCP server with Ask Gordon -1. From the **MCP Toolkit** menu, select the **Catalog** tab and find - the **GitHub Official** server and add it. -2. In the server's **Config** tab, [connect via OAuth](#authenticate-via-oauth). +To illustrate how the MCP Toolkit works, here's how to enable the GitHub +Official MCP server and use [Ask Gordon](/manuals/ai/gordon/_index.md) to +interact with your GitHub account: + +1. From the **MCP Toolkit** menu in Docker Desktop, select the **Catalog** tab + and find the **GitHub Official** server and add it. +2. In the server's **Config** tab, authenticate via OAuth. 3. In the **Clients** tab, ensure Gordon is connected. 4. From the **Ask Gordon** menu, you can now send requests related to your - GitHub account, in accordance to the tools provided by the GitHub Official server. To test it, ask Gordon: + GitHub account, in accordance to the tools provided by the GitHub Official + server. To test it, ask Gordon: ```text What's my GitHub handle? ``` - Make sure to allow Gordon to interact with GitHub by selecting **Always allow** in Gordon's answer. + Make sure to allow Gordon to interact with GitHub by selecting **Always + allow** in Gordon's answer. > [!TIP] -> By default, the Gordon client is enabled, +> The Gordon client is enabled by default, > which means Gordon can automatically interact with your MCP servers. - ### Example: Use Claude Desktop as a client Imagine you have Claude Desktop installed, and you want to use the GitHub MCP server, @@ -136,15 +134,12 @@ and add Claude Desktop as a client: You can interact with all your installed MCP servers in Visual Studio Code: - - 1. To enable the MCP Toolkit: - {{< tabs group="" >}} {{< tab name="Enable globally">}} - 1. Insert the following in your Visual Studio Code's User`mcp.json`: + 1. Insert the following in your Visual Studio Code's User `mcp.json`: ```json "mcp": { @@ -173,8 +168,13 @@ You can interact with all your installed MCP servers in Visual Studio Code: ``` > [!NOTE] - > This command creates a `.vscode/mcp.json` file in the current directory. We - > recommend you add it to your `.gitignore` file. + > This command creates a `.vscode/mcp.json` file in the current + > directory. As this is a user-specific file, add it to your `.gitignore` + > file to prevent it from being committed to the repository. + > + > ```console + > echo ".vscode/mcp.json" >> .gitignore + > ``` {{< /tab >}} {{}} @@ -190,23 +190,7 @@ You can interact with all your installed MCP servers in Visual Studio Code: For more information about the Agent mode, see the [Visual Studio Code documentation](https://code.visualstudio.com/docs/copilot/chat/mcp-servers#_use-mcp-tools-in-agent-mode). - - -## Authenticate via OAuth - -You can connect the MCP Toolkit to your development workflow via -OAuth integration. For now, the MCP Toolkit only supports GitHub OAuth. - -1. On https://github.com/, ensure you are signed in. -1. In Docker Desktop, select **MCP Toolkit** and select the **OAuth** tab. -1. In the GitHub entry, select **Authorize**. Your browser opens the GitHub authorization page. -1. In the GitHub authorization page, select **Authorize Docker**. Once the authorization - is successful, you are automatically redirected to Docker Desktop. -1. Install the **GitHub Official** MCP server, see [Install an MCP server](/manuals/ai/mcp-catalog-and-toolkit/get-started.md#install-an-mcp-server). - -The MCP Toolkit now has access to your GitHub account. To revoke access, select **Revoke** in the **OAuth** tab. -See an example in [Use the **GitHub Official** MCP server](#example-use-the-github-official-mcp-server). - -## Related pages +## Further reading -- [Open-source MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) +- [MCP Catalog](/manuals/ai/mcp-catalog-and-toolkit/catalog.md) +- [MCP Gateway](/manuals/ai/mcp-catalog-and-toolkit/mcp-gateway.md) diff --git a/hugo_stats.json b/hugo_stats.json index 4907c59ce48d..e0b7375b82ea 100644 --- a/hugo_stats.json +++ b/hugo_stats.json @@ -108,8 +108,6 @@ "Okta", "Okta-SAML", "Old-Dockerfile", - "On-Unix-environments", - "On-Windows", "Other-providers", "PHP", "PowerShell", @@ -128,9 +126,7 @@ "Run-Ollama-in-a-container", "Run-Ollama-outside-of-a-container", "Rust", - "Separate-containers", "Shell-script-deployment", - "Single-container", "Specific-version", "Svelte", "Testcontainers-Cloud",