{"id":3290,"date":"2026-01-22T19:52:14","date_gmt":"2026-01-22T19:52:14","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/01\/22\/using-mcp-servers-from-quick-tools-to-multi-agent-systems\/"},"modified":"2026-01-22T19:52:14","modified_gmt":"2026-01-22T19:52:14","slug":"using-mcp-servers-from-quick-tools-to-multi-agent-systems","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2026\/01\/22\/using-mcp-servers-from-quick-tools-to-multi-agent-systems\/","title":{"rendered":"Using MCP Servers: From Quick Tools to Multi-Agent Systems"},"content":{"rendered":"<p>Model Context Protocol (MCP) servers are a spec for exposing tools, models, or services to language models through a common interface. Think of them as smart adapters: they sit between a tool and the LLM, speaking a predictable protocol that lets the model interact with things like APIs, databases, and agents without needing to know implementation details.<\/p>\n<p>But like most good ideas, the devil\u2019s in the details.<\/p>\n<h2 class=\"wp-block-heading\"><strong>The Promise\u2014and the Problems of Running MCP Servers<\/strong><\/h2>\n<p>Running an MCP sounds simple: spin up a Python or Node server that exposes your tool. Done, right? Not quite.<\/p>\n<p>You run into problems fast:<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>Runtime friction<\/strong>: If an MCP is written in Python, your environment needs Python (plus dependencies, plus maybe a virtualenv strategy, plus maybe GPU drivers). Same goes for Node. This multiplies fast when you\u2019re managing many MCPs or deploying them across teams.<\/li>\n<li><strong>Secrets management<\/strong>: MCPs often need credentials (API keys, tokens, etc.). You need a secure way to store and inject those secrets into your MCP runtime. That gets tricky when different teams, tools, or clouds are involved.<\/li>\n<li><strong>N\u00d7N integration pain<\/strong>: Let\u2019s say you\u2019ve got three clients that want to consume MCPs, and five MCPs to serve up. Now you\u2019re looking at 15 individual integrations. No thanks.<\/li>\n<\/ul>\n<p>To make MCPs practical, you need to solve these three core problems: runtime complexity, secret injection, and client-to-server wiring.\u00a0<\/p>\n<p>If you\u2019re wondering where I\u2019m going with all this, take a look at those problems. We already have a technology that has been used by developers for over a decade that helps solve them: Docker containers.<\/p>\n<p>In the rest of this blog I\u2019ll walk through three different approaches, going from least complex to most complex, for integrating MCP servers into your developer experience.\u00a0<\/p>\n<h2 class=\"wp-block-heading\"><strong>Option 1 \u2014 Docker MCP Toolkit &amp; Catalog<\/strong><\/h2>\n<p><em>For the developer who already uses containers and wants a low-friction way to start with MCP.<\/em><\/p>\n<p>If you\u2019re already comfortable with Docker but just getting your feet wet with MCP, this is the sweet spot. In the raw MCP world, you\u2019d clone Python\/Node servers, manage runtimes, inject secrets yourself, and hand-wire connections to every client. That\u2019s exactly the pain Docker\u2019s MCP ecosystem set out to solve.<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/mcp\" rel=\"nofollow noopener\" target=\"_blank\">Docker\u2019s MCP Catalog<\/a> is a curated, containerized registry of MCP servers. Each entry is a prebuilt container with everything you need to run the MCP server.\u00a0<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/open-desktop?url=https:\/\/open.docker.com\/dashboard\/mcp&amp;_gl\" rel=\"nofollow noopener\" target=\"_blank\">The MCP Toolkit<\/a> (available via Docker Desktop) is your control panel: search the catalog, launch servers with secure defaults, and connect them to clients.<\/p>\n<p><strong>How it helps:<\/strong><\/p>\n<ul class=\"wp-block-list\">\n<li>No language runtimes to install<\/li>\n<li>Built-in secrets management<\/li>\n<li>One-click enablement via Docker Desktop<\/li>\n<li>Easily wire the MCPs to your existing agents (Claude Desktop, Copilot in VS Code, etc)<\/li>\n<li>Centralized access via the MCP Gateway<\/li>\n<\/ul>\n<div class=\"wp-block-ponyo-image\">\n                <img data-opt-id=914556288  fetchpriority=\"high\" decoding=\"async\" width=\"1904\" height=\"1006\" src=\"https:\/\/www.docker.com\/app\/uploads\/2026\/01\/MCP-Catalog.gif\" class=\"fade-in attachment-full size-full\" alt=\"MCP Catalog\" title=\"- MCP Catalog\" \/>\n        <\/div>\n<p class=\"has-xs-font-size\">Figure 1: Docker MCP Catalog: Browse hundreds of MCP servers with filters for local or remote and clear distinctions between official and community servers<\/p>\n<div class=\"style-plain wp-block-ponyo-houston\">\n<p>A Note on the MCP Gateway<br \/>One important piece working behind the scenes in both the MCP Toolkit and cagent (a framework for easily building multi-agent applications that we cover below) is the <a href=\"https:\/\/github.com\/docker\/mcp-gateway\" rel=\"nofollow noopener\" target=\"_blank\">MCP Gateway<\/a>, an open-source project from Docker that acts as a centralized frontend for all your MCP servers. Whether you\u2019re using a GUI to start containers or defining agents in YAML, the Gateway handles all the routing, authentication, and translation between clients and tools. It also exposes a single endpoint that custom apps or agent frameworks can call directly, making it a clean bridge between GUI-based workflows and programmatic agent development.<\/p>\n<\/div>\n<p>Moving on: Using MCP servers alongside existing AI agents is often the first step for many developers. You wire up a couple tools, maybe connect to a calendar or a search API, and use them in something like Claude, ChatGPT, or a small custom agent. For step-by-step tutorials on how to automate dev workflows with Docker\u2019s MCP Catalog and Toolkit with popular clients, check out these guides on <a href=\"https:\/\/www.docker.com\/blog\/add-mcp-server-to-chatgpt\/\">ChatGPT<\/a>, <a href=\"https:\/\/www.docker.com\/blog\/connect-mcp-servers-to-claude-desktop-with-mcp-toolkit\/\">Claude Desktop<\/a>,<a href=\"https:\/\/www.docker.com\/blog\/connect-codex-to-mcp-servers-mcp-toolkit\/\">Codex<\/a>, <a href=\"https:\/\/www.docker.com\/blog\/how-to-set-up-gemini-cli-with-mcp-toolkit\/\">Gemini CLI<\/a>, and <a href=\"https:\/\/www.docker.com\/blog\/add-mcp-servers-to-claude-code-with-mcp-toolkit\/\">Claude Code<\/a>.\u00a0<br \/>Once that pattern clicks, the next logical step is to use those same MCP servers as tools inside a multi-agent system.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Option 2 \u2014 cagent: Declarative Multi-Agent Apps<\/strong><\/h2>\n<p><em>For the developer who wants to build custom multi-agent applications but isn\u2019t steeped in traditional agentic frameworks.<\/em><\/p>\n<p>If you\u2019re past simple MCP servers and want agents that can delegate, coordinate, and reason together, <a href=\"https:\/\/github.com\/docker\/cagent\" rel=\"nofollow noopener\" target=\"_blank\">cagent<\/a> is your next step. It\u2019s Docker\u2019s open-source, YAML-first framework for defining and running multi-agent systems\u2014without needing to dive into complex agent SDKs or LLM loop logic.<\/p>\n<p>Cagent lets you describe:<\/p>\n<ul class=\"wp-block-list\">\n<li>The agents themselves (model, role, instructions)<\/li>\n<li>Who delegates to whom<\/li>\n<li>What tools each agent can access (via MCP or local capabilities)<\/li>\n<\/ul>\n<p>Below is an example of a pirate flavored chat bot:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\">\nagents:\n  root:\n    description: An agent that talks like a pirate\n    instruction: Always answer by talking like a pirate.\n    welcome_message: |\n      Ahoy! I be yer pirate guide, ready to set sail on the seas o' knowledge! What be yer quest? \n    model: auto\n\n\ncagent run agents.yaml\n\n<\/pre>\n<\/div>\n<p>You don\u2019t write orchestration code. You describe what you want, and Cagent runs the system.<\/p>\n\n<p><strong>Why it works:<\/strong><\/p>\n<ul class=\"wp-block-list\">\n<li>Tools are scoped per agent<\/li>\n<li>Delegation is explicit<\/li>\n<li>Uses MCP Gateway behind the scene<\/li>\n<li>Ideal for building agent systems without writing Python <\/li>\n<\/ul>\n<p>If you\u2019d like to give cagent a try, we have a ton of <a href=\"https:\/\/github.com\/docker\/cagent\/tree\/main\/examples\" rel=\"nofollow noopener\" target=\"_blank\">examples<\/a> in the project\u2019s GitHub repository. Check out this <a href=\"https:\/\/www.docker.com\/blog\/how-to-build-a-multi-agent-system\/\">guide<\/a> on building multi-agent systems in 5 minutes.\u00a0<\/p>\n<h2 class=\"wp-block-heading\"><strong>Option 3 \u2014 Traditional Agent Frameworks (LangGraph, CrewAI, ADK)<\/strong><\/h2>\n<p><em>For developers building complex, custom, fully programmatic agent systems.<\/em><\/p>\n\n<p>Traditional agent frameworks like LangGraph, CrewAI, or Google\u2019s Agent Development Kit (ADK) let you define, control, and orchestrate agent behavior directly in code. You get full control over logic, state, memory, tools, and workflows.<\/p>\n<p>They shine when you need:<\/p>\n<ul class=\"wp-block-list\">\n<li>Complex branching logic<\/li>\n<li>Error recovery, retries, and persistence<\/li>\n<li>Custom memory or storage layers<\/li>\n<li>Tight integration with existing backend code<\/li>\n<\/ul>\n<p><strong>Example: LangGraph + MCP via Gateway<\/strong><\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: python; title: ; notranslate\">\n\nimport requests\nfrom langgraph.graph import StateGraph\nfrom langchain.agents import Tool\nfrom langchain_openai import ChatOpenAI\n\n# Discover MCP endpoint from Gateway\nresp = requests.get(\"http:\/\/localhost:6600\/v1\/servers\")\nservers = resp.json()[\"servers\"]\nduck_url = next(s[\"url\"] for s in servers if s[\"name\"] == \"duckduckgo\")\n\n# Define a callable tool\ndef mcp_search(query: str) -&gt; str:\n    return requests.post(duck_url, json={\"input\": query}).json()[\"output\"]\n\nsearch_tool = Tool(name=\"web_search\", func=mcp_search, description=\"Search via MCP\")\n\n# Wire it into a LangGraph loop\nllm = ChatOpenAI(model=\"gpt-4\")\ngraph = StateGraph()\ngraph.add_node(\"agent\", llm.bind_tools([search_tool]))\ngraph.add_edge(\"agent\", \"agent\")\ngraph.set_entry_point(\"agent\")\n\napp = graph.compile()\napp.invoke(\"What\u2019s the latest in EU AI regulation?\")\n\n<\/pre>\n<\/div>\n<p>In this setup, you decide which tools are available. The agent chooses when to use them based on context, but you\u2019ve defined the menu.<br \/>And yes, this is still true in the Docker MCP Toolkit: you decide what to enable. The LLM can\u2019t call what you haven\u2019t made visible.<\/p>\n<p><strong>Choosing the Right Approach<\/strong><\/p>\n<div class=\"wp-block-ponyo-table style__default\">\n<table class=\"responsive-table\">\n<tbody class=\"wp-block-ponyo-table-body\">\n<tr class=\"wp-block-ponyo-table-header\">\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"Approach\">\n<p><strong>Approach<\/strong><\/p>\n<\/th>\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"Best For\">\n<p><strong>Best For<\/strong><\/p>\n<\/th>\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"You Manage\">\n<p><strong>You Manage<\/strong><\/p>\n<\/th>\n<th class=\"wp-block-ponyo-cell\" data-responsive-table-heading=\"You Get\">\n<p><strong>You Get<\/strong><\/p>\n<\/th>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n<p><strong>Docker MCP Toolkit + Catalog<\/strong><\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Devs new to MCP, already using containers<\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Tool selection<\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>One-click setup, built-in secrets, Gateway integration<\/p>\n<\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n<p><strong>Cagent<\/strong><\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>YAML-based multi-agent apps without custom code<\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Roles &amp; tool access<\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Declarative orchestration, multi-agent workflows<\/p>\n<\/td>\n<\/tr>\n<tr class=\"wp-block-ponyo-table-row\">\n<td class=\"wp-block-ponyo-cell\">\n<p><strong>LangGraph \/ CrewAI \/ ADK<\/strong><\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Complex, production-grade agent systems<\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Full orchestration<\/p>\n<\/td>\n<td class=\"wp-block-ponyo-cell\">\n<p>Max control over logic, memory, tools, and flow<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>Wrapping Up<\/strong><br \/>Whether you\u2019re just connecting a tool to Claude, designing a custom multi-agent system, or building production workflows by hand, Docker\u2019s MCP tooling helps you get started easily and securely.\u00a0<\/p>\n<p>Check out the<a href=\"https:\/\/docs.docker.com\/ai\/mcp-catalog-and-toolkit\/\" rel=\"nofollow noopener\" target=\"_blank\"> Docker MCP Toolkit<\/a>,<a href=\"https:\/\/github.com\/docker\/cagent\" rel=\"nofollow noopener\" target=\"_blank\"> cagent<\/a>, and<a href=\"https:\/\/github.com\/docker\/mcp-gateway\" rel=\"nofollow noopener\" target=\"_blank\"> MCP Gateway<\/a> for example code, docs, and more ways to get started.<\/p>","protected":false},"excerpt":{"rendered":"<p>Model Context Protocol (MCP) servers are a spec for exposing tools, models, or services to language models through a common [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3291,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[4],"tags":[],"class_list":["post-3290","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3290","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=3290"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/3290\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media\/3291"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=3290"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=3290"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=3290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}