{"id":68845,"date":"2026-08-17T10:54:12","date_gmt":"2026-08-17T08:54:12","guid":{"rendered":"https:\/\/www.inovex.de\/?p=68845"},"modified":"2026-08-17T10:54:12","modified_gmt":"2026-08-17T08:54:12","slug":"bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/","title":{"rendered":"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &#038; Gemini CLI)"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Integrating Model Context Protocol (MCP) servers with developer tooling provides language models with direct, structured context from local environments. When paired with tools like Microsoft&#8217;s Power BI Modeling MCP, CLI agents such as <\/span><b>Claude Code (claude)<\/b><span style=\"font-weight: 400;\"> and <\/span><b>Gemini CLI (gemini)<\/b><span style=\"font-weight: 400;\"> can inspect tabular models, execute DAX queries, and modify TMDL definitions in real time against local Power BI Desktop instances.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">However, security best practices dictate that AI CLI agents run inside sandboxed environments (such as Podman or Docker Linux containers). This creates a sharp conflict when trying to execute Windows-native binaries from within an isolated Linux runtime.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">This article details the architectural barriers involved\u2014including Windows 11 Hyper-V Firewall restrictions\u2014and provides a lightweight Node.js proxy script that bridges communication between sandboxed CLI agents and native Win<\/span><span style=\"font-weight: 400;\">dows executables.<\/span><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Technical-Challenges-on-Windows-Host-Systems\" >Technical Challenges on Windows Host Systems<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Implementation-Guide\" >Implementation Guide<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Step-1-Configure-Windows-Hyper-V-Firewall-Rules\" >Step 1: Configure Windows Hyper-V Firewall Rules<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Step-2-Deploy-the-Nodejs-Bridge-Script-bridgejs\" >Step 2: Deploy the Node.js Bridge Script (bridge.js)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Step-3-Configure-Your-CLI-Clients\" >Step 3: Configure Your CLI Clients<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Option-A-Gemini-CLI-gemini-Configuration\" >Option A: Gemini CLI (gemini) Configuration<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Option-B-Claude-CLI-claude-Claude-Code-Configuration\" >Option B: Claude CLI (claude \/ Claude Code) Configuration<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Step-4-Verification-and-Workflow\" >Step 4: Verification and Workflow<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Technical-Challenges-on-Windows-Host-Systems\"><\/span><b>Technical Challenges on Windows Host Systems<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">When running agent CLIs with container sandboxing enabled, four key friction points emerge:<\/span><\/p>\n<ol>\n<li style=\"font-weight: 400;\"><b>Operating System and DLL Incompatibilities<\/b><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">The Power BI Modeling MCP server binary (.exe) relies on Windows system libraries like iphlpapi.dll (IP Helper API) to discover running Power BI Desktop instances. Inside a Linux container sandbox, these Windows libraries do not exist, causing standard Linux execution attempts to fail immediately.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Transport Layer Disconnect (stdio vs. HTTP\/SSE)<\/b><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">MCP servers typically communicate via Standard Input\/Output (stdio). A containerized sandbox cannot attach native stdio streams directly to an executable running on the host OS. Communication must be converted to network protocols like HTTP or SSE.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Hyper-V Firewall Restrictions (Windows 11 22H2+)<\/b><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">The Hyper-V Firewall filters traffic flowing through virtual network adapters created for container runtimes and WSL. Even if standard Windows Defender Firewall ports are open, inbound traffic from the container virtual switch to the host will be dropped by default unless explicitly allowed.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Stream Framing and JSON-RPC Protocol Differences<\/b><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">MCP implementations on Windows frequently frame JSON payloads across fragmented data chunks or attach length headers. Raw TCP forwarding leads to parsing failures such as Unexpected end of JSON input. Additionally, standard JSON-RPC notification methods (such as notifications\/initialized) do not expect responses, causing synchronous listeners to time out.<\/span><\/li>\n<\/ol>\n<p>The rough outline for Claude and for gemini are shown below:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-68855\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi.png\" alt=\"\" width=\"1636\" height=\"491\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi.png 1636w, https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi-300x90.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi-1024x307.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi-768x230.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi-1536x461.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi-400x120.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/claude-mcp-powerbi-360x108.png 360w\" sizes=\"auto, (max-width: 1636px) 100vw, 1636px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-68857\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi.png\" alt=\"\" width=\"1636\" height=\"491\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi.png 1636w, https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi-300x90.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi-1024x307.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi-768x230.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi-1536x461.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi-400x120.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/gemini-mcp-powerbi-360x108.png 360w\" sizes=\"auto, (max-width: 1636px) 100vw, 1636px\" \/><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Implementation-Guide\"><\/span><b>Implementation Guide<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"Step-1-Configure-Windows-Hyper-V-Firewall-Rules\"><\/span><b>Step 1: Configure Windows Hyper-V Firewall Rules<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Because container traffic is routed through a Hyper-V Virtual Switch, execute the following command in PowerShell as <\/span><b>Administrator<\/b><span style=\"font-weight: 400;\"> to permit inbound traffic on port 3000 from the container switch:<\/span><\/p>\n<pre class=\"\"><span style=\"font-weight: 400;\">New-NetFirewallHyperVRule<\/span> <span style=\"font-weight: 400;\">-Name<\/span> <span style=\"font-weight: 400;\">\"AllowMCPBridgeInbound\"<\/span><span style=\"font-weight: 400;\"> `<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">-DisplayName<\/span> <span style=\"font-weight: 400;\">\"Allow Inbound MCP Proxy Bridge from Sandbox\"<\/span><span style=\"font-weight: 400;\"> `<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">-Direction<\/span><span style=\"font-weight: 400;\"> Inbound `<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">-VMCreatorId<\/span> <span style=\"font-weight: 400;\">'{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}'<\/span><span style=\"font-weight: 400;\"> `<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">-Protocol<\/span><span style=\"font-weight: 400;\"> TCP `<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">-LocalPorts<\/span> <span style=\"font-weight: 400;\">3000<\/span><span style=\"font-weight: 400;\"> `<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">-Action<\/span><span style=\"font-weight: 400;\"> Allow<\/span>\r\n\r\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Step-2-Deploy-the-Nodejs-Bridge-Script-bridgejs\"><\/span><b>Step 2: Deploy the Node.js Bridge Script (bridge.js)<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Save this proxy script on your Windows host. It handles non-blocking notifications, aggregates fragmented stdout buffers, and exposes the executable over HTTP.<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> { spawn } = <\/span><span style=\"font-weight: 400;\">require<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">'child_process'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> http = <\/span><span style=\"font-weight: 400;\">require<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">'http'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> args = process.argv.slice(<\/span><span style=\"font-weight: 400;\">2<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> help = args.includes(<\/span><span style=\"font-weight: 400;\">'--help'<\/span><span style=\"font-weight: 400;\">) || args.includes(<\/span><span style=\"font-weight: 400;\">'-h'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> verbose = args.includes(<\/span><span style=\"font-weight: 400;\">'--verbose'<\/span><span style=\"font-weight: 400;\">) || args.includes(<\/span><span style=\"font-weight: 400;\">'-v'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> exePath = args.find(<\/span><span style=\"font-weight: 400;\">arg =&gt;<\/span><span style=\"font-weight: 400;\"> !arg.startsWith(<\/span><span style=\"font-weight: 400;\">'-'<\/span><span style=\"font-weight: 400;\">));<\/span>\r\n\r\n<span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (help || !exePath) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`<\/span>\r\n<span style=\"font-weight: 400;\">Power BI MCP Bridge<\/span>\r\n<span style=\"font-weight: 400;\">Usage: node bridge.js [path-to-exe] [options]<\/span>\r\n\r\n<span style=\"font-weight: 400;\">Arguments:<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 path-to-exe\u00a0 \u00a0 \u00a0 Full path to the native Windows MCP executable.<\/span>\r\n\r\n<span style=\"font-weight: 400;\">Options:<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 -v, --verbose\u00a0 \u00a0 Log raw JSON-RPC payloads and chunk buffering status.<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 -h, --help \u00a0 \u00a0 \u00a0 Display this help message.<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 `<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 process.exit(<\/span><span style=\"font-weight: 400;\">0<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">}<\/span>\r\n\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> getTimestamp = <\/span><span style=\"font-weight: 400;\">() =&gt;<\/span> <span style=\"font-weight: 400;\">`[${<\/span><span style=\"font-weight: 400;\">new<\/span> <span style=\"font-weight: 400;\">Date<\/span><span style=\"font-weight: 400;\">().toLocaleTimeString()}]`<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> mcpProcess = spawn(exePath, [<\/span><span style=\"font-weight: 400;\">'--start'<\/span><span style=\"font-weight: 400;\">]);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">let<\/span><span style=\"font-weight: 400;\"> currentResponse = <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">let<\/span><span style=\"font-weight: 400;\"> responseBuffer = <\/span><span style=\"font-weight: 400;\">\"\"<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n\r\n<span style=\"font-weight: 400;\">mcpProcess.stderr.on(<\/span><span style=\"font-weight: 400;\">'data'<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">(data) =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.error(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} [EXE LOG\/ERROR]: ${data.toString().trim()}`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">});<\/span>\r\n\r\n<span style=\"font-weight: 400;\">mcpProcess.stdout.on(<\/span><span style=\"font-weight: 400;\">'data'<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">(data) =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (!currentResponse) <\/span><span style=\"font-weight: 400;\">return<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 responseBuffer += data.toString();<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> jsonStartIndex = responseBuffer.indexOf(<\/span><span style=\"font-weight: 400;\">'{'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (jsonStartIndex !== -<\/span><span style=\"font-weight: 400;\">1<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> payloadCandidate = responseBuffer.substring(jsonStartIndex);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">try<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">JSON<\/span><span style=\"font-weight: 400;\">.parse(payloadCandidate);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (verbose) <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} [RESPONSE] Valid JSON assembled. Returning to agent.`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 currentResponse.writeHead(<\/span><span style=\"font-weight: 400;\">200<\/span><span style=\"font-weight: 400;\">, { <\/span><span style=\"font-weight: 400;\">'Content-Type'<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">'application\/json'<\/span><span style=\"font-weight: 400;\"> });<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 currentResponse.end(payloadCandidate.trim());<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 currentResponse = <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 responseBuffer = <\/span><span style=\"font-weight: 400;\">\"\"<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"font-weight: 400;\">catch<\/span><span style=\"font-weight: 400;\"> (e) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (verbose) <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} [BUFFER] Partial JSON received. Awaiting chunks...`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">});<\/span>\r\n\r\n<span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> server = http.createServer(<\/span><span style=\"font-weight: 400;\">(req, res) =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (req.method === <\/span><span style=\"font-weight: 400;\">'POST'<\/span><span style=\"font-weight: 400;\">) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">let<\/span><span style=\"font-weight: 400;\"> requestBody = <\/span><span style=\"font-weight: 400;\">''<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 req.on(<\/span><span style=\"font-weight: 400;\">'data'<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">chunk =&gt;<\/span><span style=\"font-weight: 400;\"> { requestBody += chunk; });<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 req.on(<\/span><span style=\"font-weight: 400;\">'end'<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">() =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">try<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">const<\/span><span style=\"font-weight: 400;\"> parsedPayload = <\/span><span style=\"font-weight: 400;\">JSON<\/span><span style=\"font-weight: 400;\">.parse(requestBody);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (verbose) <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} [REQUEST] Method: ${parsedPayload.method}`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (parsedPayload.method &amp;&amp; parsedPayload.method.startsWith(<\/span><span style=\"font-weight: 400;\">'notifications\/'<\/span><span style=\"font-weight: 400;\">)) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 mcpProcess.stdin.write(requestBody + <\/span><span style=\"font-weight: 400;\">'\\n'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res.writeHead(<\/span><span style=\"font-weight: 400;\">202<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res.end();<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">return<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 currentResponse = res;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 responseBuffer = <\/span><span style=\"font-weight: 400;\">\"\"<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 mcpProcess.stdin.write(requestBody + <\/span><span style=\"font-weight: 400;\">'\\n'<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">setTimeout<\/span><span style=\"font-weight: 400;\">(<\/span><span style=\"font-weight: 400;\">() =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">if<\/span><span style=\"font-weight: 400;\"> (currentResponse === res) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} [TIMEOUT] Method timed out: ${parsedPayload.method}`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res.writeHead(<\/span><span style=\"font-weight: 400;\">504<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res.end(<\/span><span style=\"font-weight: 400;\">JSON<\/span><span style=\"font-weight: 400;\">.stringify({ <\/span><span style=\"font-weight: 400;\">error<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">\"Execution timeout\"<\/span><span style=\"font-weight: 400;\"> }));<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 currentResponse = <\/span><span style=\"font-weight: 400;\">null<\/span><span style=\"font-weight: 400;\">;<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }, <\/span><span style=\"font-weight: 400;\">15000<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } <\/span><span style=\"font-weight: 400;\">catch<\/span><span style=\"font-weight: 400;\"> (err) {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res.writeHead(<\/span><span style=\"font-weight: 400;\">400<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 res.end(<\/span><span style=\"font-weight: 400;\">JSON<\/span><span style=\"font-weight: 400;\">.stringify({ <\/span><span style=\"font-weight: 400;\">error<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">\"Malformed JSON payload\"<\/span><span style=\"font-weight: 400;\"> }));<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 \u00a0 });<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">});<\/span>\r\n\r\n<span style=\"font-weight: 400;\">server.listen(<\/span><span style=\"font-weight: 400;\">3000<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">'0.0.0.0'<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">() =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} Bridge listening on http:\/\/0.0.0.0:3000\/mcp`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">console<\/span><span style=\"font-weight: 400;\">.log(<\/span><span style=\"font-weight: 400;\">`${getTimestamp()} Target executable: ${exePath}`<\/span><span style=\"font-weight: 400;\">);<\/span>\r\n<span style=\"font-weight: 400;\">});<\/span>\r\n\r\n<span style=\"font-weight: 400;\">process.on(<\/span><span style=\"font-weight: 400;\">'SIGINT'<\/span><span style=\"font-weight: 400;\">, <\/span><span style=\"font-weight: 400;\">() =&gt;<\/span><span style=\"font-weight: 400;\"> {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 mcpProcess.kill();<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 process.exit();<\/span>\r\n<span style=\"font-weight: 400;\">});<\/span><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Step-3-Configure-Your-CLI-Clients\"><\/span><b>Step 3: Configure Your CLI Clients<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<h4><span class=\"ez-toc-section\" id=\"Option-A-Gemini-CLI-gemini-Configuration\"><\/span><b>Option A: Gemini CLI (gemini) Configuration<\/b><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Add the bridge entry to your settings.json file:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">{<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 <\/span><span style=\"font-weight: 400;\">\"mcpServers\"<\/span><span style=\"font-weight: 400;\">: {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">\"powerbi-modeling-mcp\"<\/span><span style=\"font-weight: 400;\">: {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">\"httpUrl\"<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">\"http:\/\/host.containers.internal:3000\/mcp\"<\/span><span style=\"font-weight: 400;\">,<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">\"timeout\"<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">30000<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">}<\/span>\r\n<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Option-B-Claude-CLI-claude-Claude-Code-Configuration\"><\/span><b>Option B: Claude CLI (claude \/ Claude Code) Configuration<\/b><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Add the bridge entry to your .mcp.json or ~\/.claude.json file:<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">{<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 <\/span><span style=\"font-weight: 400;\">\"mcpServers\"<\/span><span style=\"font-weight: 400;\">: {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">\"powerbi-modeling-mcp\"<\/span><span style=\"font-weight: 400;\">: {<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">\"type\"<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">\"http\"<\/span><span style=\"font-weight: 400;\">,<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 \u00a0 <\/span><span style=\"font-weight: 400;\">\"url\"<\/span><span style=\"font-weight: 400;\">: <\/span><span style=\"font-weight: 400;\">\"http:\/\/host.containers.internal:3000\/mcp\"<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 \u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">\u00a0 }<\/span>\r\n<span style=\"font-weight: 400;\">}<\/span>\r\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Step-4-Verification-and-Workflow\"><\/span><b>Step 4: Verification and Workflow<\/b><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Start the bridge on the Windows host:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre><span style=\"font-weight: 400;\">node bridge.js <\/span><span style=\"font-weight: 400;\">\"C:\\Path\\To\\powerbi-modeling-mcp.exe\"<\/span><span style=\"font-weight: 400;\"> -<\/span><span style=\"font-weight: 400;\">-verbose<\/span><\/pre>\n<\/li>\n<li style=\"font-weight: 400;\"><span style=\"font-weight: 400;\">Trigger tool discovery in your CLI client of choice:<\/span><\/li>\n<\/ol>\n<ul>\n<li style=\"font-weight: 400;\"><b>For Gemini CLI:<\/b><span style=\"font-weight: 400;\"> \/mcp refresh<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>For Claude CLI:<\/b><span style=\"font-weight: 400;\"> claude mcp list or \/mcp<\/span><\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span><b>Conclusion<\/b><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><span style=\"font-weight: 400;\">By combining targeted Hyper-V Firewall rules with a Node.js proxy bridge, sandboxed CLI agents like <\/span><b>Claude CLI<\/b><span style=\"font-weight: 400;\"> and <\/span><b>Gemini CLI<\/b><span style=\"font-weight: 400;\"> can interact seamlessly with Windows-native MCP servers. This setup preserves full container isolation while granting your AI agents full access to local Power BI models.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Integrating Model Context Protocol (MCP) servers with developer tooling provides language models with direct, structured context from local environments. When paired with tools like Microsoft&#8217;s Power BI Modeling MCP, CLI agents such as Claude Code (claude) and Gemini CLI (gemini) can inspect tabular models, execute DAX queries, and modify TMDL definitions in real time against [&hellip;]<\/p>\n","protected":false},"author":145,"featured_media":69036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[],"service":[76,446,411],"level":[],"coauthors":[{"id":145,"display_name":"Tobias Maasland","user_nicename":"tmaasland"}],"class_list":["post-68845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","service-artificial-intelligence","service-business-intelligence","service-data-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &amp; Gemini CLI) - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Connect sandboxed CLI agents like Claude Code &amp; Gemini to Windows MCP servers. Solve Hyper-V &amp; stdio issues with a lightweight Node.js proxy bridge.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &amp; Gemini CLI) - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Connect sandboxed CLI agents like Claude Code &amp; Gemini to Windows MCP servers. Solve Hyper-V &amp; stdio issues with a lightweight Node.js proxy bridge.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-17T08:54:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1550\" \/>\n\t<meta property=\"og:image:height\" content=\"880\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Tobias Maasland\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents-1024x581.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tobias Maasland\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Tobias Maasland\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/\"},\"author\":{\"name\":\"Tobias Maasland\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a60cf1a6042c68e799e29db3b09696d4\"},\"headline\":\"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &#038; Gemini CLI)\",\"datePublished\":\"2026-08-17T08:54:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/\"},\"wordCount\":559,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png\",\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/\",\"name\":\"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude & Gemini CLI) - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png\",\"datePublished\":\"2026-08-17T08:54:12+00:00\",\"description\":\"Connect sandboxed CLI agents like Claude Code & Gemini to Windows MCP servers. Solve Hyper-V & stdio issues with a lightweight Node.js proxy bridge.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png\",\"width\":1550,\"height\":880},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &#038; Gemini CLI)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a60cf1a6042c68e799e29db3b09696d4\",\"name\":\"Tobias Maasland\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tobias-Maasland-w-96x96.png5cf27c5fdf87e7976084716312e39783\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tobias-Maasland-w-96x96.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Tobias-Maasland-w-96x96.png\",\"caption\":\"Tobias Maasland\"},\"description\":\"Data Product Owner.\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/tmaasland\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude & Gemini CLI) - inovex GmbH","description":"Connect sandboxed CLI agents like Claude Code & Gemini to Windows MCP servers. Solve Hyper-V & stdio issues with a lightweight Node.js proxy bridge.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/","og_locale":"de_DE","og_type":"article","og_title":"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude & Gemini CLI) - inovex GmbH","og_description":"Connect sandboxed CLI agents like Claude Code & Gemini to Windows MCP servers. Solve Hyper-V & stdio issues with a lightweight Node.js proxy bridge.","og_url":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2026-08-17T08:54:12+00:00","og_image":[{"width":1550,"height":880,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png","type":"image\/png"}],"author":"Tobias Maasland","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents-1024x581.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Tobias Maasland","Gesch\u00e4tzte Lesezeit":"5\u00a0Minuten","Written by":"Tobias Maasland"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/"},"author":{"name":"Tobias Maasland","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a60cf1a6042c68e799e29db3b09696d4"},"headline":"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &#038; Gemini CLI)","datePublished":"2026-08-17T08:54:12+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/"},"wordCount":559,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png","inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/","url":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/","name":"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude & Gemini CLI) - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png","datePublished":"2026-08-17T08:54:12+00:00","description":"Connect sandboxed CLI agents like Claude Code & Gemini to Windows MCP servers. Solve Hyper-V & stdio issues with a lightweight Node.js proxy bridge.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Bridge-the-Gap-Running-Native-Windows-MCP-Servers-Inside-Sandboxed-AI-Agents.png","width":1550,"height":880},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/bridge-the-gap-running-native-windows-mcp-servers-inside-sandboxed-ai-agents-claude-gemini-cli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Bridge the Gap: Running Native Windows MCP Servers Inside Sandboxed AI Agents (Claude &#038; Gemini CLI)"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a60cf1a6042c68e799e29db3b09696d4","name":"Tobias Maasland","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tobias-Maasland-w-96x96.png5cf27c5fdf87e7976084716312e39783","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tobias-Maasland-w-96x96.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Tobias-Maasland-w-96x96.png","caption":"Tobias Maasland"},"description":"Data Product Owner.","url":"https:\/\/www.inovex.de\/de\/blog\/author\/tmaasland\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/68845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/145"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=68845"}],"version-history":[{"count":5,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/68845\/revisions"}],"predecessor-version":[{"id":68874,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/68845\/revisions\/68874"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/69036"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=68845"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=68845"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=68845"},{"taxonomy":"level","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/level?post=68845"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=68845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}