MCP Server for Plugin not being installed on Codex Desktop App for Windows
What version of the Codex App are you using (From “About Codex” dialog)?
Version 26.602.40724 • Released Jun 5, 2026
What subscription do you have?
Business ($25/mo)
What platform is your computer?
Microsoft Windows NT 10.0.26100.0 x64
What issue are you seeing?
I have a Plugin that defines an MCP Server for Composio using an .mcp.json file.
I have installed the Plugin.
It launched an authentication challenge in the browser for Composio -- and I allowed it.
The plugin lists the MCP Server:
<img width="787" height="778" alt="Image" src="https://github.com/user-attachments/assets/749c938b-a671-406a-8d15-0213eac1711c" />
-- but it is not connected.
The MCPs tab doesn't list it:
<img width="790" height="176" alt="Image" src="https://github.com/user-attachments/assets/5a728214-d660-4149-a3ec-22bc4fb6d8d7" />
If I go back to the Plugin and click on the gear icon:
<img width="795" height="98" alt="Image" src="https://github.com/user-attachments/assets/c34c5096-5de1-4012-ae28-f4f188092c4e" />
I then see this:
<img width="695" height="359" alt="Image" src="https://github.com/user-attachments/assets/48962ceb-9ad0-49dc-8e34-b171088c8fe4" />
Overall, my plugin doesn't work because it doesn't have access to the necessary tools.
What steps can reproduce the bug?
Feedback ID: 019e99f0-0824-7890-a1fd-1162a8214828
Have an Agent Skills Plugin with an .mcp.json file.
My .mcp.json:
{
"mcpServers": {
"composio": {
"type": "http",
"url": "https://connect.composio.dev/mcp"
}
}
}
My .codex-plugin/plugin.json looks something like this:
{
"name": "enterprise",
"version": "2026.06.5",
"description": "...",
"skills": "./skills/",
"interface": {
"displayName": "Enterprise",
"shortDescription": "...",
"developerName": "Olmstead",
"category": "Productivity",
"capabilities": ["Interactive", "Read"],
"logo": "./assets/icon.svg"
}
}
My .agents\plugins\marketplace.json looks something like this:
{
"name": "olmstead-skills-marketplace",
"interface": {
"displayName": "..."
},
"description": "...",
"marketplaceVersion": "2026.06.1",
"plugins": [
{
"name": "enterprise",
"source": { "source": "local", "path": "./enterprise" },
"policy": { "installation": "AVAILABLE", "authentication": "ON_INSTALL" },
"category": "Productivity"
},
...
]
}
What is the expected behavior?
I expect the Composio MCP Server to be registered as part of the Plugin install.
When you click Plugins > Manage, I expect to see it listed on the MCPs tab -- and enabled.
Additional information
This problem seems to be unique to the Codex Desktop App for Windows because my Mac seems to working as expected. (This also confirms that I don't have a Composio issue, or a plugin config issue.)
10 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Still a problem with
Version 26.602.71036 • Released Jun 8, 2026. ☹️Still a problem with
Version 26.609.30741 • Released Jun 11, 2026. ☹️Still a problem with
Version 26.609.41114 • Released Jun 12, 2026. ☹️I discovered that the OAuth callback wasn't working because of AppContainer Isolation. Specifically, Codex needs an exemption.
Here is exactly what is happening under the hood, why it works on macOS/Web but fails on Windows, and how to fix it.
---
The Root Cause: AppContainer Isolation
Windows apps distributed via the Microsoft Store, or packaged using MSIX / UWP, run inside a highly secure, sandboxed environment called an AppContainer.
By default, network isolation rules prevent AppContainers from sending network traffic to the local machine (
127.0.0.1orlocalhost). This security feature is called Loopback Block.http://localhost:54321/callback). Your browser tries to hand that authorization code back to the desktop app listening on that ephemeral port, but Windows blocks the cross-process communication into the AppContainer, causing the callback to time out or fail.---
The Fix: Enable Loopback Exemption
To fix this, you need to explicitly tell Windows to exempt the specific application from the loopback restriction. You can do this either via the command line or a GUI tool.
Method 1: The Command Line (Fastest)
You will need to use Windows
CheckNetIsolation.exevia an Elevated Command Prompt or PowerShell (Run as Administrator).First, you need to find the AppContainer Name or Package Family Name (PFN) of your desktop client.
(Replace
*Codex*with the relevant name if looking for a different client).PackageFamilyName(which usually looks something likeCompanyName.AppName_hash), run the following command to grant the exemption:Method 2: The GUI Way (Easiest)
If you don't want to hunt for Package Family Names in PowerShell, Microsoft provides a built-in utility UI, or you can use a popular community tool.
Option A: Windows Built-in UI (If available on your build)
Win + R, typeCheckNetIsolation.exe LoopbackExempt -display(or search for "Loopback Exemption Manager" in your settings depending on your Windows 11 update).Option B: Using Fiddler's Loopback Utility (Recommended)
---
Verification
Once you have applied the exemption using either method, you can verify it took effect by running:
Look through the returned list to ensure your application's package name is present.
Restart your AI Agent client, kick off the OAuth flow again, and the browser callback to your ephemeral
localhostport should now pass right through the Windows sandbox firewall without issue.---
Shout out to #19685 because it spelled out the command:
_Knowing what we know now, what does Codex need to do to avoid needing to add this exemption (which requires Admin privileges)?_
---
To fix this so that users don't have to break out PowerShell or Fiddler, the team developing Codex (or any MSIX-packaged desktop AI Agent) has a few paths they can take.
Because Windows deliberately makes it hard for sandboxed apps to listen for inbound localhost traffic, the solution is either configuring the application manifest correctly or changing how the OAuth handshake returns its data.
Here is what the Codex development team can do to handle this seamlessly:
---
Path 1: Switch from Loopback to Custom URL Protocols (The Best Practice)
The cleanest, most secure way to avoid the loopback problem entirely is to stop using
http://localhost:[port]as the OAuth redirect URI on desktop apps.Instead, Codex should register a Custom URL Protocol (e.g.,
codex://orcowork://) in its Windows app manifest.codex://oauth-callback.---
Path 2: Declarative Manifest Capabilities (If sticking to HTTP Loopback)
If Codex must use a local HTTP web server for the callback (e.g., because they are sharing a code engine between Web, Mac, and Windows and don't want to refactor the OAuth flow), they can ask Windows for specific exemptions inside their
AppxManifest.xml.They need to inject the
privateNetworkClientServercapability alongsideinternetClient. While this doesn't automatically lift the loopback block for every type of internal communication, pairing it with the modern Windows App SDK / AppContainer loopback extensions allows the packaged application to properly bind and receive local incoming loopback traffic.---
Path 3: Programmatic Loopback Exemption via Installer/First Run
If they are distributing the MSIX via an installer or a wrapper that runs with elevated privileges during setup (or if they use the Package Support Framework), they can actually execute the programmatic API equivalent of what you did manually.
Windows provides a native C++ function called
NetworkIsolationRegisterForAppContainerChangesandNetworkIsolationSetAppContainerConfiginsideFirewallAPI.dll.When Codex launches or installs, it can check if it has loopback access. If it doesn't, it can trigger a one-time UAC prompt asking the user for permission to configure its networking environment, applying the exemption code-side using its own Package Family Name:
Which option should they choose?
Path 1 is strongly encouraged. Modern security architectures (like RFC 8252 for native apps) heavily favor Custom URL Schemes or System Brokers over local ephemeral web servers because they don't leave random ports open on the user's loopback interface.
Even after adding the _Loopback Exemption_, and then re-installing from scratch, the Composio MCP server is _still not automatically installed_ for the Plugin. (It clearly knows the
.mcp.jsonfile because it does the OAuth challenge, and lists the Composio MCP Server on the Plugin page, but doesn't _enable_ it.) And I'm running the latestVersion 26.609.71450 • Released Jun 15, 2026. ☹️Running into this problem on MacOS now with the latest
Version 26.623.42026 • Released Jun 26, 2026.Using
Version 26.623.70822 • Released Jun 29, 2026on Windows and still having this problem. I even changed the MCP Server to use an API Key instead of OAuth. This should be easier, yet still a problem.Plugin-defined MCP installation needs an explicit install/provisioning state machine rather than “plugin installed” implying “MCP server attached.”
I would persist and surface: plugin id/version, discovered
.mcp.jsondigest, auth status, install attempt id, resolved command/env, connection state, tool-list result, and whether the server was made available to new sessions. If auth succeeds but MCP attach does not, the UI should show that split state and offer a retry/reconcile action.I maintain Better Agent (https://github.com/ofekron/better-agent), where plugin/provider capability discovery, auth, server process ownership, and effective tool catalog are separate states. If useful, a star helps other desktop-agent plugin builders find it.