{"id":2581,"date":"2025-10-10T13:18:37","date_gmt":"2025-10-10T13:18:37","guid":{"rendered":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/10\/10\/how-to-add-mcp-servers-to-claude-code-with-docker-mcp-toolkit\/"},"modified":"2025-10-10T13:18:37","modified_gmt":"2025-10-10T13:18:37","slug":"how-to-add-mcp-servers-to-claude-code-with-docker-mcp-toolkit","status":"publish","type":"post","link":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/2025\/10\/10\/how-to-add-mcp-servers-to-claude-code-with-docker-mcp-toolkit\/","title":{"rendered":"How to Add MCP Servers to Claude Code with Docker MCP Toolkit"},"content":{"rendered":"<p>AI coding assistants have evolved from simple autocomplete tools into full development partners. Yet even the best of them, like Claude Code, can\u2019t act directly on your environment. Claude Code can suggest a database query, but can\u2019t run it. It can draft a GitHub issue, but can\u2019t create it. It can write a Slack message, but can\u2019t send it. You\u2019re still copying, pasting, and context-switching between tools.<\/p>\n<p>That\u2019s where Model Context Protocol (MCP) and <a href=\"https:\/\/www.docker.com\/products\/mcp-catalog-and-toolkit\/\">Docker MCP Toolkit<\/a> come in. MCP connects Claude Code to your real tools, databases, repositories, browsers, and APIs, while Docker MCP Toolkit makes setup effortless and secure. We recently added Claude Code as a client that you can easily enable with one click in Docker Desktop.<\/p>\n<p>In this guide, you\u2019ll learn how to:<\/p>\n<p>Set up Claude Code and connect it to Docker MCP Toolkit.<\/p>\n<p>Configure the Atlassian MCP server for Jira integration.\u00a0\u00a0<\/p>\n<p>Configure the GitHub MCP server to access repository history and run git commands.<\/p>\n<p>Configure the Filesystem MCP server to scan and read your local codebase.<\/p>\n<p>Automate tech debt tracking by converting 15 TODO comments into tracked Jira tickets.<\/p>\n<p>See how Claude Code can query git history, categorize issues, and create tickets \u2014 all without leaving your development environment.<\/p>\n<p>With more than 200 pre-built, <a href=\"https:\/\/hub.docker.com\/mcp\" target=\"_blank\">containerized MCP servers<\/a>, one-click deployment in Docker Desktop, and automatic credential handling, developers can connect Claude Code to trusted environments in minutes \u2014 not hours. No dependency issues, no manual configuration, just a consistent, secure workflow across Mac, Windows, and Linux.<\/p>\n<h3 class=\"wp-block-heading\">Why Claude Code and Docker MCP Toolkit work better together\u00a0<\/h3>\n<p>While MCP provides the protocol, Docker MCP Toolkit makes it practical. Without containerization, setting up MCP servers means managing Node.js versions, Python dependencies, credentials in plaintext config files, and different configurations for every developer\u2019s machine. The setup that should take 2 minutes takes 2-6 hours per developer.<\/p>\n<p>Docker MCP Toolkit eliminates this friction:<\/p>\n<p><strong>200+ pre-built MCP servers<\/strong> in the catalog<\/p>\n<p><strong>One-click deployment<\/strong> through Docker Desktop<\/p>\n<p><strong>Secure credential management<\/strong> via OAuth or encrypted storage<\/p>\n<p><strong>Consistent configuration<\/strong> across Mac, Windows, and Linux<\/p>\n<p><strong>Automatic updates<\/strong> when new server versions release<\/p>\n<p>We built Docker MCP Toolkit to meet developers where they are. If you\u2019re using Claude Code, you should be able to connect it to your tools without wrestling with infrastructure.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Setting up Claude Code in Docker MCP Toolkit<\/strong><\/h2>\n<h3 class=\"wp-block-heading\">Prerequisites<\/h3>\n<p><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">Install Docker Desktop<\/a> 4.40 or later<\/p>\n<p><a href=\"https:\/\/docs.docker.com\/ai\/mcp-catalog-and-toolkit\/get-started\/#enable-docker-mcp-toolkit\" target=\"_blank\">Enable MCP Toolkit<\/a><\/p>\n<h3 class=\"wp-block-heading\">Step 1. Install Claude Code<\/h3>\n<p>To install Claude Code, run the following command:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n# Install Claude Code<br \/>\ncurl -fsSL https:\/\/claude.ai\/install.sh | sh\n<p># Verify installation<br \/>\nclaude &#8211;version  # Should show 2.0.5+<\/p>\n<\/div>\n<h3 class=\"wp-block-heading\">Step 2. Connect Claude Code to Docker MCP Toolkit<\/h3>\n<h4 class=\"wp-block-heading\"><strong>Option 1: One-Click Connection (Recommended)<\/strong><\/h4>\n<p>Open Docker Desktop<\/p>\n<p>Navigate to <strong>MCP Toolkit<\/strong> in the sidebar<\/p>\n<p>Click the <strong>Clients<\/strong> tab<\/p>\n<p>Find \u201cClaude Code\u201d in the list.<\/p>\n<p>Click <strong>Connect<\/strong><\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<p>Docker Desktop automatically configures the MCP Gateway connection.<\/p>\n\n<h4 class=\"wp-block-heading\"><strong>Option 2: Manual Command Line Setup<\/strong><\/h4>\n<p>If you prefer a command-line setup or need to configure a specific project:<\/p>\n<p>Navigate to your project folder in the terminal<\/p>\n<p>Run this command:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\ndocker mcp client connect claude-code\n<\/div>\n<p>You\u2019ll see output like this:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n=== Project-wide MCP Configurations (\/your\/project\/path) ===<br \/>\n \u25cf claude-code: connected<br \/>\n   MCP_DOCKER: Docker MCP Catalog (gateway server) (stdio)<br \/>\n \u25cf cursor: no mcp configured<br \/>\n \u25cf vscode: no mcp configured<br \/>\nYou might have to restart &#8216;claude-code&#8217;.\n<\/div>\n<p>The connected status confirms Claude Code is linked to the Docker MCP Gateway.<\/p>\n<h4 class=\"wp-block-heading\">What\u2019s happening under the hood?<\/h4>\n<p>The connection command creates a .mcp.json file in your project directory:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n{<br \/>\n  &#8220;mcpServers&#8221;: {<br \/>\n    &#8220;MCP_DOCKER&#8221;: {<br \/>\n      &#8220;command&#8221;: &#8220;docker&#8221;,<br \/>\n      &#8220;args&#8221;: [&#8220;mcp&#8221;, &#8220;gateway&#8221;, &#8220;run&#8221;],<br \/>\n      &#8220;type&#8221;: &#8220;stdio&#8221;<br \/>\n    }<br \/>\n  }<br \/>\n}\n<\/div>\n<p>This configuration tells Claude Code to use Docker\u2019s MCP Gateway for all MCP server access. The gateway handles routing to your containerized servers.<\/p>\n<h3 class=\"wp-block-heading\">Step 3. Restart Claude Code<\/h3>\n<div class=\"wp-block-syntaxhighlighter-code \">\n# Exit Claude Code if running, then restart<br \/>\nclaude code\n<\/div>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<h3 class=\"wp-block-heading\">Step 4. Verify the Connection<\/h3>\n<p>Inside Claude Code, type \/mcp to see available MCP servers.<\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n<p>You should see the Docker MCP Gateway listed, which provides access to all enabled MCP servers. The \/MCP_DOCKER tools indicate a successful connection. As you enable more MCP servers in Docker Desktop, they\u2019ll appear here automatically.<\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<h3 class=\"wp-block-heading\"><strong>First Run: What to Expect<\/strong><\/h3>\n<p>When you start Claude Code for the first time after connecting to Docker MCP Toolkit, you\u2019ll see a prompt about the new MCP server:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nNew MCP server found in .mcp.json: MCP_DOCKER\n<p>MCP servers may execute code or access system resources. All tool calls require approval.<br \/>\nLearn more in the MCP documentation (https:\/\/docs.claude.com\/s\/claude-code-mcp).<\/p>\n<p>\u276f 1. Use this and all future MCP servers in this project<br \/>\n  2. Use this MCP server<br \/>\n  3. Continue without using this MCP server<\/p>\n<p>Enter to confirm \u00b7 Esc to reject\n<\/p><\/div>\n<p><strong>Choose Option 1<\/strong> (recommended). This configures your project to automatically use Docker MCP Toolkit and any MCP servers you enable in Docker Desktop. You won\u2019t need to approve MCP servers individually each time.<\/p>\n<p>After confirming, you\u2019ll see the Claude Code home screen:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nClaude Code v2.0.5\n<p>Welcome back!<\/p>\n<p>Sonnet 4.5 \u00b7 API Usage Billing<br \/>\n\/\u2026\/your\/project\/path<\/p>\n<p>Tips for getting started<br \/>\n  Run \/init to create a CLAUDE.md file with\u2026<br \/>\n  Run \/terminal-setup to set up terminal in\u2026<br \/>\n  Use claude to help with file analysis, ed\u2026<br \/>\n  Be as specific as you would with another \u2026<\/p>\n<p>Recent activity<br \/>\n  No recent activity<\/p>\n<\/div>\n<p>You\u2019re now ready to use Claude Code with MCP servers from Docker Desktop.<\/p>\n<h2 class=\"wp-block-heading\">Real-World Demo: TODO-to-Ticket Automation Demo<\/h2>\n<p>Now that you\u2019ve connected Claude Code to Docker MCP Toolkit, let\u2019s see it in action with a practical example. We\u2019ll automatically convert TODO comments in a real codebase into tracked Jira tickets \u2014 complete with git history, priority categorization, and proper linking.<\/p>\n<h3 class=\"wp-block-heading\">Configuring the required MCP Servers<\/h3>\n<p>For this automation, we\u2019ll orchestrate three MCP servers:<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/mcp\/server\/filesystem\/overview\" target=\"_blank\"><strong>Filesystem MCP<\/strong> <\/a>\u2013 to scan your codebase and read source files<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/mcp\/server\/github-official\/overview\" target=\"_blank\"><strong>GitHub MCP<\/strong><\/a> \u2013 to run git blame and extract author information<\/p>\n<p><a href=\"https:\/\/hub.docker.com\/mcp\/server\/atlassian\/overview\" target=\"_blank\"><strong>Atlassian (Jira) MCP<\/strong><\/a> \u2013 to create and manage Jira issues<\/p>\n<p>We\u2019ll walk through enabling and configuring all three MCP servers.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">What makes this realistic?<\/h3>\n<p>Uses actual codebase (catalog-service-node)\u00a0<\/p>\n<p>Extracts git blame info to identify code authors\u00a0<\/p>\n<p>Categorizes by business priority using keyword analysis\u00a0<\/p>\n<p>Creates properly formatted Jira issues with context\u00a0<\/p>\n<p>Links back to exact file\/line numbers for easy navigation<\/p>\n<h3 class=\"wp-block-heading\">Time investment:\u00a0<\/h3>\n<p>Manual process: ~20-30 minutes\u00a0<\/p>\n<p>Automated with Claude Code + MCP: ~2 minutes total\u00a0<\/p>\n<p>Let\u2019s walk through it step-by-step.<\/p>\n<h3 class=\"wp-block-heading\">1. Configure the Atlassian MCP Server<\/h3>\n<p>In Docker Desktop \u2192 MCP Toolkit \u2192 Catalog:<\/p>\n<p>Search \u201cAtlassian\u201d<\/p>\n<p>Click <strong>+ Add<\/strong><\/p>\n<p>Go to <strong>Configuration<\/strong> tab<\/p>\n<p>Add your Atlassian credentials:<\/p>\n<p>atlassian.jira.url: https:\/\/yourcompany.atlassian.net<\/p>\n<p>atlassian.jira.username: your email<\/p>\n<p>API tokens in the Secrets section<\/p>\n<p><strong>Important notes:<\/strong><\/p>\n<p>For Atlassian API authentication, the \u201cusername\u201d is always your Atlassian account email address, which you use together with the API token for basic authentication<\/p>\n<p>Click <strong>Start Server<\/strong><\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<p>As shown in the screenshot, the Atlassian MCP provides 37 tools, including:<\/p>\n<p>jira_create_issue \u2013 Create Jira issues<\/p>\n<p>jira_add_comment \u2013 Add comments<\/p>\n<p>jira_batch_create_issues \u2013 Bulk create<\/p>\n<p>And many more Jira operations<\/p>\n<p>For this demonstration, I created a new JIRA project called \u201cTODO Demo\u201d with a project key \u201cTD\u201d.<\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<h3 class=\"wp-block-heading\">2. Configure GitHub MCP Server<\/h3>\n<p>The GitHub MCP server supports two authentication methods. We recommend OAuth for the easiest setup.<\/p>\n<h4 class=\"wp-block-heading\"><strong>Option A: OAuth Authentication (Recommended \u2013 Easiest)<\/strong><\/h4>\n<div class=\"wp-block-ponyo-image\"><\/div>\n<p>Open Docker Desktop \u2192 <strong>MCP Toolkit<\/strong> \u2192 <strong>Catalog<\/strong><\/p>\n<p>Search for \u201cGitHub\u201d<\/p>\n<p>Find <strong>GitHub Official<\/strong> and click <strong>+ Add<\/strong><\/p>\n<p>Go to the <strong>Configuration<\/strong> tab<\/p>\n<p>Select <strong>OAuth<\/strong> as the authentication method<\/p>\n<p>Click the <strong>\u201cauthorize with the GitHub OAuth provider\u201d<\/strong> link<\/p>\n<p>You\u2019ll be redirected to GitHub to authorize the connection<\/p>\n<p>After authorization, return to Docker Desktop<\/p>\n<p>Click <strong>Start Server<\/strong><\/p>\n<p><strong>Advantage:<\/strong> No manual token creation needed. Authorization happens through GitHub\u2019s secure OAuth flow.<\/p>\n\n<h4 class=\"wp-block-heading\"><strong>Option B: Personal Access Token (PAT)<\/strong><\/h4>\n<p>If you prefer to use a Personal Access Token or need more granular control:<\/p>\n<p><strong>Step 1: Create a GitHub Personal Access Token<\/strong><\/p>\n<p>Go to GitHub.com and sign in to your account<\/p>\n<p>Click your profile picture in the top-right corner<\/p>\n<p>Select \u201cSettings\u201d<\/p>\n<p>Scroll down to \u201cDeveloper settings\u201d in the left sidebar<\/p>\n<p>Click on \u201cPersonal access tokens\u201d \u2192 \u201cTokens (classic)\u201d<\/p>\n<p>Click \u201cGenerate new token\u201d \u2192 \u201cGenerate new token (classic)\u201d<\/p>\n<p>Give your token a descriptive name like \u201cDocker MCP GitHub Access\u201d<\/p>\n<p>Select the following scopes (permissions):<\/p>\n<p>repo (Full control of private repositories)<\/p>\n<p>workflow (if you need workflow actions)<\/p>\n<p>read:org (if you need organization access)<\/p>\n<p>Click \u201cGenerate token\u201d and <strong>copy the token immediately<\/strong> (you won\u2019t see it again!)<\/p>\n<p><strong>Step 2: Configure in Docker Desktop<\/strong><\/p>\n<p>In Docker Desktop \u2192 <strong>MCP Toolkit<\/strong> \u2192 <strong>Catalog<\/strong><\/p>\n<p>Find <strong>GitHub Official<\/strong> and click <strong>+ Add<\/strong><\/p>\n<p>Go to the <strong>Configuration<\/strong> tab<\/p>\n<p>Select <strong>Personal Access Token<\/strong> as the authentication method<\/p>\n<p>Paste your token in the provided field<\/p>\n<p>Click <strong>Start Server<\/strong><\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<p>Or via CLI:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\ndocker mcp secret set GITHUB.PERSONAL_ACCESS_TOKEN=github_pat_YOUR_TOKEN_HERE\n<\/div>\n<p>This gives users the flexibility to choose the method that works best for their workflow, with OAuth being the simpler path for most users.<\/p>\n\n<h3 class=\"wp-block-heading\"><strong>3. Configure Filesystem MCP Server<\/strong><\/h3>\n<p>The Filesystem MCP server allows Claude Code to read files from your local system. You need to specify which directories it can access.<\/p>\n<p>Step 1: Enable Filesystem MCP Server<\/p>\n<p>Open Docker Desktop \u2192 <strong>MCP Toolkit<\/strong> \u2192 <strong>Catalog<\/strong><\/p>\n<p>Search for \u201cFilesystem\u201d<\/p>\n<p>Find <strong>Filesystem (Reference)<\/strong> and click <strong>+ Add<\/strong><\/p>\n<p>Step 2: Configure Allowed Paths<\/p>\n<p>Go to the <strong>Configuration<\/strong> tab<\/p>\n<p>Under <strong>filesystem.paths<\/strong>, add the directories Claude Code should access<\/p>\n<p>For this demo, add your project directory (e.g., \/Users\/your_username\/ or your project path)<\/p>\n<p>You can add multiple paths by clicking the <strong>+<\/strong> button<\/p>\n<p>Click <strong>Save<\/strong><\/p>\n<p>Click <strong>Start Server<\/strong><\/p>\n<p><strong>Important:<\/strong> Only grant access to directories you\u2019re comfortable with Claude Code reading. The Filesystem MCP server is scoped to these specific paths for security.<\/p>\n\n<h3 class=\"wp-block-heading\">Run the Automation<\/h3>\n<p>Clone the repository<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\ngit clone https:\/\/github.com\/ajeetraina\/catalog-service-node\n<\/div>\n<p>Change directory to catalog-service-node and run the following command:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nclaude code\n<\/div>\n<p>Paste this instruction into Claude Code:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\nScan this codebase for all TODO and FIXME comments.<br \/>\nFor each one:<br \/>\n1. Extract the comment and surrounding code context (5 lines before\/after)<br \/>\n2. Use git blame to identify who wrote it and when<br \/>\n3. Determine priority based on keywords:<br \/>\n   &#8211; High: &#8220;race condition&#8221;, &#8220;data loss&#8221;, &#8220;security&#8221;, &#8220;failure&#8221;, &#8220;crash&#8221;<br \/>\n   &#8211; Medium: &#8220;performance&#8221;, &#8220;slow&#8221;, &#8220;cache&#8221;, &#8220;optimization&#8221;<br \/>\n   &#8211; Low: &#8220;documentation&#8221;, &#8220;refactor&#8221;, &#8220;cleanup&#8221;<br \/>\n4. Create a Jira issue with:<br \/>\n   &#8211; Project: TD<br \/>\n   &#8211; Issue Type: Task<br \/>\n   &#8211; Summary: Extract from the TODO\/FIXME comment<br \/>\n   &#8211; Description: Include code context and explanation<br \/>\n   &#8211; Priority: Based on categorization above (use additional_fields: {&#8220;priority&#8221;: {&#8220;name&#8221;: &#8220;High&#8221;}})<br \/>\n   &#8211; Labels: [&#8220;tech-debt&#8221;]<br \/>\n   &#8211; Add a comment with link to exact GitHub file and line number\n<p>Provide a summary showing:<br \/>\n&#8211; Total TODOs\/FIXMEs found<br \/>\n&#8211; Breakdown by priority (High\/Medium\/Low)<br \/>\n&#8211; List of created Jira issues with links<\/p>\n<\/div>\n<h3 class=\"wp-block-heading\">Watch Claude Code Work<\/h3>\n<p>Claude Code will orchestrate multiple MCP servers to complete this task:<\/p>\n<p><strong>Filesystem MCP<\/strong> to scan your src\/ directory<\/p>\n<p><strong>GitHub MCP<\/strong> to run git blame and get author info<\/p>\n<p><strong>Atlassian MCP<\/strong> to create Jira issues in your TODO Demo project<\/p>\n<p>Here\u2019s what the output looks like:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n I&#8217;ll scan the codebase for TODO and FIXME comments, analyze them, and create Jira issues for tracking.\n<p>\u23fa Search(pattern: &#8220;(TODO|FIXME|XXX|HACK):&#8221;, output_mode: &#8220;content&#8221;)<br \/>\n  \u23bf  Found 22 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Now let me read each file to get the full context around the TODO\/FIXME comments (excluding git hooks):<\/p>\n<p>\u23fa Read(src\/services\/StorageService.js)<br \/>\n  \u23bf  Read 70 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Read(src\/services\/InventoryService.js)<br \/>\n  \u23bf  Read 55 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Read(src\/services\/ProductService.js)<br \/>\n  \u23bf  Read 117 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Read(src\/services\/PublisherService.js)<br \/>\n  \u23bf  Read 67 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Read(src\/index.js)<br \/>\n  \u23bf  Read 100 lines (ctrl+o to expand)<\/p>\n<\/div>\n<p>Next, Claude Code runs git blame to identify who created each TODO:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n\u23fa Now let me run git blame on each file to identify authors and dates:\n<p>\u23fa Bash(git blame -L 1,15 src\/services\/StorageService.js)<br \/>\n  \u23bf  4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  1) \/\/ FIXME: No error handling for S3 upload failures<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  2) \/\/ Failed uploads leave products without images<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  3) \/\/ Need to rollback product creation or retry upload<br \/>\n     \u2026 +12 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Bash(git blame -L 1,15 src\/services\/InventoryService.js)<br \/>\n  \u23bf  4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  1) \/\/ FIXME: No retry logic for inventory service failures<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  2) \/\/ When WireMock\/external service is down, requests fail immediately<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  3) \/\/ Need exponential backoff retry mechanism<br \/>\n     \u2026 +12 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Bash(git blame -L 1,13 src\/services\/ProductService.js)<br \/>\n  \u23bf 4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  1)<br \/>\n    4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  2) \/\/ TODO: Add pagination support for product listing<br \/>\n    4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  3) \/\/ Currently returns all products &#8211; will cause performance issues with large<br \/>\n    \u2026 +11 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Bash(git blame -L 1,16 src\/services\/PublisherService.js)<br \/>\n  \u23bf  4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  1) \/\/ FIXME: Kafka publish failures are silently ignored<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  2) \/\/ If Kafka is unavailable, product updates aren&#8217;t tracked<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  3) \/\/ Need dead letter queue or retry mechanism<br \/>\n     \u2026 +13 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Bash(git blame -L 1,12 src\/index.js)<br \/>\n  \u23bf  4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  1) \/\/ TODO: Add request rate limiting<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  2) \/\/ API has no throttling, vulnerable to abuse<br \/>\n     4bdb4454 (Ajeet Raina 2025-10-03 20:08:01 +0530  3) \/\/ Need per-IP rate limiting<br \/>\n     \u2026 +9 lines (ctrl+o to expand)<\/p>\n<p>\u23fa Now let me categorize by priority and create Jira issues. First, let me get the GitHub remote URL to include in the Jira issues:<\/p>\n<p>\u23fa Bash(git remote get-url origin)<br \/>\n  \u23bf  https:\/\/github.com\/ajeetraina\/catalog-service-node<\/p>\n<\/div>\n<p>Claude Code then categorizes issues by priority and creates Jira tickets:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n Now I&#8217;ll create Jira issues for all the TODO\/FIXME comments. Based on my analysis:\n<p>  HIGH Priority (contains keywords: race condition, data loss, security, failure, crash):<br \/>\n  1. Inventory sync race condition<br \/>\n  2. S3 upload failures (data loss potential)<br \/>\n  3. Kafka publish failures (data loss)<br \/>\n  4. Kafka acknowledgment handling (data loss)<br \/>\n  5. Error responses expose internal details (security)<br \/>\n  6. Inventory service failures<\/p>\n<p>  MEDIUM Priority (performance, slow, cache, optimization):<br \/>\n  1. Cache inventory data (performance)<br \/>\n  2. Add pagination support (performance)<br \/>\n  3. Image resizing\/optimization (performance)<br \/>\n  4. Batch publishing (performance)<\/p>\n<p>  LOW Priority (documentation, refactor, cleanup):<br \/>\n  1. LocalStack configuration not documented<br \/>\n  2. Product deletion doesn&#8217;t clean up S3 images (cleanup)<br \/>\n  3. No validation for duplicate SKUs<br \/>\n  4. Request rate limiting<br \/>\n  5. Health check endpoint<br \/>\n  6. Event schema versioning<br \/>\n  7. Multiple images per product<br \/>\n  8. Search functionality<br \/>\n  9. Inventory low-stock alerts<\/p>\n<\/div>\n<p>In under 2 minutes, Claude Code has:<\/p>\n<p>Scanned the entire codebase<\/p>\n<p>Identified 15+ TODO\/FIXME comments<\/p>\n<p>Retrieved git history for each one<\/p>\n<p>Categorized them by business priority<\/p>\n<p>Created properly formatted Jira issues with full context<\/p>\n<p>Linked each issue back to the exact file and line number<\/p>\n<p>What would have taken 20-30 minutes of manual work is now automated and consistent. This Jira automation is just one example. Here\u2019s how MCP transforms other common development workflows:<\/p>\n<h2 class=\"wp-block-heading\"><strong>Workflow Comparison: Before vs. After MCP<\/strong><\/h2>\n<div class=\"wp-block-ponyo-table style__default\">\n<p>Task<\/p>\n<p>Before MCP (Manual)<\/p>\n<p>After MCP (Automated)<\/p>\n<p>Time Saved<\/p>\n<p><strong>Debug Checkout Failures<\/strong><\/p>\n<p>1. Ask Claude for SQL query<\/p>\n<p>2. Copy query to database client<\/p>\n<p>3. Run query and copy results<\/p>\n<p>4. Paste results back to Claude<\/p>\n<p>5. Get analysis<\/p>\n<p>6. Ask Claude to draft GitHub issue<\/p>\n<p>7. Manually create issue in GitHub<\/p>\n<p>8. Notify team in Slack<\/p>\n<p><strong>You<\/strong>: \u201cWhy are checkouts failing? Investigate and create a GitHub issue.\u201d\u00a0<\/p>\n<p><strong>Claude Code<\/strong>: Queries production database, finds 23% payment timeouts, identifies root cause as connection pool exhaustion, creates GitHub issue #1847, posts to #backend-alerts on Slack.\u00a0<br \/><strong>Result<\/strong>: Done. Issue link provided.<\/p>\n<p>~15 min \u2192 ~2 min<\/p>\n<p><strong>Investigate Performance Issue<\/strong><\/p>\n<p>1. Check multiple monitoring dashboards<\/p>\n<p>2. Export slow query logs<\/p>\n<p>3. Analyze locally<\/p>\n<p>4. Document findings in Google Doc<\/p>\n<p>5. Create Jira ticket manually<\/p>\n<p>6. Add links between doc and ticket<\/p>\n<p>7. Notify team<\/p>\n<p><strong>You<\/strong>: \u201cWhy are API response times spiking?\u201d<\/p>\n<p><strong>Claude Code<\/strong>:<\/p>\n<p>\u2022 Queries slow_queries log<\/p>\n<p>\u2022 Finds: 127 queries taking &gt;2s<\/p>\n<p>\u2022 Identifies missing index on users.email<\/p>\n<p>\u2022 Creates migration file<\/p>\n<p>\u2022 Opens PR with fix<\/p>\n<p>\u2022 Posts summary to #backend<\/p>\n<p>~20 min \u2192 ~3 min<\/p>\n<p><strong>Code Review for Security<\/strong><\/p>\n<p>1. Review PR manually<\/p>\n<p>2. Run security scanner separately<\/p>\n<p>3. Document findings in notepad<\/p>\n<p>4. Post review comments one by one<\/p>\n<p>5. Create tracking ticket for issues<\/p>\n<p>6. Update security dashboard<\/p>\n<p><strong>You<\/strong>: \u201cReview PR #234 for security issues\u201d<\/p>\n<p><strong>Claude Code<\/strong>:<\/p>\n<p>\u2022 Analyzes 12 changed files<\/p>\n<p>\u2022 Finds hardcoded API key (config.js:47)<\/p>\n<p>\u2022 Finds: SQL injection risk in query build<\/p>\n<p>\u2022 Posts inline review comments with fixes<\/p>\n<p>\u2022 Creates security ticket SEC-445<\/p>\n<p>\u2022 Updates security tracking board<\/p>\n<p>~25 min \u2192 ~4 min<\/p>\n<\/div>\n<p>From 15 minutes of context switching to 2-3 minutes of continuous flow.<\/p>\n<div class=\"wp-block-ponyo-image\"><\/div>\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n<p>You\u2019ve just seen how <a href=\"https:\/\/www.docker.com\/products\/mcp-catalog-and-toolkit\/\">Docker MCP Toolkit<\/a> transforms Claude Code from an isolated coding assistant into an integrated development partner. What used to require copying between terminals, web browsers, and documentation now happens in one continuous flow.\u00a0<\/p>\n<h3 class=\"wp-block-heading\">Next steps:<\/h3>\n<p>Explore the 220+ MCP servers in the <a href=\"https:\/\/hub.docker.com\/mcp\" target=\"_blank\">Docker MCP catalog<\/a><\/p>\n<p>Connect Claude Code to your databases, APIs, and tools<\/p>\n<p>Share your setup with your team for consistent workflows<\/p>\n<p>The future of development isn\u2019t about switching between tools \u2014 it\u2019s about tools that work together seamlessly. Docker MCP Toolkit makes that future available today.<\/p>\n\n<h3 class=\"wp-block-heading\">Learn more<\/h3>\n<p><a href=\"https:\/\/hub.docker.com\/mcp\" target=\"_blank\">Explore the MCP Catalog<\/a>: Discover containerized, security-hardened MCP servers<\/p>\n<p><a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">Download Docker Desktop to get started with the MCP Toolkit<\/a>: Run MCP servers easily and securely<\/p>\n<p>Check out our<a href=\"https:\/\/www.docker.com\/blog\/mcp-horror-stories-the-supply-chain-attack\/\"> MCP Horror Stories<\/a> series to see common MCP security pitfalls and how you can avoid them<\/p>","protected":false},"excerpt":{"rendered":"<p>AI coding assistants have evolved from simple autocomplete tools into full development partners. Yet even the best of them, like [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"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-2581","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/2581","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"}],"replies":[{"embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/comments?post=2581"}],"version-history":[{"count":0,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/posts\/2581\/revisions"}],"wp:attachment":[{"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/media?parent=2581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/categories?post=2581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rssfeedtelegrambot.bnaya.co.il\/index.php\/wp-json\/wp\/v2\/tags?post=2581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}