<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[AI Agent Engineering]]></title><description><![CDATA[In AI Agent Engineering we talk about building intelligent, autonomous, and production-ready AI agents. Explore practical tutorials, architectures, tools, and b]]></description><link>https://aiagentengineering.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6a6d05341601d4ba707cc197/b0d6e65c-4c67-4da8-8483-014264a19122.png</url><title>AI Agent Engineering</title><link>https://aiagentengineering.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 28 Oct 2026 12:06:37 GMT</lastBuildDate><atom:link href="https://aiagentengineering.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Build a Multi-Tenant MCP Server with OAuth Using Clerk and Arcade Cloud]]></title><description><![CDATA[Let customers connect Claude to your multi-tenant SaaS: an MCP server tutorial with OAuth via Clerk and Arcade Cloud. Your API enforces tenant and plan…]]></description><link>https://aiagentengineering.hashnode.dev/build-a-multi-tenant-mcp-server-with-oauth-using-clerk-and-arcade-cloud</link><guid isPermaLink="true">https://aiagentengineering.hashnode.dev/build-a-multi-tenant-mcp-server-with-oauth-using-clerk-and-arcade-cloud</guid><category><![CDATA[AI]]></category><category><![CDATA[Tutorial]]></category><category><![CDATA[mcp]]></category><category><![CDATA[oauth]]></category><category><![CDATA[authentication]]></category><category><![CDATA[Security]]></category><category><![CDATA[Multi tenancy]]></category><category><![CDATA[#clerk]]></category><category><![CDATA[arcade]]></category><dc:creator><![CDATA[Manveer Chawla]]></dc:creator><pubDate>Sat, 17 Oct 2026 11:26:04 GMT</pubDate><content:encoded><![CDATA[<p>Our customers kept asking the same question: can we use Zenith with Claude and ChatGPT? Zenith is an AEO service for technical products, and customers use our SaaS dashboard to monitor their share of voice. The dashboard is multi-tenant: every customer workspace has its own data and its own plan, so agent access is a tenant-isolation problem before it’s anything else.</p>
<p>So we built a custom MCP server that calls our existing backend and deployed it on Arcade.dev Cloud. Customers sign in with their normal Zenith login (we already use Clerk as an IdP), without creating an Arcade account. Every tool call reaches our API with an OAuth token delegated by that user, and the API applies the same workspace and plan checks it always uses for standard web or mobile users. The model never handles a token, and it doesn’t get to claim it’s <code>user_123</code>.</p>
<p>This post builds the same setup from scratch: a Python MCP server, a small reporting app standing in for your backend, OAuth wired through Clerk and Arcade, deployed to Arcade Cloud and connected to Claude. The demo also covers the shape most real backends have: long-running jobs. The agent starts a report, polls with the job ID, and retrieves the result, with workspace membership and plan tier re-checked on every call. The part that took us longest to untangle, and the part this post spends the most time on, is that “signing in” here means three separate credentials.</p>
<p><a href="https://github.com/manveer/multi-tenant-mcp-server-oauth">Download the complete example</a>. It includes the Python MCP server, the web app, configuration templates, and tests, runnable with your own Clerk and Arcade developer accounts.</p>
<h2>MCP Server Architecture: Gateway, Tools, and Backend API</h2>
<p>Calling our existing backend lets agent requests use the application's access rules. The MCP server exposes operations to the agent, while the API decides whether the user can perform them. Keeping those checks in the backend avoids maintaining another set of membership and subscription rules in the MCP server.</p>
<p>Arcade Cloud runs the Python MCP server. The gateway identifies the user, and Arcade supplies the API access token when an authorized tool runs. A separate web application handles the reporting API, background jobs, browser sign-in, and custom user verifier. Clerk supplies identity and OAuth services.</p>
<p>The download includes that web application so you can follow along without an existing backend. Its synthetic reports and permissions stand in for your application's operations and access rules.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/c6749360-2462-4bfe-a3f8-de97c1d71e22.png" alt="Architecture diagram showing Claude and ChatGPT connecting to an MCP server on Arcade Cloud, Clerk OAuth authentication, and application-level authorization checks for identity, tenant scope, and feature access before accessing customer data." style="display:block;margin:0 auto" />

<p>The client calls MCP tools through the gateway. Those tools then make ordinary HTTPS requests to the reporting API. You'll run the demo web application locally behind an ngrok HTTPS tunnel so Arcade Cloud can reach it. If your API and browser verifier already run on deployed HTTPS URLs, use those directly. You don't need a tunnel.</p>
<h3>Why Not Just Run the MCP Server Yourself?</h3>
<p>Fair question, and nothing in MCP forces a gateway: the protocol supports OAuth-protected remote servers. Implement that spec from scratch, and you’re building everything between “the user clicked authorize” and “the right token arrives in the right tool call”:</p>
<ul>
<li><p>Running the authorization-code flow against Clerk, with PKCE and consent, for every customer who connects an agent</p>
</li>
<li><p>Storing each user’s delegated token, refreshing it via <code>offline_access</code>, and keeping it away from the model and the MCP client</p>
</li>
<li><p>Matching an incoming tool call to that caller’s token at execution time</p>
</li>
<li><p>Signing customers in through your existing IdP, so they connect with the login they already have instead of a new account</p>
</li>
<li><p>Binding tool authorization to a real browser session, so one user can’t complete another user’s flow</p>
</li>
</ul>
<p>In this tutorial, Arcade handles that list. Your API keeps what should never leave your code: deciding what the authenticated user can actually do.</p>
<p>There’s also a middle path, and since we already use Clerk, it deserves a straight answer. <a href="https://clerk.com/docs/guides/configure/auth-strategies/oauth/how-clerk-implements-oauth">Clerk can act as the authorization server for an MCP server directly</a>: it supports <a href="https://modelcontextprotocol.io/specification/draft/basic/authorization/client-registration#dynamic-client-registration">dynamic client registration</a> and a consent screen, so an MCP client registers itself with Clerk, completes the flow there, and presents a token that your self-hosted server verifies. Your code never touches authorization codes. That architecture is genuinely simpler: one credential instead of three, no gateway sign-in, and no browser verifier, because there is no second flow to bind. The trade-off is that you host and operate the server yourself, and <a href="https://github.com/clerk/mcp-tools">Clerk’s MCP helper library</a> targets JavaScript frameworks such as Next.js and Hono while our tools are Python. If you’re exposing one TypeScript server from an application you already run, Clerk-direct is a reasonable choice.</p>
<p>We wanted the gateway anyway, and not only for the token plumbing. A gateway is a surface you can grow: it can <a href="https://docs.arcade.dev/en/home/mcp-gateways">federate tools from multiple MCP servers</a> behind the same URL, so we can add more servers later, or prebuilt integrations and newly launched tool recommendations from from Arcade’s catalog, without customers reconfiguring their connector. As that catalog grows, <a href="https://docs.arcade.dev/en/operate/governance/mcp-gateways/tool-recommendation">Tool Recommendation</a> matches each task to the few tools the agent needs, so it doesn’t carry every definition in context. It’s also a control point: you select exactly which tools each gateway exposes, with <a href="https://docs.arcade.dev/en/operate/governance/contextual-access">contextual access policies</a> on top, so the gateway also governs what agents can reach. Here, that’s just the four reporting tools.</p>
<p>One constraint worth knowing during development: tools that declare <code>requires_auth</code> or <code>requires_secrets</code> need a verified caller identity before they run, and the SDK’s default local HTTP mode has none, so it rejects those tools while an unprotected greeting works fine. <a href="https://docs.arcade.dev/en/build/create-tools/tool-basics/build-mcp-server#run-your-mcp-server">Arcade’s transport guidance</a> documents this. Local stdio supports protected tools with configured developer credentials, and the server can also run outside Arcade Cloud behind additional <a href="https://docs.arcade.dev/en/build/create-tools/secure-your-server/secure-your-mcp-server">resource-server authentication</a>. This tutorial stays on Arcade Cloud throughout.</p>
<h2>How MCP Gateway Authentication and API OAuth Fit Together</h2>
<p>A user connecting Claude needs to sign into the gateway and authorize tools to call the application API on their behalf. Their browser also has an application sign-in session managed by Clerk. These connections use separate credentials:</p>
<table>
<thead>
<tr>
<th>Connection</th>
<th>Credential</th>
<th>Configuration Responsible</th>
</tr>
</thead>
<tbody><tr>
<td>MCP client → Arcade gateway</td>
<td>Gateway access token</td>
<td>Clerk-backed Arcade User Source</td>
</tr>
<tr>
<td>MCP tool → reporting API</td>
<td>Clerk OAuth access token supplied to the tool by Arcade</td>
<td>Custom OAuth provider and the tool's <code>requires_auth</code> declaration</td>
</tr>
<tr>
<td>Browser → reporting application</td>
<td>Clerk browser session</td>
<td>Application sign-in and custom user verifier</td>
</tr>
</tbody></table>
<p>Customers don't need Arcade accounts for this setup. A <strong>User Source</strong> lets them sign into the gateway using their existing application login, with Clerk as the identity provider. They don't need to become Arcade project members. You still need an Arcade account to create and deploy the server. <a href="https://docs.arcade.dev/en/operate/identity/user-sources">Arcade documents the distinction between administrators and gateway users</a>.</p>
<p>A <strong>custom OAuth provider</strong> tells Arcade how to obtain the user's authorization for your API. When the tool runs, Arcade supplies that API access token.</p>
<p>A <strong>custom user verifier</strong> confirms that the person completing tool authorization matches the application user who began the flow. The verifier runs in your browser application, where it can read the Clerk session. You still need this step after configuring the gateway's User Source. <a href="https://docs.arcade.dev/en/build/user-facing-agents/secure-auth-production">Arcade's production-auth guide</a> covers this verification boundary.</p>
<p>The API identifies the user by verifying the OAuth access token, then checks the application's membership and plan rules for that user. The API doesn't trust a caller simply claiming to be <code>user_123</code>.</p>
<h2>1. Set Up the Python MCP Server</h2>
<p>You need Python 3.11–3.13, <a href="https://docs.astral.sh/uv/getting-started/installation/">uv</a>, Node.js 22–24, and npm. Python 3.12 and Node.js 22 work well. You also need a Clerk development instance, a separate Arcade demo project, and an MCP client with remote connector support. Any client that supports the Streamable HTTP transport can use the gateway URL, including Cursor, Claude Code, Codex, and custom agents. The steps below use Claude Desktop.</p>
<p>Python runs the MCP tools. Node.js runs the included API, browser sign-in, and verifier. You don't need an existing backend to follow along. For the local demo, you'll also need an ngrok account and CLI. We'll set those up in step 3.</p>
<p>Extract the download. Its two application directories:</p>
<pre><code class="language-plaintext">report-mcp-demo/
  mcp/       Python MCP tools to deploy on Arcade Cloud
  web/       Application sign-in, user verifier, and reporting API
</code></pre>
<p>From the MCP directory, install the pinned dependencies:</p>
<pre><code class="language-sh">cd report-mcp-demo/mcp
uv sync --locked --extra dev
</code></pre>
<p>Start with <code>hello.py</code> to see how a tool registers:</p>
<pre><code class="language-py">from typing import Annotated

from arcade_mcp_server import MCPApp

app = MCPApp(name="hello_demo", version="1.0.0")


@app.tool
def greet(name: Annotated[str, "Name to include in the greeting."]) -&gt; str:
    """Return a greeting to verify that a client can call this local tool."""
    return f"Hello, {name}!"


if __name__ == "__main__":
    app.run(transport="stdio")
</code></pre>
<p><code>MCPApp</code> owns the server. The decorator registers the function as a tool. Its docstring tells the client what the tool does, and the parameter annotation describes the input. <a href="https://docs.arcade.dev/en/build/create-tools/tool-basics/build-mcp-server">Arcade's server guide</a> explains this interface.</p>
<h3>Optional: Try the Local Greeting</h3>
<p>From the same <code>mcp/</code> directory, run the included greeting test. The test starts the server, connects an MCP client, and calls <code>greet</code> with the name <code>Reader</code>:</p>
<pre><code class="language-sh">uv run pytest tests/test_stdio.py::test_hello_tool_over_stdio -q
</code></pre>
<p>The test checks that the tool returns <code>Hello, Reader!</code>. Its summary should show <code>1 passed</code>. The greeting gets checked internally rather than printed.</p>
<p><strong>Checkpoint:</strong> Your local MCP server registered a tool and answered a real MCP call. This check needs no Clerk or Arcade account configuration. Next, you'll set up authentication for the reporting tools. Customers will use the hosted gateway without running a local MCP process.</p>
<h2>2. Create Test Users and OAuth Applications in Clerk</h2>
<p>Signing into the gateway identifies the user connecting their agent. Calling the backend requires a separate grant to act on the user's behalf. You'll configure an OAuth application for each connection in the same Clerk instance, using the user's existing identity for both.</p>
<p>In the Clerk dashboard, create an application and select its <strong>development instance</strong>. Enable email/password sign-in, then create three test users for the demo application: Alice, Bob, and Carol. Copy their Clerk user IDs from the Users page.</p>
<p>Each workspace in the demo represents a separate customer organization. Alice and Bob belong to <code>team-red</code>, on the Pro tier. Carol belongs to <code>team-blue</code>, on Basic. Alice and Bob demonstrate colleagues sharing access within one customer workspace. Carol lets you test the boundary between customers.</p>
<p>Basic permits basic reports. Pro also permits advanced reports. These simplified plans demonstrate that an agent can only create reports the customer's subscription allows. The demo treats reports as workspace resources, so Bob can retrieve a report Alice created in their shared workspace. The names, memberships, and tiers are fixtures in the application code. You don't need to configure Clerk Organizations or billing.</p>
<p>Zenith also supports internal staff with access across customer workspaces. To try that optional case, create a fourth test user in the same Clerk instance and keep its ID for <code>DEMO_STAFF_USER_ID</code>. The demo grants that account access to both workspaces while retaining their tier restrictions.</p>
<p>Create two OAuth applications in that same Clerk instance under <strong>Configure → Developers → OAuth Applications → Add OAuth application</strong>. Give them distinct names and leave <strong>Public</strong> off so they remain confidential clients:</p>
<table>
<thead>
<tr>
<th>OAuth Application</th>
<th>Scopes</th>
<th>Callback</th>
</tr>
</thead>
<tbody><tr>
<td>Report demo gateway</td>
<td><code>openid profile email</code></td>
<td><code>https://cloud.arcade.dev/oauth2/intermediate_callback</code></td>
</tr>
<tr>
<td>Report demo API</td>
<td><code>openid profile email offline_access</code></td>
<td>The callback generated by the Arcade custom provider in step 4</td>
</tr>
</tbody></table>
<p>Save each application's client ID and client secret. Keep PKCE enabled. The API application requests <code>offline_access</code> for refresh access and retains its consent screen. For the first-party gateway identity application, Arcade's Clerk guide describes disabling Clerk's additional consent screen. That setting doesn't disable the gateway's own consent screen.</p>
<p>Open the OAuth application's <strong>Discovery URL</strong> and copy the <code>issuer</code>, <code>authorization_endpoint</code>, and <code>token_endpoint</code>. Both apps use the same Clerk instance, but their client credentials and callbacks differ. Use the exact issuer value, without the <code>/.well-known/openid-configuration</code> suffix or an added trailing slash. <a href="https://docs.arcade.dev/en/operate/identity/user-sources/clerk">Clerk User Source setup</a> and <a href="https://clerk.com/docs/guides/configure/auth-strategies/oauth/how-clerk-implements-oauth">Clerk's OAuth implementation</a> document these settings.</p>
<p>Also copy the development instance's publishable key and backend secret key from Clerk's API keys page. The backend secret key differs from either OAuth application's client secret.</p>
<h2>3. Run the Demo Backend with Clerk Sign-In</h2>
<p>The included Next.js application supplies the backend for this example: browser sign-in, user verification, and the reporting API. The verifier lives alongside sign-in so it can identify the person completing authorization from their Clerk browser session.</p>
<p>Arcade Cloud can't reach the API on your computer's <code>localhost:3000</code>. Ngrok gives that local application a public HTTPS address. The same address serves browser sign-in and <code>/auth/verify</code> because this demo bundles them with the API.</p>
<p>If you're adapting an existing application, use its deployed HTTPS API origin and host the verifier alongside browser sign-in. Those can be separate origins. You can skip ngrok once both reach HTTPS.</p>
<p>Install the companion dependencies:</p>
<pre><code class="language-sh">cd ../web
npm ci
cp .env.example .env.local
</code></pre>
<p>Create an <a href="https://dashboard.ngrok.com/signup">ngrok account</a> and install the CLI using its <a href="https://ngrok.com/docs/share-localhost/quickstart">setup guide</a>. On macOS with Homebrew:</p>
<pre><code class="language-sh">brew install ngrok
</code></pre>
<p>Copy your authtoken from the ngrok dashboard. In another terminal, connect the CLI to your account and forward port 3000:</p>
<pre><code class="language-sh">ngrok config add-authtoken "YOUR_NGROK_AUTHTOKEN"
ngrok http 3000
</code></pre>
<p>Copy the HTTPS forwarding origin printed by ngrok and keep this terminal open. The origin will reach the application once you start it below. Use the plain tunnel command shown here. Clerk handles browser and API authentication, so an additional ngrok login policy would interrupt the tool's API calls.</p>
<p>Fill in <code>web/.env.local</code>:</p>
<pre><code class="language-plaintext">APP_URL=https://YOUR-NGROK-DOMAIN
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=YOUR_CLERK_DEVELOPMENT_PUBLISHABLE_KEY
CLERK_SECRET_KEY=YOUR_CLERK_DEVELOPMENT_SECRET_KEY
ARCADE_API_KEY=YOUR_ARCADE_DEMO_PROJECT_API_KEY
REPORTS_OAUTH_CLIENT_ID=YOUR_REPORT_DEMO_API_CLIENT_ID
DEMO_ALICE_USER_ID=YOUR_ALICE_CLERK_USER_ID
DEMO_BOB_USER_ID=YOUR_BOB_CLERK_USER_ID
DEMO_CAROL_USER_ID=YOUR_CAROL_CLERK_USER_ID
DEMO_STAFF_USER_ID=
</code></pre>
<p>Replace the entire <code>https://YOUR-NGROK-DOMAIN</code> placeholder with your actual HTTPS forwarding origin, without a trailing slash, and fill in the other values. Set <code>REPORTS_OAUTH_CLIENT_ID</code> to the API application's client ID. The API checks this value so it can reject tokens issued for the gateway application. Leave the staff user empty until you test staff access.</p>
<p>Start the app:</p>
<pre><code class="language-sh">npm run dev
</code></pre>
<p>Open <code>APP_URL</code> in your browser. If ngrok shows its free-plan warning page, click <strong>Visit</strong>, then sign in as Alice. This <a href="https://ngrok.com/docs/pricing-limits/free-plan-limits">browser warning doesn't affect programmatic API requests</a>.</p>
<p><strong>Checkpoint:</strong> The homepage recognizes Alice. Browser sign-in works. You'll test the API's separate OAuth grant after connecting Claude.</p>
<p>Use that public origin for the remaining steps. The app reads its allowed development hostname and browser origin from <code>APP_URL</code>. Switching to localhost during authorization can leave you in a different browser session.</p>
<p>Keep the app and ngrok running while testing. Ngrok reuses your account's <a href="https://ngrok.com/docs/gateway/domains">assigned development domain</a>. If you switch domains, update <code>APP_URL</code>, the Arcade verifier URL, and the hosted API base URL, then restart the app. The MCP server deploys separately to Arcade Cloud in step 8.</p>
<h2>4. Configure the API OAuth Provider in Arcade</h2>
<p>The MCP tool needs permission to call your API on the user's behalf. Configure an OAuth provider so Arcade can obtain that user's API access token.</p>
<p>In your Arcade demo project, open <strong>Connections → OAuth providers</strong>, add a <strong>Custom Provider</strong>, and configure:</p>
<table>
<thead>
<tr>
<th>Setting</th>
<th>Value</th>
</tr>
</thead>
<tbody><tr>
<td>Provider ID</td>
<td><code>report-demo-clerk</code></td>
</tr>
<tr>
<td>Client ID and secret</td>
<td>Credentials from the Clerk <strong>Report demo API</strong> application</td>
</tr>
<tr>
<td>Authorization endpoint</td>
<td>Your discovery document's <code>authorization_endpoint</code></td>
</tr>
<tr>
<td>Token endpoint</td>
<td>Your discovery document's <code>token_endpoint</code></td>
</tr>
<tr>
<td>Refresh token endpoint</td>
<td>The same <code>token_endpoint</code></td>
</tr>
</tbody></table>
<p>Retain the normal authorization-code and refresh grant parameters. When using Basic client authentication, avoid also adding client credentials to the request body. <a href="https://docs.arcade.dev/en/references/auth-providers/oauth2">Arcade's OAuth-provider reference</a> describes those request settings.</p>
<p>Copy the provider's generated <strong>Redirect URI</strong> into the allowed redirects for <strong>Report demo API</strong> in Clerk. Copy it exactly. This callback differs from the gateway's <code>intermediate_callback</code>, and neither callback matches your browser application's <code>/auth/verify</code> route.</p>
<p>The Python server points to that provider with:</p>
<pre><code class="language-py">REPORT_AUTH = OAuth2(
    id="report-demo-clerk",
    scopes=["openid", "profile", "email", "offline_access"],
)
</code></pre>
<p>The ID must match the provider you configured. The scopes request identity and refresh access. Workspace membership and subscription permissions remain separate checks in your application.</p>
<h2>5. Register the Browser User Verifier</h2>
<p>The person completing API authorization needs to match the application user who started the flow. Your browser application can confirm that match using the signed-in user's verified Clerk browser session. Register its verifier route with Arcade to make that check part of tool authorization.</p>
<p>In Arcade <strong>Auth → Settings</strong>, select <strong>Custom verifier</strong> and enter your public application origin followed by <code>/auth/verify</code>:</p>
<pre><code class="language-plaintext">https://YOUR-NGROK-DOMAIN/auth/verify
</code></pre>
<p>For the local demo, use the ngrok origin you set in <code>APP_URL</code>. For a deployed application, use its browser sign-in origin followed by <code>/auth/verify</code>. The companion includes this route. Here's what it does:</p>
<ol>
<li><p>Receive the authorization flow's <code>flow_id</code> from Arcade.</p>
</li>
<li><p>Read the verified Clerk browser session. If the visitor signed out, preserve the flow's return path and send them through sign-in.</p>
</li>
<li><p>Confirm the session's user ID with Arcade from the server, using the project's API key.</p>
</li>
<li><p>Continue the authorization flow or show completion once finished. Report a mismatched or failed flow as an error.</p>
</li>
</ol>
<p>The user ID comes from the verified session. The route never takes it from an MCP argument or browser query parameter, and the Arcade API key stays on the server. The implementation includes the sign-in redirect and failure handling.</p>
<p>For identity matching, keep both OAuth applications in the same Clerk instance and select <code>sub</code> as the User Source subject. Clerk documents this subject as the authenticated user's ID. <a href="https://clerk.com/docs/guides/configure/auth-strategies/oauth/single-sign-on">Clerk's OIDC claims</a> and <a href="https://docs.arcade.dev/en/build/user-facing-agents/secure-auth-production">Arcade's verifier contract</a> describe the user ID Clerk supplies and the identity Arcade expects.</p>
<p>This was one detail we had to untangle. Connecting to the gateway doesn't give the MCP tool your application's browser session. The verifier uses that session in the browser application. The MCP tool sends the user's delegated OAuth access token to the API.</p>
<h2>6. Configure Clerk Sign-In for the MCP Gateway</h2>
<p>The User Source connects the gateway to Clerk, so users can sign in with the same login they use for the reporting application. Configure it with the separate gateway OAuth application you created in step 2.</p>
<p>In the Arcade demo project's <strong>User Sources</strong>, add:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Value</th>
</tr>
</thead>
<tbody><tr>
<td>Name</td>
<td>Report demo Clerk</td>
</tr>
<tr>
<td>Issuer URL</td>
<td>Exact Clerk discovery <code>issuer</code></td>
</tr>
<tr>
<td>Client ID and secret</td>
<td>Credentials from <strong>Report demo gateway</strong></td>
</tr>
<tr>
<td>Scopes</td>
<td><code>openid profile email</code></td>
</tr>
<tr>
<td>Subject claim</td>
<td><code>sub</code></td>
</tr>
</tbody></table>
<p>Confirm that the Clerk gateway application's redirect list contains:</p>
<pre><code class="language-plaintext">https://cloud.arcade.dev/oauth2/intermediate_callback
</code></pre>
<p>Gateway login uses the User Source. API access uses the OAuth provider. Tool authorization also uses the browser verifier. Keep their names and callback values separate when troubleshooting.</p>
<h2>7. Add OAuth-Protected Tools to the MCP Server</h2>
<p>The finished server lives in <code>mcp/src/report_demo_mcp/server.py</code>. It exposes four operations:</p>
<table>
<thead>
<tr>
<th>Tool</th>
<th>Job</th>
</tr>
</thead>
<tbody><tr>
<td><code>get_current_user</code></td>
<td>Return the API-verified identity and permitted workspaces</td>
</tr>
<tr>
<td><code>start_report</code></td>
<td>Start a synthetic report and return its job ID</td>
</tr>
<tr>
<td><code>get_report_status</code></td>
<td>Check whether an authorized report is queued, running, completed, or failed</td>
</tr>
<tr>
<td><code>get_report_result</code></td>
<td>Retrieve the result, or report that it is still pending</td>
</tr>
</tbody></table>
<p>Start with <code>get_current_user</code>:</p>
<pre><code class="language-py">@app.tool(requires_auth=REPORT_AUTH, requires_secrets=[API_CONFIG_KEY])
async def get_current_user(context: Context) -&gt; dict:
    """Get the API-verified user and their permitted workspaces.

    Call this to discover the workspace IDs available to the signed-in user.
    The API derives identity from the OAuth token; the model supplies no user ID.
    """
    return await _api_request(context, "GET", "/api/me", expected_statuses={200})
</code></pre>
<p>The shared <code>_api_request</code> helper calls <code>context.get_auth_token_or_empty()</code>, rejects an empty token, and sends it to the configured API in an <code>Authorization: Bearer ...</code> header. The helper limits request time and response size, disables redirects, and returns safe error messages. The download includes the full helper.</p>
<p>Arcade injects <code>Context</code> when the tool runs. The model supplies neither the token nor the destination URL. Each tool declares <code>REPORT_API_BASE_URL</code> as required configuration and reads it through <code>context.get_secret(...)</code>. The origin isn't confidential. The secrets mechanism supplies it to the hosted tool.</p>
<p>On the API side, ask Clerk to verify an OAuth access token:</p>
<pre><code class="language-ts">const identity = await auth({ acceptsToken: "oauth_token" });
</code></pre>
<p>The API checks the verified OAuth client ID against <code>REPORTS_OAUTH_CLIENT_ID</code>, then looks up the user's fixture membership. The API accepts OAuth access tokens issued for the <strong>Report demo API</strong> application and rejects gateway credentials and browser-session tokens. Clerk's helpers handle both JWT and opaque OAuth formats. <a href="https://clerk.com/docs/guides/configure/auth-strategies/oauth/verify-oauth-tokens">Clerk's OAuth-token verification guide</a> covers that boundary.</p>
<p>If a tool needs user details, it can call <code>/api/me</code>. You can also configure a provider <code>user_info_request</code> to put metadata in <code>context.authorization.user_info</code>. This example doesn't need it, and the API still must check access. The <a href="https://docs.arcade.dev/en/references/auth-providers/oauth2#user_info_request">OAuth-provider reference</a> describes that optional configuration.</p>
<h2><strong>8. Deploy the MCP Server to Arcade Cloud</strong></h2>
<p>Deploy the <code>mcp/</code> project so customers can call its protected tools through an Arcade gateway. Keep the separate <code>web/</code> application running at the HTTPS origin from step 3.</p>
<p>From <code>report-mcp-demo/mcp</code>:</p>
<pre><code class="language-plaintext">uv run arcade login
uv run arcade project list
uv run arcade project set YOUR_DEMO_PROJECT_ID
uv run arcade deploy -e src/report_demo_mcp/server.py --secrets skip
</code></pre>
<p>Replace <code>YOUR_DEMO_PROJECT_ID</code> with the demo project's ID from the list. The CLI uses the saved project, so select the one containing your User Source, OAuth provider, and custom verifier.</p>
<p><code>--secrets skip</code> tells the CLI not to upload local secret values. You'll configure the required API address after the server has been deployed, before calling any reporting tools.</p>
<p>The entrypoint defaults to stdio for local development. Arcade supplies the hosted execution settings during deployment. Run the deploy command from the directory containing <code>pyproject.toml</code>, as described in <a href="https://docs.arcade.dev/en/build/arcade-deploy">Arcade Deploy</a>.</p>
<p>Wait for deployment to succeed and keep the returned server name. In the Arcade dashboard, open <strong>Servers</strong>, select that server, and open its secret configuration. Add the following key and replace the placeholder with your backend's public HTTPS origin:</p>
<pre><code class="language-plaintext">REPORT_API_BASE_URL=https://YOUR-NGROK-DOMAIN
</code></pre>
<p>Use the demo's ngrok origin, or your deployed API's HTTPS origin, without <code>/api</code> or a trailing slash. Save the value before proceeding. This address may differ from the browser verifier's origin in an existing application. From Arcade Cloud, <code>localhost</code> doesn't point to your computer.</p>
<p>The configuration splits across four places:</p>
<table>
<thead>
<tr>
<th>Location</th>
<th>Configuration</th>
</tr>
</thead>
<tbody><tr>
<td>Arcade project</td>
<td>User Source, OAuth-provider settings, and custom verifier URL</td>
</tr>
<tr>
<td>Deployed MCP server, through the Servers page</td>
<td>The <code>REPORT_API_BASE_URL</code> secret</td>
</tr>
<tr>
<td>Browser/API application</td>
<td>Clerk instance keys, server-only <code>ARCADE_API_KEY</code>, expected API OAuth client ID, and demo memberships</td>
</tr>
<tr>
<td>Customer's MCP client</td>
<td>Gateway URL and the user's browser login/consent flow</td>
</tr>
</tbody></table>
<p>Customers never receive your developer Arcade API key. Arcade supplies their API token to the tool after its authorization requirements are satisfied.</p>
<p>On the server's page, confirm that the deployment is healthy and has all four reporting tools. You can also inspect registered servers from this project with:</p>
<pre><code class="language-plaintext">uv run arcade server list
</code></pre>
<p>The tools may appear with names such as <code>ReportDemo_GetCurrentUser</code>.</p>
<p><strong>Checkpoint:</strong> The intended server is healthy, lists all four operations from step 7, and has <code>REPORT_API_BASE_URL</code> configured. Server health confirms that the deployment started; it doesn't verify backend access. Next, connect Claude and call <code>get_current_user</code> to check customer login, tool authorization, and backend access together.</p>
<h2>9. Create an MCP Gateway and Connect Claude Desktop</h2>
<p>The gateway gives Claude one URL for your tools and uses the User Source to sign customers in.</p>
<p>Create an MCP Gateway in that project. Select the four reporting tools from your deployment. Under <strong>Non-Arcade Users → User Source</strong>, choose <strong>Report demo Clerk</strong>. Copy the resulting gateway URL, which has this form:</p>
<pre><code class="language-plaintext">https://api.arcade.dev/mcp/YOUR-GATEWAY-SLUG
</code></pre>
<p>In Claude Desktop, use <strong>Settings → Connectors → Add custom connector</strong>, enter that URL, and retain the detected OAuth settings and Claude's published client identity. Sign in with Alice's demo application account. Alice should not be an Arcade project member. <a href="https://docs.arcade.dev/en/operate/governance/mcp-gateways/create-via-dashboard">Gateway configuration</a> and <a href="https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop">Claude's Arcade connection guide</a> describe these steps.</p>
<p>Ask:</p>
<blockquote>
<p>Use the reporting tools to show my current user and available workspaces.</p>
</blockquote>
<p>On the first call, follow any tool-authorization link the client presents. Complete API consent and browser verification, then call the tool again if the client hasn't resumed. Existing sessions can reduce the prompts. Gateway login and the API grant remain separate, and you don't need to paste a token into the conversation.</p>
<p>The response should identify Alice and include <code>team-red</code>. <strong>Expected response shape for the Alice fixture:</strong></p>
<pre><code class="language-json">{
  "user_id": "user_ALICE_CLERK_ID",
  "workspaces": [
    {
      "workspace_id": "team-red",
      "name": "Team Red",
      "tier": "pro"
    }
  ]
}
</code></pre>
<p><code>user_ALICE_CLERK_ID</code> stands for the Clerk user ID you configured for Alice. This illustrates the response, not a captured live result.</p>
<p><strong>Checkpoint:</strong> The response identifies Alice and includes <code>team-red</code>. Gateway login, tool authorization, and the API now work together. You can use that workspace ID to request a report.</p>
<h3>9.1 Start Reports, Check Status, and Retrieve Results</h3>
<p>Some backend operations continue after the initial request returns. To expose that job workflow through MCP, the agent needs to start work, check progress, and collect the result. A job ID connects those calls. The synthetic report uses this pattern so you can apply it to an existing background workflow in your application.</p>
<p><code>start_report</code> sends a request such as:</p>
<pre><code class="language-json">{
  "workspace_id": "team-red",
  "topic": "Onboarding",
  "report_type": "advanced"
}
</code></pre>
<p>The API returns HTTP 202 with a <code>report_id</code>, <code>status</code>, and <code>poll_after_seconds</code>. The job has been accepted. The report is still pending. The agent waits, checks status, and retrieves the result when the status becomes <code>completed</code>. The agent should stop on <code>failed</code> and limit the number of checks.</p>
<p>The web application runs the jobs and stores their state. Each MCP call on Arcade Cloud starts work or reads progress. The job continues in the backend between calls. The sample uses a small in-memory job store and synthetic records. Restarting the web process loses the jobs. Reports also expire after 15 minutes. A production application would use its existing durable job system.</p>
<p>If a POST times out, a report might already exist. The helper doesn't tell the model to submit again blindly. Retrying a read and retrying job creation carry different consequences.</p>
<p>Then ask:</p>
<blockquote>
<p>Start an advanced report about onboarding in team-red. Keep its report ID, wait at least as long as the response requests between status checks, and retrieve the completed result. Stop after ten checks if still pending.</p>
</blockquote>
<p>The agent can now find an accessible workspace, start a report, and retrieve the result.</p>
<h2>10. Test Workspace Permissions and Subscription Tiers</h2>
<p>Now check that agent access respects the SaaS rules we started with: colleagues can work within their shared workspace, customers remain separated, and report access respects the workspace's plan. The reporting API checks workspace access and the required tier on every report request.</p>
<table>
<thead>
<tr>
<th>User</th>
<th>Workspace Access</th>
<th>Expected Result</th>
</tr>
</thead>
<tbody><tr>
<td>Alice</td>
<td>Team Red, Pro</td>
<td>Can create basic and advanced reports</td>
</tr>
<tr>
<td>Bob</td>
<td>Team Red, Pro</td>
<td>Can retrieve Alice's report</td>
</tr>
<tr>
<td>Carol</td>
<td>Team Blue, Basic</td>
<td>Can create basic reports. Advanced creation is denied</td>
</tr>
<tr>
<td>Carol using Alice's report ID</td>
<td>No Team Red access</td>
<td>Status and result lookups return the same unavailable response as an unknown ID</td>
</tr>
<tr>
<td>Optional staff user</td>
<td>Both workspaces</td>
<td>Can access both. Team Blue's tier rule still applies</td>
</tr>
</tbody></table>
<p>Use separate browser/client profiles, or reconnect when switching identities, so a cached grant doesn't hide which user you're testing.</p>
<p>The status and result routes look up the report's workspace and check access again. Knowing a job ID doesn't grant access to its output. Apply the same check to a download endpoint as to the request that starts the job.</p>
<p>Use the optional staff account to check access to both workspaces and confirm Team Blue's Basic tier still blocks advanced report creation. The model can't grant staff access by setting an <code>is_admin</code> argument. For your application, use the roles and policies your server controls.</p>
<p>Run the included local checks:</p>
<pre><code class="language-sh"># From web/
npm test
npm run typecheck

# From mcp/
uv run pytest
</code></pre>
<p>These checks cover the synthetic permissions and request behavior. Use the demo application accounts you created to test gateway login, tool consent, and browser verification. Start with the hosted <code>get_current_user</code> call before creating a report. A local greeting or healthy server alone won't test that flow.</p>
<h2>Troubleshoot MCP Authentication and API Errors</h2>
<p>We hit this during our integration: authentication worked, but the tool couldn't reach the backend. The problem was on our server. A successful login hadn't told us whether the API request would work.</p>
<table>
<thead>
<tr>
<th>Symptom</th>
<th>First Place to Check</th>
</tr>
</thead>
<tbody><tr>
<td>A local HTTP greeting works but a protected tool is rejected</td>
<td>Expected: the SDK’s local HTTP mode has no verified caller identity, so it blocks requires_auth tools before they run. See “Why Not Just Run the MCP Server Yourself?” Use the Cloud deployment and gateway, or local stdio with developer credentials</td>
</tr>
<tr>
<td>Deployment is unhealthy or reporting tools are missing</td>
<td>Check the selected project, Python entrypoint, dependency installation, and deployment logs</td>
</tr>
<tr>
<td>A reporting tool fails because REPORT_API_BASE_URL is missing</td>
<td>Open Servers, select the deployed reporting server, and add REPORT_API_BASE_URL in its secret configuration. Set it to your backend's public HTTPS origin, then retry the tool call.</td>
</tr>
<tr>
<td>Gateway asks the customer to sign into Arcade</td>
<td>Gateway must use the Clerk User Source</td>
</tr>
<tr>
<td>Tool authorization asks for an Arcade account</td>
<td>Configure the custom OAuth provider with your application's OAuth client credentials and register the custom verifier</td>
</tr>
<tr>
<td><code>user_mismatch</code></td>
<td>Browser session, User Source subject, and the identity that started the flow must match</td>
</tr>
<tr>
<td>Invalid callback</td>
<td>Compare the exact callback with the correct Clerk OAuth application's redirect list</td>
</tr>
<tr>
<td>API rejects the credential</td>
<td>Verify an API OAuth token. Check the expected OAuth client ID</td>
</tr>
<tr>
<td>Valid identity, operation denied</td>
<td>Check workspace membership and tier rules</td>
</tr>
<tr>
<td>Tool cannot reach the API</td>
<td>Check the hosted API base URL and backend availability. For the local demo, keep ngrok and the web process running</td>
</tr>
<tr>
<td>Old code still runs</td>
<td>Redeploy and confirm the gateway references the intended server</td>
</tr>
</tbody></table>
<p>Check the MCP deployment logs and the web application's logs separately. For the MCP logs, use the server name returned by deployment:</p>
<pre><code class="language-sh">uv run arcade server logs YOUR-SERVER-NAME
</code></pre>
<p>Log a request outcome and safe error category. Avoid logging bearer tokens, full authorization context, or upstream response bodies that may contain customer data.</p>
<h2>Connect MCP Tools to Your Existing Backend API</h2>
<p>To connect your own application, replace the synthetic report API with an operation your backend already provides. Describe the tools precisely: which one starts work, which retrieves results, and which identifiers the agent needs to keep. Replace the fixtures with your existing membership, role, and entitlement checks.</p>
<h3>Production Extensions: Tool Visibility, Permissions, and Durable Jobs</h3>
<p>The example gives users the same four tools and enforces their permissions in the API. Further production work could include:</p>
<ul>
<li><p><strong>Tool visibility based on permissions.</strong> Show clients tools appropriate to the user's role and plan, for example through <a href="https://docs.arcade.dev/en/operate/governance/contextual-access">Arcade's Contextual Access</a>. Keep the API checks when tools execute. Here, basic and advanced reports share <code>start_report</code>. Hiding that tool from Basic users would also remove their permitted basic reports. The requested workspace and report type still need authorization.</p>
</li>
<li><p><strong>Changing memberships and plans.</strong> Read current access rules from your application instead of static fixtures. Define and test how membership revocation and plan downgrades affect new requests and existing jobs.</p>
</li>
<li><p><strong>Durable jobs and safe retries.</strong> Persist job state and make report creation idempotent, so retrying the same submission after a timeout returns its original job instead of creating a duplicate. This enables complex, multi-step workflows where a single timeout or API failure doesn't crash the entire agentic loop.</p>
</li>
</ul>
<p>The MCP server gives the agent operations to call. Your API verifies the user's delegated credential and decides whether to allow the operation. Clerk supplies the identity. Arcade.dev runs the gateway and MCP tools and supplies the user's API token after authorization. You can expose more of your backend through the same pattern.</p>
<p>Full code: <a href="https://github.com/manveer/multi-tenant-mcp-server-oauth">multi-tenant-mcp-server-oauth</a>. Clone it, run the tests, swap in your API.</p>
<h2>Frequently Asked Questions</h2>
<h3>Does MCP support OAuth?</h3>
<p>Yes. The Model Context Protocol supports OAuth-protected remote servers, and clients like Claude and ChatGPT can complete that flow. This tutorial uses OAuth twice: once to sign the user into the Arcade.dev gateway, and once to obtain the delegated Clerk token that the tools send to the reporting API.</p>
<h3>Why use an MCP gateway instead of exposing the MCP server directly?</h3>
<p>A gateway, such as Arcade.dev, handles the plumbing you would otherwise build: sign-in through your existing identity provider, per-user token storage and refresh, and injecting the right user's token into the right tool call. It also gives customers one stable URL that can federate more MCP servers and enforce tool-level governance as you grow.</p>
<h3>Why not use Clerk's MCP support instead of a gateway?</h3>
<p>You can. Clerk can act as the authorization server for a self-hosted MCP server through dynamic client registration, which collapses this tutorial's three credentials into one. The trade-off: you host and operate the server yourself, and Clerk's MCP helpers target JavaScript frameworks while these tools are Python. Note that mcp.clerk.com is a different product: Clerk's own documentation server for AI coding agents.</p>
<h3>Do customers need an Arcade.dev account to connect their agent?</h3>
<p>No. The gateway's User Source lets customers sign in with their existing application login, with Clerk as the identity provider. Only the developer who deploys the MCP server needs an Arcade.dev account.</p>
<h3>Does this work with ChatGPT or only Claude?</h3>
<p>Any MCP client that supports the Streamable HTTP transport can use the same gateway URL. This tutorial connects Claude Desktop. For ChatGPT, add the gateway URL as a custom connector with OAuth, which requires developer mode and a plan that supports custom connectors.</p>
<h3>How do you stop an AI agent from accessing another tenant's data?</h3>
<p>Derive identity from the verified OAuth token and authorize in the API, never from arguments the model supplies. Here, the reporting API checks workspace membership and plan tier on every request, and lookups for a report the caller cannot access return the same response as an unknown ID, so report IDs grant nothing.</p>
<h3>What's the difference between authentication and authorization in an MCP server?</h3>
<p>Authentication proves who is calling; authorization decides what they may do. In this architecture, Clerk and the Arcade gateway handle authentication and token delegation, while authorization stays in the backend API, which applies the same workspace and tier rules it enforces for every other client.</p>
]]></content:encoded></item><item><title><![CDATA[Best MCP Gateways in 2026: A Hands-On Comparison]]></title><description><![CDATA[Based on product documentation, ten hands-on product evaluations, and analysis of more than 300 Reddit posts and comments.]]></description><link>https://aiagentengineering.hashnode.dev/best-mcp-gateways-2026</link><guid isPermaLink="true">https://aiagentengineering.hashnode.dev/best-mcp-gateways-2026</guid><category><![CDATA[AI]]></category><category><![CDATA[agentic AI]]></category><category><![CDATA[mcp]]></category><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Manveer Chawla]]></dc:creator><pubDate>Fri, 31 Jul 2026 20:37:10 GMT</pubDate><content:encoded><![CDATA[<p>Search for the best MCP gateways, and most page-one results are vendors ranking their own product. TrueFoundry publishes a gateway ranking, Composio publishes one, and Obot publishes one.</p>
<p>I built this comparison from three evidence layers. Official documentation, Reddit reports (excluding disclosed vendor accounts and my own comments), and hands-on evaluations against a reusable gateway for an API-backed multitenant B2B application.</p>
<p>An MCP gateway is the control point between an agent client and one or more MCP servers. It can aggregate tools, authenticate connections, enforce policy, and record traffic.</p>
<p>That definition covers a wide range of products, from Docker's local container gateway to enterprise control planes and integration runtimes. Treating them as interchangeable is the first mistake most comparisons make.</p>
<p><strong>Disclosure:</strong> My company, Zenith, provides content marketing services to <a href="http://Arcade.dev">Arcade.dev</a> and previously worked with Composio. The testing and conclusions in this article are my own.</p>
<h2><strong>TL;DR: Best MCP gateways by use case</strong></h2>
<ul>
<li><p><strong>Best for custom, multi-user B2B gateways:</strong> <a href="http://Arcade.dev"><strong>Arcade.dev</strong></a><strong>.</strong> It was the only product in my ten-product evaluation that completed the target architecture, accepted a custom MCP server, and connected successfully from Claude Code within 60 minutes.</p>
</li>
<li><p><strong>Best-supported local option based on independent evidence: Docker MCP Gateway.</strong> Has the most user reports on local MCP management, with strengths in container isolation and multi-client convenience, and clear limits outside Docker Desktop.</p>
</li>
<li><p><strong>Best fit for existing AWS estates: Amazon Bedrock AgentCore.</strong> It brings Lambda functions, APIs, and remote MCP servers into the same IAM, CloudTrail, and CloudWatch control plane teams already operate.</p>
</li>
<li><p><strong>Best when source availability is mandatory for downstream OAuth: Nango.</strong> It handles provider OAuth, token refresh, and credential storage, but assumes inbound authorization and gateway policy exist elsewhere. Arcade covered the complete multitenant MCP path in the hands-on test.</p>
</li>
<li><p><strong>Best fit for existing Kong deployments: Kong AI Gateway.</strong> Relevant when an organization already operates Kong's licensed data plane. Too complex for a greenfield MCP-only deployment.</p>
</li>
</ul>
<h2><strong>MCP gateway comparison: strengths, complaints, and test results</strong></h2>
<p>This comparison covers production-oriented, multi-user gateways that can expose custom applications and tools through MCP. I also included products built for narrower roles, like local development, downstream OAuth, integration catalogs, or security overlays, evaluating each of those against that standard rather than the full gateway job.</p>
<table style="min-width:568px"><colgroup><col style="min-width:25px"></col><col style="width:81px"></col><col style="width:73px"></col><col style="width:83px"></col><col style="width:74px"></col><col style="width:70px"></col><col style="width:81px"></col><col style="width:81px"></col></colgroup><tbody><tr><td><p><strong>Gateway</strong></p></td><td><p><strong>Category</strong></p></td><td><p><strong>Type</strong></p></td><td><p><strong>Primary strength</strong></p></td><td><p><strong>Biggest Reddit complaint</strong></p></td><td><p><strong>Docs confidence</strong></p></td><td><p><strong>Independent evidence volume</strong></p></td><td><p><strong>Hands-on result</strong></p></td></tr><tr><td><p>Arcade</p></td><td><p>Application and authorization gateway</p></td><td><p>Managed/self-hosted</p></td><td><p>Delegated authorization</p></td><td><p>Price clarity</p></td><td><p>High</p></td><td><p>Thin</p></td><td><p>Completed (60 min)</p></td></tr><tr><td><p>Docker MCP Gateway</p></td><td><p>Local MCP management</p></td><td><p>Open-source/local</p></td><td><p>Isolation and multi-client setup</p></td><td><p>Context bloat, headless friction</p></td><td><p>High</p></td><td><p>Moderate</p></td><td><p>Blocked, no self-serve tier</p></td></tr><tr><td><p>Amazon Bedrock AgentCore</p></td><td><p>Application and authorization gateway</p></td><td><p>Managed AWS platform</p></td><td><p>AWS-native API, Lambda, and MCP composition</p></td><td><p>IAM, cost, and Runtime session lifecycle</p></td><td><p>High</p></td><td><p>Thin</p></td><td><p>Out of scope, AWS configuration outside timeboxed evaluation</p></td></tr><tr><td><p>TrueFoundry</p></td><td><p>Application and authorization gateway</p></td><td><p>Hybrid enterprise</p></td><td><p>Unified AI governance</p></td><td><p>Platform tax, routing</p></td><td><p>Medium</p></td><td><p>Moderate</p></td><td><p>Partial, identity provider setup failed (30 min)</p></td></tr><tr><td><p>IBM ContextForge</p></td><td><p>Application and authorization gateway</p></td><td><p>Open-source/self-hosted</p></td><td><p>Enterprise federation</p></td><td><p>Operational weight</p></td><td><p>Medium</p></td><td><p>Thin</p></td><td><p>Out of scope, deployment infrastructure required</p></td></tr><tr><td><p>Nango</p></td><td><p>Integration and downstream-auth infrastructure</p></td><td><p>Source-available/managed auth</p></td><td><p>Downstream OAuth maintenance</p></td><td><p>Self-hosting, docs</p></td><td><p>Medium</p></td><td><p>Moderate</p></td><td><p>Different architectural layer (30 min)</p></td></tr><tr><td><p>Kong AI Gateway</p></td><td><p>Existing gateway extension</p></td><td><p>Hybrid enterprise</p></td><td><p>Existing Kong reuse</p></td><td><p>Heavy, retrofitted</p></td><td><p>Medium</p></td><td><p>Thin</p></td><td><p>Blocked at setup (10 min)</p></td></tr><tr><td><p>Obot</p></td><td><p>Application and authorization gateway</p></td><td><p>Open-source/self-hosted</p></td><td><p>All-in-one MCP platform</p></td><td><p>Few operational reports</p></td><td><p>Medium</p></td><td><p>Thin</p></td><td><p>Blocked at setup (15 min)</p></td></tr><tr><td><p>Composio</p></td><td><p>Integration and downstream-auth infrastructure</p></td><td><p>Managed integrations</p></td><td><p>Fast OAuth and breadth</p></td><td><p>Tool design, outages, trust</p></td><td><p>Medium</p></td><td><p>Deep</p></td><td><p>Not completed within timebox (70 min)</p></td></tr><tr><td><p>Merge Unified/Agent Handler</p></td><td><p>Integration and downstream-auth infrastructure</p></td><td><p>Managed integrations</p></td><td><p>B2B normalization</p></td><td><p>Lock-in, shallow objects</p></td><td><p>Medium</p></td><td><p>Moderate</p></td><td><p>Architecture mismatch (15 min)</p></td></tr><tr><td><p>Lunar MCPX</p></td><td><p>Local MCP management</p></td><td><p>Open-source/hybrid</p></td><td><p>Tool groups and governance</p></td><td><p>Setup, stability</p></td><td><p>Low</p></td><td><p>Thin</p></td><td><p>Blocked, no self-serve tier</p></td></tr><tr><td><p>MintMCP</p></td><td><p>Application and authorization gateway</p></td><td><p>Managed enterprise</p></td><td><p>SSO, RBAC, audit</p></td><td><p>Almost no independent use</p></td><td><p>Medium</p></td><td><p>Thin</p></td><td><p>Partial, enterprise features gated by plan (20 min)</p></td></tr></tbody></table>

<h2><strong>MCP gateway categories</strong></h2>
<p>These products serve different architectural roles, and lumping them together as direct competitors is misleading.</p>
<p><strong>Application and authorization gateways.</strong> Arcade, Obot, IBM ContextForge, Amazon Bedrock AgentCore, TrueFoundry, MintMCP. These sit between MCP clients and servers, handling authentication, authorization, policy, and tool management.</p>
<p><strong>Local MCP management.</strong> Docker MCP Gateway, Lunar MCPX. Focused on managing MCP servers on a developer workstation or local environment.</p>
<p><strong>Integration and downstream-auth infrastructure.</strong> Composio, Nango, Merge. These handle connections to third-party services, OAuth token management, and integration catalogs.</p>
<p><strong>Existing gateway extensions.</strong> Kong AI Gateway. MCP support added to an established enterprise API gateway platform.</p>
<h2><strong>How this MCP gateway comparison was researched</strong></h2>
<ul>
<li><p><strong>Corpus:</strong> Research covering more than 300 relevant Reddit posts and comments.</p>
</li>
<li><p><strong>Period:</strong> September 2024 through July 21, 2026. Hands-on testing took place July 20 and 21, 2026.</p>
</li>
<li><p><strong>Sources:</strong> Reddit communities focused on MCP, LLM development, self-hosting, systems administration, SaaS, AWS, and Terraform.</p>
</li>
<li><p><strong>Searches:</strong> Each product was paired with terms covering OAuth, production use, self-hosting, pricing, outages, migration, security, policy, observability, alternatives, and reviews.</p>
</li>
<li><p><strong>Evidence weighting:</strong> I weighted technical claims by specificity, repetition, freshness, and agreement with documentation or testing. I didn't treat disclosed vendor accounts or my own comments as independent user evidence.</p>
</li>
<li><p><strong>Version handling:</strong> I’ve labeled older reports as historical. Fixed vulnerabilities aren't presented as current defects.</p>
</li>
<li><p><strong>Hands-on testing:</strong> Each product was tested against the same target: exposing an API-backed multitenant application through a reusable MCP gateway.</p>
</li>
<li><p><strong>Test conditions:</strong> macOS, Claude Code client, up to roughly one hour per product.</p>
</li>
<li><p><strong>Last updated:</strong> July 21, 2026.</p>
</li>
</ul>
<p>The hands-on evaluations measured onboarding and architectural fit. Production load, failure recovery, token lifecycle, cost at scale, and security fell outside scope. The onboarding test favored products with a managed, self-service path. Products requiring local, containerized, or cloud infrastructure deployment were not attempted. Their out-of-scope status reflects the test design, not a product limitation.</p>
<p><strong>Evidence confidence levels.</strong> Each product is rated across three dimensions.</p>
<ul>
<li><p><strong>Hands-on testing</strong> (High/Medium/Low/Blocked/Out of scope) reflects the depth of the author's own evaluation.</p>
</li>
<li><p><strong>Documentation</strong> (High/Medium/Low) reflects how well vendor documentation supports the product's claims.</p>
</li>
<li><p><strong>Independent evidence volume</strong> (Deep/Moderate/Thin) measures how much verifiable, non-vendor evidence exists, not whether that evidence is favorable.</p>
</li>
</ul>
<p>Deep means enough independent reports to assess the product clearly. Moderate means some independent data, limited in scope. Thin means the independent record is near-empty or predominantly vendor-authored.</p>
<h2><strong>How to evaluate an MCP gateway: 10 criteria</strong></h2>
<p>These criteria came from repeated Reddit themes, not vendor feature matrices.</p>
<table style="min-width:448px"><colgroup><col style="min-width:25px"></col><col style="width:148px"></col><col style="width:275px"></col></colgroup><tbody><tr><td><p><strong>Evaluation criterion</strong></p></td><td><p><strong>Frequency in the research</strong></p></td><td><p><strong>What to verify</strong></p></td></tr><tr><td><p>Time to first working connection</p></td><td><p>High</p></td><td><p>Client configuration, restarts, and transport compatibility</p></td></tr><tr><td><p>OAuth and multi-user auth complexity</p></td><td><p>High</p></td><td><p>Refresh, revocation, tenant isolation, and delegated identity</p></td></tr><tr><td><p>Self-hosting burden</p></td><td><p>High</p></td><td><p>Desktop dependency, databases, Kubernetes, and upgrades</p></td></tr><tr><td><p>Policy and tool-level permissions</p></td><td><p>High</p></td><td><p>Server, tool, user, and agent enforcement boundaries</p></td></tr><tr><td><p>Debugging and observability</p></td><td><p>High</p></td><td><p>Useful traces, redaction, error attribution, and replay</p></td></tr><tr><td><p>Production reliability</p></td><td><p>High</p></td><td><p>Failover, session recovery, outages, and state across replicas</p></td></tr><tr><td><p>Integration maintenance</p></td><td><p>Medium to high</p></td><td><p>Provider drift, schema depth, webhooks, and token refresh</p></td></tr><tr><td><p>Pricing predictability</p></td><td><p>Medium</p></td><td><p>Minimums, usage units, cancellation, and scale curves</p></td></tr><tr><td><p>Lock-in and migration</p></td><td><p>Medium</p></td><td><p>Credential portability, configuration export, and reauthentication</p></td></tr><tr><td><p>Documentation and support</p></td><td><p>Medium to high</p></td><td><p>Headless setup, error quality, version accuracy, and escalation</p></td></tr></tbody></table>

<h2><strong>Hands-on MCP gateway test results</strong></h2>
<p>A fast vendor demo isn't the same as exposing a custom multitenant application through a reusable MCP gateway. GitHub provided a common integration baseline, but the real pass condition was whether the product could support the broader B2B architecture.</p>
<table style="min-width:553px"><colgroup><col style="min-width:25px"></col><col style="width:98px"></col><col style="width:102px"></col><col style="width:86px"></col><col style="width:89px"></col><col style="width:48px"></col><col style="width:105px"></col></colgroup><tbody><tr><td><p><strong>Product</strong></p></td><td><p><strong>GitHub baseline</strong></p></td><td><p><strong>Reusable multitenant gateway</strong></p></td><td><p><strong>Custom MCP server</strong></p></td><td><p><strong>MCP client connection</strong></p></td><td><p><strong>Time</strong></p></td><td><p><strong>Result</strong></p></td></tr><tr><td><p>Arcade</p></td><td><p>Completed</p></td><td><p>Yes</p></td><td><p>Yes</p></td><td><p>Claude Code</p></td><td><p>60 min</p></td><td><p>Completed</p></td></tr><tr><td><p>Composio</p></td><td><p>Completed after additional user auth</p></td><td><p>No</p></td><td><p>No supported path found</p></td><td><p>Not confirmed</p></td><td><p>~70 min</p></td><td><p>Not completed within timebox</p></td></tr><tr><td><p>Merge</p></td><td><p>Playground only</p></td><td><p>No</p></td><td><p>Not tested</p></td><td><p>Not confirmed</p></td><td><p>15 min</p></td><td><p>Architecture mismatch</p></td></tr><tr><td><p>Nango</p></td><td><p>Node.js and cURL example</p></td><td><p>Inbound gateway remained external</p></td><td><p>Not applicable to tested path</p></td><td><p>Not confirmed</p></td><td><p>30 min</p></td><td><p>Different architectural layer</p></td></tr><tr><td><p>Kong</p></td><td><p>Managed demo only</p></td><td><p>No</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>10 min</p></td><td><p>Blocked at setup</p></td></tr><tr><td><p>Obot</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>15 min</p></td><td><p>Blocked at setup</p></td></tr><tr><td><p>TrueFoundry</p></td><td><p>Completed</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>30 min</p></td><td><p>Partial, identity provider setup failed</p></td></tr><tr><td><p>MintMCP</p></td><td><p>Completed</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>20 min</p></td><td><p>Partial, enterprise features gated by plan</p></td></tr><tr><td><p>Docker MCP Gateway</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>N/A</p></td><td><p>Blocked, no self-serve tier</p></td></tr><tr><td><p>Lunar MCPX</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>Not reached</p></td><td><p>N/A</p></td><td><p>Blocked, no self-serve tier</p></td></tr></tbody></table>

<p>The category boundary matters. Arcade behaved like a gateway and governed runtime for this test. Composio behaved like a managed SaaS-tool connection layer. Merge delivered a fast vendor-controlled playground path.</p>
<p>Nango addressed downstream authentication to third-party services, but my own MCP endpoint still needed its own inbound authorization layer. Kong's managed experience behaved first like an LLM router, and reaching the MCP path required data-plane setup in my test. Obot's test ended at identity-provider configuration before I could evaluate its gateway.</p>
<h2><strong>Arcade MCP Gateway: best overall for custom multitenant B2B applications</strong></h2>
<p><strong>Bottom line:</strong> Arcade produced the strongest result in my ten-product evaluation. It was the only product that completed the target architecture.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://www.arcade.dev/product/">Arcade</a> combines an MCP gateway with managed tool execution, user-scoped credentials, authorization policy, audit, and an agent-oriented integration catalog. The product is built around safely letting agents act on behalf of individual users.</p>
<p><strong>What the cited Reddit reports consistently praise:</strong> Arcade's authorization controls, governance, and hook-level failure policies stand out.</p>
<p>A separate builder described <a href="https://www.reddit.com/r/mcp/comments/1re2cs5/built_contextual_access_for_arcade_and_it_solved/">access, pre-execution, and post-execution hooks</a> with input modification, output filtering, dry-run testing, and per-hook fail-open or fail-closed behavior. Another commenter identified <a href="https://www.reddit.com/r/mcp/comments/1re2cs5/comment/o79rgo5/">per-hook failure policy</a> as the most useful production design choice because different tools carry different risks.</p>
<p>The report documents policy behavior but doesn't include uptime, latency, high-availability, or scale data.</p>
<p><strong>What Reddit users complain about:</strong> Pricing clarity and category clarity are the blockers. One buyer questioned a <a href="https://www.reddit.com/r/modelcontextprotocol/comments/1n7svxn/tooling_pricing_arcade_vs_composio/">reported 100-fold call-price gap</a>. An earlier evaluator <a href="https://www.reddit.com/r/modelcontextprotocol/comments/1jitys1/arcadedev_frameworks_looks_right_like_mcp/">struggled to distinguish Arcade from MCP plus OAuth</a>.</p>
<p>The Reddit corpus doesn't have data on uptime, latency, self-hosted operating burden, support quality, or production scale.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Arcade was the only product that completed the full target architecture. Within 60 minutes, I connected GitHub, created the gateway through the web interface, added and removed tools, and attached a custom MCP server through either the web interface or command line.</p>
<p>The resulting URL connected successfully from Claude Code and supported MCP-native tool discovery. I also verified authentication at both boundaries, from Claude Code to the gateway and from the gateway to downstream tool calls.</p>
<p>Tool-level authentication worked after I hosted the tool on Arcade's runtime. The documentation didn't clearly state this requirement.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/1d3e51e8-b4b8-4c2c-9b7a-2af0a7ef3965.jpg" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Product teams building multi-user agents that take delegated actions in customer or employee accounts.</p>
<p><strong>Who should avoid this:</strong> Teams that only need a protocol proxy, a local MCP catalog, or a generic API gateway they already operate.</p>
<p><strong>Evidence confidence:</strong> Hands-on was high, since I completed the full target architecture in 60 minutes. Documentation was also high, covering authorization, governance, hook design, and deployment options. Independent evidence volume was thin, with no data on production adoption, reliability, self-hosted operations, or scale.</p>
<h2><strong>Docker MCP Gateway: best local open-source MCP setup</strong></h2>
<p><strong>Bottom line:</strong> Docker is the best default for centralized local MCP servers, but it's not a remote multi-user control plane.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> Docker's <a href="https://docs.docker.com/ai/mcp-catalog-and-toolkit/mcp-gateway/">Gateway and Toolkit</a> containerize MCP servers, inject credentials, manage server lifecycle, and expose one shared catalog to compatible clients. The pitch is safer, simpler local MCP management through Docker's existing desktop and container model.</p>
<p><strong>What Reddit users consistently praise:</strong> Users value <a href="https://www.reddit.com/r/mcp/comments/1kyx52h/thoughts_on_docker_mcp_toolkit/">one-time configuration, catalog convenience, and container isolation</a>. The 15 to 18 independent firsthand users make this the strongest local-use corpus in my comparison. Developers also like reusing the same managed server set across multiple desktop clients instead of maintaining separate configuration files.</p>
<p><strong>What Reddit users complain about:</strong> Tool-list inflation is the most measurable complaint. One report counted <a href="https://www.reddit.com/r/vibecoding/comments/1pedpxi/is_anyone_using_docker_mcp_to_save_on_tokens_and/">70 tools consuming about 49,351 tokens</a>. Another measured <a href="https://www.reddit.com/r/LocalLLaMA/comments/1ntyceo/dockermcp_whats_good_whats_bad_the_context_window/">13.3% context usage versus 0.1%</a>. <a href="https://www.reddit.com/r/mcp/comments/1pfazpz/docker_mcp_toolkit_alternatives/">ARM64 compatibility, secret handling, and headless deployment</a> create additional friction.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Access required filling out a sales form. I decided not to proceed, so this assessment is based on product documentation and the cited user reports.</p>
<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Developers who already use Docker Desktop and want isolated local servers shared across multiple MCP clients.</p>
<p><strong>Who should avoid this:</strong> Teams that need remote multi-user identity, delegated authorization, centralized enterprise policy, or a headless fleet control plane.</p>
<p><strong>Evidence confidence:</strong> Hands-on was blocked, and no self-serve tier was available. Documentation was high, with a clear product scope and well-defined feature boundaries. Independent evidence volume was moderate. The 15 to 18 independent firsthand users make this the strongest local-use corpus in this comparison, but coverage stays limited to local development, which is why it’s moderate rather than deep. No data exists on production governance, scale, or remote multi-user use.</p>
<h2><strong>Amazon Bedrock AgentCore Gateway: AWS-native managed MCP infrastructure</strong></h2>
<p><strong>Bottom line:</strong> AgentCore fits teams already standardized on AWS that want Lambda functions, APIs, and remote MCP servers behind an AWS-managed gateway. Its Runtime has limited but real production evidence. I found no independent production validation for Gateway, Identity, or Policy.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway.html">Amazon Bedrock AgentCore Gateway</a> composes Lambda functions, APIs, remote MCP servers, agent runtimes, and model providers behind one managed MCP endpoint. AWS documents protocol translation, inbound authorization, downstream credential exchange, tool filtering, semantic tool selection, policy, interceptors, and observability.</p>
<p>Gateway is one service in the wider AgentCore platform, alongside Runtime, Identity, Policy, Memory, and other agent infrastructure.</p>
<p><strong>What Reddit users consistently praise:</strong> The strongest evidence is broader than Gateway but includes real MCP production use. One user said their company runs AgentCore in production for <a href="https://www.reddit.com/r/aws/comments/1t5c4vf/comment/okfhi4t/">MCP deployments and agent sandboxes</a>. They liked its cold starts and cost, and still noted Amazon-specific constraints around state and MCP usage.</p>
<p>A separate evaluator called AgentCore <a href="https://www.reddit.com/r/aws/comments/1tzrfsh/comment/oqet40x/">the easiest way to set up an agent proof of concept (POC) on AWS</a>.</p>
<p>Gateway-specific reports support the architecture more than production maturity. One commenter identified <a href="https://www.reddit.com/r/aws/comments/1mk33et/comment/n7gquq8/">Gateway with Lambda targets</a> as the right fit for converting an existing backend into MCP tools. Another explained that Gateway becomes useful as <a href="https://www.reddit.com/r/aws/comments/1pwtc53/comment/nx08mbj/">one intermediary for many agents and remote MCP servers</a> because it can centralize inbound and outbound identity and observability.</p>
<p>But that same discussion contains the opposing boundary. Adding a single remote MCP server as a Gateway target may be <a href="https://www.reddit.com/r/aws/comments/1pwtc53/comment/nwewe3t/">unnecessary over-engineering</a> when the agent can call it directly.</p>
<p><strong>What Reddit users complain about:</strong> The most concrete operational complaints concern AgentCore Runtime and the surrounding AWS platform, not Gateway itself. One evaluator reported Runtime sessions continuing toward the eight-hour maximum after StopRuntimeSession, creating a <a href="https://www.reddit.com/r/aws/comments/1sh0324/agentcore_memory_leak/">session-lifecycle and billing risk</a>.</p>
<p>That's a Runtime issue, not a defect in AgentCore Memory or proof of a Gateway problem. Another user struggled to get <a href="https://www.reddit.com/r/aws/comments/1qqhs2k/im_going_nuts_how_do_i_stream_agentcore_container/">container logs into CloudWatch</a> because of execution-role permissions and unwieldy OpenTelemetry output.</p>
<p>A separate pricing-calculator error produced a <a href="https://www.reddit.com/r/aws/comments/1ptjl4l/bedrock_agentcore_pricing_calculator_incorrect/">$16 million estimate</a> after confusing vCPU-hours with vCPU-seconds. That was a calculator defect, not an actual bill.</p>
<p>Infrastructure maturity and lock-in remain fit questions. A community member built a <a href="https://www.reddit.com/r/Terraform/comments/1rlx3a6/terraform_module_for_bedrock_agentcore_runtime/">Terraform module</a> after finding the workflow too CLI- and script-oriented.</p>
<p>That complaint is dated. AWS reports that its AgentCore CDK constructs <a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/release-notes.html">became stable in May 2026</a>. A comparative evaluator still praised Firecracker session isolation while criticizing <a href="https://www.reddit.com/r/AI_Agents/comments/1u2vgih/i_evaluated_7_production_agent_runtimes_against_7/">AWS lock-in and the absence of on-premises deployment</a>.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>Hands-on status:</strong> Out of scope. Creating the required AWS account configuration, roles, targets, and related infrastructure was outside the timeboxed evaluation. This assessment is based on product documentation and the cited user reports.</p>
<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> AWS-standardized teams already operating Lambda, API Gateway, Cognito or another compatible identity provider, IAM, CloudTrail, and CloudWatch that want MCP to live in the same control plane.</p>
<p><strong>Who should avoid this:</strong> Teams that require cloud portability, on-premises deployment, a lightweight standalone gateway, simple cost attribution, or minimal AWS IAM and networking work.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was out of scope, since creating the required AWS configuration fell outside the timeboxed evaluation. Documentation was high, with extensive AWS coverage across Gateway, Runtime, Identity, and Policy. Independent evidence volume was thin. One production account covers Runtime, and several implementation discussions exist, but I didn’t find any independent Gateway production report.</p>
<h2><strong>TrueFoundry MCP Gateway: Kubernetes-native enterprise governance</strong></h2>
<p><strong>Bottom line:</strong> TrueFoundry fits regulated teams that want model, MCP, and agent governance inside their VPC. Gateway-only buyers inherit a larger platform than they need.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> TrueFoundry's <a href="https://www.truefoundry.com/docs/ai-gateway/mcp/mcp-federated-architecture">federated architecture</a> provides centralized auth, role-based access, audit, budgets, and policy while keeping runtime components within the customer's infrastructure. The MCP gateway sits inside a wider platform for governing models, agents, and AI workloads.</p>
<p><strong>What Reddit users consistently praise:</strong> Governance, private deployment, RBAC, audit, and budgets drive positive evaluations. One established account <a href="https://www.reddit.com/r/sysadmin/comments/1ufzd34/anyone_deployed_an_mcp_gateway_in_production_yet/">called the platform excellent</a>. A promotional-looking account reported <a href="https://www.reddit.com/r/LLMDevs/comments/1u91jk0/my_team_evaluated_5_ai_gateways_for_deployment/">working fallback chains</a>, which is useful product evidence but isn't independent validation.</p>
<p><strong>What Reddit users complain about:</strong> Routing configuration is the most specific repeated criticism. Two independent evaluators described <a href="https://www.reddit.com/r/LLMDevs/comments/1l1n95h/llm_proxy_in_production_litellm_portkey_helicone/">fragmented routing configuration</a> as less flexible than Portkey, a competing LLM proxy tool. Another reported <a href="https://www.reddit.com/r/mlops/comments/1uztauk/looking_at_litellm_alternatives_after_hitting/">dropped Google flags and incorrect token counts for virtual models</a>.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> The basic GitHub integration test completed in about 10 minutes with no friction.</p>
<p>Setting up a custom external identity provider didn't work. The configuration kept returning errors when connecting the external provider. I gave up after about 30 minutes total. For a product whose positioning centers on enterprise governance, the identity layer is a core differentiator that I couldn't validate.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/89f3c1a3-c4a8-48ce-8c6d-446a5dd12e91.png" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Regulated organizations already standardized on Kubernetes that want one control plane for models, MCP servers, and agents.</p>
<p><strong>Who should avoid this:</strong> Teams shopping for a thin MCP proxy, a low-operations managed integration layer, or a lightweight local tool.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was medium. The basic GitHub test completed in 10 minutes, but identity provider setup failed with configuration errors after 30 minutes. Documentation was medium, with federated architecture, RBAC, audit, and budget controls. Independent evidence volume was also moderate. One established account praised it, and routing complaints come from independent evaluators, but I found no production-scale validation.</p>
<h2><strong>IBM ContextForge: open-source MCP gateway for enterprise federation</strong></h2>
<p><strong>Bottom line:</strong> ContextForge has the broadest documented open-source enterprise feature set in this comparison. Before production, test high availability, latency, restart recovery, and operating burden.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://ibm.github.io/mcp-context-forge/latest/">ContextForge</a> federates MCP, A2A, REST, and gRPC services behind virtual servers, plugins, policy controls, identity features, and OpenTelemetry. The pitch is an enterprise control plane for mixed protocols and upstream services.</p>
<p><strong>What Reddit users consistently praise:</strong> The strongest firsthand account covers <a href="https://www.reddit.com/r/mcp/comments/1p1pmn5/thinking_of_building_a_iam_mcp_for_ai_tools/">virtual servers, SSO, and encrypted downstream personal access tokens</a>. A separate user described <a href="https://www.reddit.com/r/OpenWebUI/comments/1o3dh48/how_do_you_pass_multiple_pats_to_a_langgraph_mcp/">header rewriting for Jira Data Center</a>. Another company <a href="https://www.reddit.com/r/mcp/comments/1ore3vy/so_glad_i_found_this_today_im_an_it_auditor_and/">self-hosted ContextForge while evaluating Kong</a>.</p>
<p>The real strength is federation with identity bridging, which goes beyond simple protocol proxying.</p>
<p><strong>What Reddit users complain about:</strong> Operational complexity is the recurring cost. The strongest operator still considered consolidating components, and <a href="https://www.reddit.com/r/mcp/comments/1oq7khh/best_ready_to_use_mcp_gateway/">older production warnings</a> show why version dates matter.</p>
<p>The cited reports cover IAM and federation, but leave out high availability, A2A traffic, or latency under load.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>Hands-on status:</strong> Out of scope. ContextForge required deploying and managing the service either locally or on the cloud, which I kept out of scope for this test. This assessment is based on product documentation and the cited user reports.</p>
<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Enterprises that require a fully self-hosted control plane, mixed upstream protocols, and integration with existing IAM.</p>
<p><strong>Who should avoid this:</strong> Small teams without clear ownership for deployment, databases, upgrades, observability, and incident response.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was out of scope, since it required deployment infrastructure. Documentation was medium, with the broadest open-source feature set in this comparison, but I couldn’t verify this myself. Independent evidence volume was thin. The strongest account covers SSO, virtual servers, and header rewriting, but there’s no HA, A2A traffic, or latency data.</p>
<h2><strong>Nango MCP Auth: downstream OAuth infrastructure, not an inbound MCP gateway</strong></h2>
<p><strong>Bottom line:</strong> Nango is a strong supporting component when your gateway needs to connect users to third-party APIs or MCP servers without owning provider-specific OAuth maintenance. It didn't replace the inbound authorization layer I needed to expose my own multitenant application through MCP.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://nango.dev/">Nango</a> provides managed OAuth, token refresh, credentials, and integration infrastructure, with support for exposing integrations to agents and MCP clients. It focuses on auth and integration maintenance instead of a full enterprise MCP control plane.</p>
<p><strong>What Reddit users consistently praise:</strong> Independent builders often appreciate how Nango reduces provider-specific OAuth work. A QuickBooks builder recommended <a href="https://www.reddit.com/r/ClaudeAI/comments/1sm9n6l/comment/ogp989i/">using Nango as the auth layer</a> while the application requested a fresh access token per request.</p>
<p>A separate RAG builder <a href="https://www.reddit.com/r/Rag/comments/1pevo4w/i_dont_know_why_i_waited_so_long_to_add/">used it to add Google Drive, Dropbox, and Notion</a>, and a bootstrapped SaaS developer said <a href="https://www.reddit.com/r/SaaS/comments/1jxhny1/comment/nlr14l3/">Nango's local authentication did exactly what they needed</a>. These reports validate setup convenience and reduced OAuth work, but none covers multi-month token refresh or production tenant isolation.</p>
<p><strong>What Reddit users complain about:</strong> Self-hosting, documentation, regional hosting, and product boundaries recur as blockers. One <a href="https://www.reddit.com/r/selfhosted/comments/1n2lgxd/do_you_have_any_idea_how_nango_api_works_for_self/">self-hoster received HTML from an API call</a> and couldn't progress. Another buyer wanted <a href="https://www.reddit.com/r/b2b_sales/comments/1pk3oxq/comment/ntoiu2q/">EU hosting and stronger token security</a>. A bootstrapped developer liked Nango's authentication but found the <a href="https://www.reddit.com/r/SaaS/comments/1jxhny1/comment/nlr14l3/">unified API cost-prohibitive</a>.</p>
<p>A 2023 evaluator found <a href="https://www.reddit.com/r/SaaS/comments/126wznl/comment/jg0vir4/">pagination, documentation, and data mapping outside Nango's useful scope at the time</a>. That report applies to the 2023 release, so don’t treat it as current behavior.</p>
<p>A CRM developer used Nango to <a href="https://www.reddit.com/r/Rag/comments/1pevo4w/comment/nsg6tk4/">rapidly connect a fragmented set of CRMs</a> for a partner-management product, but said they'd build that layer in-house today. That supports Nango as a way to ship faster early on. But it also shows Nango didn't remove the custom domain logic or the eventual build-versus-buy decision.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Google SSO was easy, and Nango's Node.js and cURL examples worked without friction against GitHub. The architectural boundary became clear within 30 minutes.</p>
<p><a href="https://nango.dev/docs/guides/auth/mcp-auth">Nango MCP Auth</a> helps an application connect outward to third-party MCP servers and stores the resulting OAuth tokens. It didn't act as the inbound OAuth authorization server in front of my own multitenant MCP endpoint.</p>
<p>In my architecture, the identity provider and application gateway still had to handle client registration, user login, token issuance, audience restriction, and bearer-token verification. Nango only managed the downstream credentials.</p>
<p>I stopped because completing the target architecture required way more infrastructure than the test justified. The getting-started success action also centered on starring Nango's GitHub repository rather than proving the API-to-MCP path I was trying to build.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/50d5d83e-f493-4d3f-a353-9ed7403e2e7d.jpg" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Teams that already have an inbound gateway or authorization layer and want to own their integration logic while outsourcing downstream OAuth edge cases and ongoing provider maintenance.</p>
<p><strong>Who should avoid this:</strong> Buyers expecting Nango alone to expose and authorize access to their own multitenant MCP service, normalized business objects, mature MCP policy, or a self-hosted product that requires little operational work. Teams using only client-credentials grants gain less from user-facing OAuth management. One developer described <a href="https://www.reddit.com/r/django/comments/1tqf64b/comment/ooga04b/">that exact architectural preference</a>.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was medium. I tested for 30 minutes, and the Node.js and cURL examples worked, but then I stopped when the architectural boundary became clear. Documentation was also medium. The OAuth setup path was clearly laid out, but self-hosting docs drew complaints. Independent evidence volume was moderate. Multiple independent builders praise OAuth abstraction, but there’s no multi-month refresh data, and self-hosting reports are mostly negative.</p>
<h2><strong>Kong AI Gateway: MCP support for existing Kong deployments</strong></h2>
<p><strong>Bottom line:</strong> Kong is the incumbent-extension choice for organizations already governing APIs through Kong. It's a weak greenfield recommendation for teams that only need MCP.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://developer.konghq.com/mcp/">Kong AI Gateway</a> extends Kong's traffic management, plugins, security, and observability model to AI and MCP traffic. The pitch is to govern MCP through the same gateway platform you already use for APIs.</p>
<p><strong>What Reddit users consistently praise:</strong> Kong's mature gateway controls carry real weight. Users respect its <a href="https://www.reddit.com/r/LLM_Gateways/comments/1r0bmem/what_ai_gateway_are_you_using_to_scale_llm/">PII controls</a> and <a href="https://www.reddit.com/r/LLM_Gateways/comments/1reac7n/whats_the_best_llm_router_for_production_need/">semantic routing</a>. The real positive is practical. Kong reuses infrastructure, skills, plugins, and procurement that already exist.</p>
<p><strong>What Reddit users complain about:</strong> As one Redditor put it, Kong is "<a href="https://www.reddit.com/r/LLMDevs/comments/1u91jk0/my_team_evaluated_5_ai_gateways_for_deployment/">Powerful if you are already a Kong shop</a>". One team spent <a href="https://www.reddit.com/r/AgentsOfAI/comments/1syk2lg/compared_aws_api_gateway_azure_apim_kong_and/">two weeks implementing per-agent identity in Lua</a> before choosing Gravitee. I found almost no independent production use of Kong's MCP and A2A-specific plugins.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Google SSO was straightforward, and creating an AI Gateway was easy. Kong's managed demo worked within five minutes, but the experience initially felt more like an LLM router than an MCP gateway.</p>
<p>The GitHub MCP path stopped at Kong data-plane setup. The next documented stage required a Kong data plane and applicable licensing. Because the evaluation excluded deploying an existing enterprise gateway stack, I stopped at that point. This reinforced Kong's fit as an extension for existing Kong customers.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/e3884548-1d2e-4094-920c-5871b81e2175.png" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Organizations with an established Kong platform team that want MCP policy and traffic to live in the same operational control plane.</p>
<p><strong>Who should avoid this:</strong> Greenfield teams that would be adopting Kong solely for MCP or that need delegated integration auth out of the box.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was low. In 10 minutes, I only reached a managed demo before stopping at the licensed data-plane setup requirement. Documentation was medium, since Kong is a mature platform with well-covered infrastructure. Independent evidence volume was thin. Kong is respected among existing Kong shops, but I didn’t find any MCP-specific production evidence to back it up.</p>
<h2><strong>Obot MCP Gateway: open-source hosting, registry, and access</strong></h2>
<p><strong>Bottom line:</strong> Obot combines hosting, registry, access, and client delivery in one open-source platform. The independent evidence amounts to one Kubernetes deployment and one shorter "works well" report.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://docs.obot.ai/concepts/mcp-gateway/">Obot</a> combines MCP hosting, a registry, OAuth, access rules, audit, and a client in one self-hostable platform. It covers the full path from server deployment to governed end-user access.</p>
<p><strong>What Reddit users consistently praise:</strong> The strongest case is a <a href="https://www.reddit.com/r/mcp/comments/1pnc1fu/mcp_server_dev_hosting_whats_your_current_stack/">six-node Kubernetes environment</a> using Obot to organize several MCP services. Another user simply <a href="https://www.reddit.com/r/mcp/comments/1t68q20/anyone_using_a_gateway_in_front_of_multiple_mcp/">said it works well</a>. These reports support the value of putting hosting, access, discovery, and client access in one system.</p>
<p><strong>What Reddit users complain about:</strong> In the direct comparison I found, one evaluator preferred <a href="https://www.reddit.com/r/mcp/comments/1uimr8h/what_are_you_guys_using_these_days_to_manage/">TrueFoundry</a> for registry, RBAC, OAuth, and observability. Obot's own DevRel acknowledged that the <a href="https://www.reddit.com/r/MCPservers/comments/1n9fgs7/mcp_gateways_as_the_power_grid_for_enterprise_ai/">quick Docker examples were minimal</a> and that production requires persistent infrastructure. Both disclosed security issues were fixed, so it’s worth verifying you're running the patched version during deployment.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Obot's cloud signup started by provisioning an instance. I spent about 15 minutes on the test, most of it waiting for that instance to become available.</p>
<p>Continuing required configuring a separate supported identity provider. Because that dependency was outside my test setup, I stopped before evaluating the gateway. I didn't reach Obot's gateway, registry, access-control, or runtime capabilities.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/43718de3-d0a5-4448-b098-9b7e02029042.png" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Teams that want one open-source system for MCP hosting, registry, access, and client delivery.</p>
<p><strong>Who should avoid this:</strong> Buyers who require a long production track record, externally validated HA characteristics, or the deepest enterprise governance today.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was low. I spent 15 minutes on the test and got blocked at OAuth-provider setup before reaching the gateway. Documentation was medium. Hosting, registry, access, and OAuth are all covered. Independent evidence volume was thin. It comes down to one Kubernetes deployment and one shorter positive report.</p>
<h2><strong>Composio MCP Gateway: managed toolkit integration layer</strong></h2>
<p><strong>Bottom line:</strong> Composio is one of the fastest ways to give an agent access to many SaaS products, and I found its initial SaaS-tool onboarding fast in my own testing. But independent reports and a confirmed 2026 security incident raise questions that high-risk teams should investigate before production use.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://docs.composio.dev/docs/migration-guide/mcp-servers-to-sessions">Composio Sessions</a> provides per-user endpoints, managed authentication, tool allowlists, routing, and a broad integration catalog. The pitch is fast access to many SaaS tools without building each OAuth and execution layer yourself.</p>
<p><strong>What Reddit users consistently praise:</strong> The cited reports like the setup speed, integration breadth, and Tool Router's context reduction. One user said the <a href="https://www.reddit.com/r/ClaudeAI/comments/1qpnl4v/comment/o9mk1am/">Tool Router worked well and reduced context bloat</a>. An n8n builder also reported <a href="https://www.reddit.com/r/n8n/comments/1m35g9b/how_easy_it_is_to_built_a_social_media_automation/">getting a social automation workflow working</a> through Composio's MCP layer.</p>
<p><strong>What Reddit users complain about:</strong> The strongest recurring negative is poor LLM-oriented tool design, including excessive parameters, thin API wrappers, <a href="https://www.reddit.com/r/LangChain/comments/1i2kufy/comment/mri5j0w/">missing-parameter failures</a>, and agents that fail to complete actions. The original evaluator later said <a href="https://www.reddit.com/r/LangChain/comments/1i2kufy/comment/mrwxtf6/">the same problem caused them to abandon Composio</a>. A separate firsthand report said <a href="https://www.reddit.com/r/AI_Agents/comments/1jflbir/what_platforms_are_you_using_for_tools_mcps_in/mirsj72/">multi-tenancy “doesn’t seem to scale well” and some tools “feel like placeholders”</a>.</p>
<p>Users also report a <a href="https://www.reddit.com/r/developersIndia/comments/1toj7po/any_good_reliable_alternatives_to_composio/">four-day outage</a>, a GitHub connection that remained active but returned <a href="https://www.reddit.com/r/claude/comments/1tp0wsu/comment/oo60gp3/">401 Bad Credentials</a>, <a href="https://www.reddit.com/r/ClaudeAI/comments/1qpnl4v/comment/ogt77dz/">opaque charges</a>, and risk from <a href="https://www.reddit.com/r/mcp/comments/1j64skl/hosted_mcp_servers_urls_should_be_treated_as/">bearer-like hosted URLs</a>. In a separate report, another user said they <a href="https://www.reddit.com/r/claude/comments/1tp0wsu/comment/oo55dfe/">couldn't connect to MCP</a>.</p>
<p><strong>Verified incident history:</strong> Composio's <a href="https://composio.dev/blog/composio-may-2026-security-incident">official incident report</a> confirms unauthorized access, 5,001 compromised GitHub connections, roughly 0.3 percent of active connections leaked, and 5,241 API keys in a cache the attacker likely accessed. These are first-party confirmed incident facts, separate from the Reddit reliability reports.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Signup through Google SSO was easy, and I had the starter running in roughly 15 to 20 minutes after fixing a minor missing environment-loading step.</p>
<p>The initial success was misleading for my target architecture. The example used my local GitHub CLI rather than Composio's GitHub toolkit. After I explicitly instructed the agent to use Composio MCP, I had to connect GitHub to a user and discover that the request also needed that connected user's user_id. The getting-started path didn't explain this clearly.</p>
<p>Logs didn't appear in the web console, and the terminal output was highly verbose. The getting-started success action also centered on starring Composio's GitHub repository rather than proving the API-to-MCP path I was trying to build.</p>
<p>After about 70 minutes, I still hadn't created a reusable gateway where different users could authenticate. The toolkit endpoint generated in my test was user-specific, and I couldn't find a supported path for attaching my own remote MCP server or having Composio host it. For this test, Composio behaved more like a managed SaaS-tool connection layer than an organizational MCP gateway.</p>
<p>I used Claude for troubleshooting. It resolved most setup questions, but didn't close the authentication gap.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/087c74df-d5e1-4e09-8954-1e3cf1cd9aad.png" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Teams optimizing for prototype speed and broad SaaS coverage that can independently test critical integrations.</p>
<p><strong>Who should avoid this:</strong> High-risk teams should avoid Composio when failed actions, credential exposure, poor LLM-oriented tool design, or a prolonged outage could create material business or compliance impact. The most credible escape path in the Reddit evidence is <a href="https://www.reddit.com/r/LangChain/comments/1i2kufy/should_i_ditch_composiodev_for_direct_apis_in_my/">direct provider APIs or small in-house integrations</a>. That reduces middleware blast radius but transfers OAuth, API drift, and maintenance back to your team.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was medium. The starter worked in 70 minutes, but I never reached the target architecture, and the getting-started path was misleading. Documentation was medium. Sessions and tool routing were documented, but getting started didn't surface the user_id requirement. Independent evidence volume was deep, with enough independent praise, detailed criticism, outage reports, and a confirmed security incident to support clear conclusions.</p>
<h2><strong>Merge Agent Handler: B2B integrations for AI agents</strong></h2>
<p><strong>Bottom line:</strong> Merge Unified's track record doesn't validate Agent Handler. I found zero independent reports of connecting an MCP client, executing a tool, or testing its DLP, audit, or observability controls.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://www.merge.dev/">Merge</a> offers unified APIs and agent-facing integration infrastructure intended to normalize access across many B2B systems. Agent Handler extends that integration foundation into tools that agents can discover and execute.</p>
<p><strong>What Reddit users consistently praise:</strong> Merge Unified, not Agent Handler, has the positive track record. One firsthand user called an <a href="https://www.reddit.com/r/b2b_sales/comments/1pk3oxq/comment/ntj1ovz/">ATS deployment solid</a> but warned against using Merge for CRM. An HRIS evaluator said Merge was <a href="https://www.reddit.com/r/workday/comments/14krv7d/comment/jpsnwb7/">worth considering for normalized access across multiple providers</a>.</p>
<p>That supports standardized category coverage and maintenance reduction, not deep provider-specific behavior.</p>
<p><strong>What Reddit users complain about:</strong> Deep CRM, semantic normalization, pricing, and migration are the failure boundaries. A Salesforce team <a href="https://www.reddit.com/r/b2b_sales/comments/1pk3oxq/comment/ntirwix/">burned a quarter trying to make custom objects work</a> before switching to a CRM-specific provider. An HRIS evaluator found that Merge <a href="https://www.reddit.com/r/human_resources/comments/1sbb6rx/comment/ofcswif/">normalizes structure but not business meaning</a>, leaving customers to reconcile concepts like multiple definitions of an active employee.</p>
<p>Another user warned that <a href="https://www.reddit.com/r/b2b_sales/comments/1pk3oxq/comment/ntj9ot7/">pricing can rise sharply once Merge is embedded</a> and migration costs create sunk-cost pressure.</p>
<p>A customer with several hundred linked accounts said migration would require <a href="https://www.reddit.com/r/b2b_sales/comments/1pk3oxq/comment/nyvfv0v/">asking those customers to reauthenticate</a>. A Merge employee responded that credentials can be exported, but <a href="https://www.reddit.com/r/b2b_sales/comments/1pk3oxq/comment/onac6uk/">OAuth tokens remain tied to the application that issued them</a>. That's partly an OAuth-provider constraint, not something unique to Merge, but the customer migration cost remains real.</p>
<p>A production Workday deployment also reported <a href="https://www.reddit.com/r/workday/comments/199r98r/mergedev_timeout_issues_lack_of_workday_resources/">polling timeouts</a>. The thread didn't isolate the cause. It identified Workday API limits, request breadth, <a href="https://www.reddit.com/r/workday/comments/199r98r/comment/kifyrio/">batching and pagination</a>, and <a href="https://www.reddit.com/r/workday/comments/199r98r/comment/kiyvzw2/">timeout configuration</a> as contributing factors.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> Merge delivered the fastest guided first success. Google SSO, connecting GitHub, and executing a request in the web playground took about five minutes.</p>
<p>That success stayed inside Merge's playground. The toolkit URL generated in my test was user-specific, and progressing toward my multitenant gateway required several additional components. I couldn't find a path to one reusable endpoint where different users could authenticate and use the configured tools.</p>
<p>I stopped after 15 minutes because the product wasn't converging on the gateway architecture I was testing.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/f59a10cd-74d0-43c4-bc2e-ae47d596106f.png" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Choose Merge Unified when standardized HRIS, ATS, payroll, or similar category coverage matters more than provider-specific depth. Validate Agent Handler separately. Merge Unified's integration record doesn't carry over to it.</p>
<p><strong>Who should avoid this:</strong> Teams that require deep provider-specific objects, semantic normalization, predictable pricing at scale, or migration without widespread customer reauthentication. Avoid treating Agent Handler as proven when independent MCP production evidence is a requirement.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was low. In 15 minutes, I could only reach the playground, with no gateway-path convergence. Documentation was medium. The Unified API was well-covered, though Agent Handler’s material was thinner. Independent evidence volume was moderate, with concrete normalization, CRM-depth, pricing, and migration reports for Unified. But I didn’t find an independent Agent Handler deployment report.</p>
<h2><strong>Lunar MCPX: open-source MCP gateway that requires hardening</strong></h2>
<p><strong>Bottom line:</strong> Lunar MCPX has the right open-source primitives for centralized MCP governance, but the available independent reports describe a product that still needs hardening.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://github.com/TheLunarCompany/lunar">MCPX</a> provides a registry, tool groups, access policy, audit, and a self-hosted gateway for managing multiple MCP servers through one endpoint. It focuses on centralized visibility and selective tool exposure.</p>
<p><strong>What Reddit users consistently praise:</strong> The only positive production claim comes from <a href="https://www.reddit.com/r/mcp/comments/1s79jht/comment/odbl1bv/?utm_source=share&amp;utm_medium=web3x&amp;utm_name=web3xcss&amp;utm_term=1&amp;utm_content=share_button">Lunar's co-founder</a>. The independent reports describe setup failures, lost configuration, restarts, and migration away from MCPX.</p>
<p><strong>What Reddit users complain about:</strong> The pattern from independent users is setup and stability friction. Reports describe a <a href="https://www.reddit.com/r/mcp/comments/1l5gz2i/comment/mxcaims/">UI that could not connect to MCPX’s webserver</a>, a container that required <a href="https://www.reddit.com/r/mcp/comments/1nsjua8/comment/nhqk20e/">constant restarts</a>, and one user who <a href="https://www.reddit.com/r/mcp/comments/1q8fmmg/comment/nyq2gav/">switched to AgentGateway after finding MCPX unstable</a>.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> The identity provider was gated behind an enterprise plan and a sales call. Lunar does offer a locally deployable server that serves as a downstream auth manager, but I couldn't evaluate the full gateway without access to the identity layer.</p>
<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Open-source teams willing to test, patch, and operate an early gateway in exchange for control over deployment and policy.</p>
<p><strong>Who should avoid this:</strong> Teams that need reliable defaults, mature documentation, or proven production resilience now.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was blocked, since the identity provider was gated behind the enterprise plan. Documentation was low, described as weak by independent users. Independent evidence volume was thin. The sample is small and predominantly negative, and the only positive production claim is founder-authored.</p>
<h2><strong>MintMCP: compliance-focused MCP gateway with limited independent evidence</strong></h2>
<p><strong>Bottom line:</strong> MintMCP has strong compliance positioning and the weakest independent validation in this comparison. Don't shortlist it without customer references and a structured proof of concept.</p>
<h3><strong>Documentation and Reddit evidence</strong></h3>
<p><strong>What the company claims:</strong> <a href="https://www.mintmcp.com/">MintMCP</a> targets enterprise MCP hosting with SSO, RBAC, virtual servers, monitoring, policy, and audit controls. It's aimed at organizations that need compliance and centralized administration around MCP access.</p>
<p><strong>What Reddit users consistently praise:</strong> There's no recurring independent praise pattern. The best independent signal is a <a href="https://www.reddit.com/r/sysadmin/comments/1pyoq4e/mcp_security_in_enterprise_it_environments/">sysadmin who built a Cloud Run proxy</a> and said MintMCP would now tempt them. That's purchase consideration, not a deployment result.</p>
<p><strong>What Reddit users complain about:</strong> A smaller-team evaluator <a href="https://www.reddit.com/r/mcp/comments/1rtty48/comment/og7i36j/">called it too complex</a>. More important than that single criticism, at least 109 of 112 threads in our research were affiliated or company-authored. The corpus contains zero verified independent deployments, performance tests, or procurement accounts.</p>
<h3><strong>Hands-on evaluation</strong></h3>
<p><strong>What I found when I tested it:</strong> The basic GitHub setup worked end-to-end in about 20 minutes. The onboarding path was straightforward enough to complete without friction.</p>
<p>I couldn't test the identity features (SSO, RBAC, and related controls) because they're behind the Enterprise plan. For a product whose primary positioning is compliance and centralized administration, the core differentiators weren't accessible during evaluation.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6a6d05341601d4ba707cc197/6ec41dc9-c765-4804-92e9-9a0b55908776.png" alt="" style="display:block;margin:0 auto" />

<h3><strong>Recommendation</strong></h3>
<p><strong>Who should choose this:</strong> Compliance-focused buyers prepared to run a structured proof of concept and validate claims with customer references.</p>
<p><strong>Who should avoid this:</strong> Teams that require community-proven operations, transparent independent benchmarks, or a lightweight deployment.</p>
<p><strong>Evidence confidence:</strong> Hands-on testing was medium. The basic GitHub setup was completed in 20 minutes, but the Enterprise pricing tier blocked identity features. Documentation was medium. Product capabilities are covered, but core differentiators are gated by plan. Independent evidence volume was thin. 109 of 112 threads were affiliated or company-authored, with zero verified independent deployments, performance tests, or procurement accounts.</p>
<h2><strong>Where MCP gateway claims differ from user experience</strong></h2>
<table style="min-width:546px"><colgroup><col style="min-width:25px"></col><col style="width:113px"></col><col style="width:139px"></col><col style="width:119px"></col><col style="width:150px"></col></colgroup><tbody><tr><td><p><strong>Gateway</strong></p></td><td><p><strong>Official positioning</strong></p></td><td><p><strong>Recurring user experience</strong></p></td><td><p><strong>Hands-on result</strong></p></td><td><p><strong>My assessment</strong></p></td></tr><tr><td><p>Arcade</p></td><td><p>Production agent authorization and runtime</p></td><td><p>Reddit reports praise governance, auth, and policy hooks</p></td><td><p>Completed (60 min)</p></td><td><p>Best fit for the tested architecture</p></td></tr><tr><td><p>Docker</p></td><td><p>Simple, secure MCP management</p></td><td><p>Excellent locally, context and headless friction</p></td><td><p>Blocked, no self-serve tier</p></td><td><p>Best local default, not enterprise identity</p></td></tr><tr><td><p>Amazon Bedrock AgentCore</p></td><td><p>Integrated AWS infrastructure for agents and tools</p></td><td><p>Runtime has production use, Gateway evidence is architectural and operational friction spans IAM, cost, and IaC</p></td><td><p>Out of scope, AWS configuration outside timeboxed evaluation</p></td><td><p>Best fit for an existing AWS estate, no independent production validation for Gateway, Identity, or Policy</p></td></tr><tr><td><p>TrueFoundry</p></td><td><p>Unified enterprise AI gateway</p></td><td><p>Governance valued, routing setup can constrain</p></td><td><p>Partial, identity provider setup failed (30 min)</p></td><td><p>Good platform fit, poor thin-proxy fit</p></td></tr><tr><td><p>IBM ContextForge</p></td><td><p>Open-source federation and enterprise control</p></td><td><p>Identity bridging works, operation is substantial</p></td><td><p>Out of scope, deployment infrastructure required</p></td><td><p>Broad documented feature set, test HA, latency, and operating burden before production</p></td></tr><tr><td><p>Nango</p></td><td><p>OAuth and integration infrastructure</p></td><td><p>OAuth setup praised, long-running refresh and MCP evidence thinner</p></td><td><p>Different architectural layer (30 min)</p></td><td><p>Downstream auth complement, not an inbound gateway replacement</p></td></tr><tr><td><p>Kong</p></td><td><p>Enterprise AI and MCP governance</p></td><td><p>Powerful only when Kong is already present</p></td><td><p>Blocked at setup (10 min)</p></td><td><p>Incumbent extension with a high greenfield setup cost</p></td></tr><tr><td><p>Obot</p></td><td><p>All-in-one open-source MCP platform</p></td><td><p>One Kubernetes deployment and one shorter positive report</p></td><td><p>Blocked at setup (15 min)</p></td><td><p>The test stopped before reaching the gateway, cited evidence covers one Kubernetes deployment and one shorter report</p></td></tr><tr><td><p>Composio</p></td><td><p>Fast, broad agent integrations</p></td><td><p>Fast OAuth, tool-design and reliability problems</p></td><td><p>Not completed within timebox (70 min)</p></td><td><p>Strong managed-toolkit layer, weaker fit for organizational gateway composition</p></td></tr><tr><td><p>Merge</p></td><td><p>Unified B2B integrations for agents</p></td><td><p>Strong standardized categories, semantic logic, depth, pricing, and migration remain concerns</p></td><td><p>Architecture mismatch (15 min)</p></td><td><p>Fast playground result, no independent Agent Handler deployment evidence</p></td></tr><tr><td><p>Lunar MCPX</p></td><td><p>Governed open-source MCP hub</p></td><td><p>Setup, persistence, and stability complaints</p></td><td><p>Blocked, no self-serve tier</p></td><td><p>Local downstream auth server available, but full gateway couldn't be evaluated</p></td></tr><tr><td><p>MintMCP</p></td><td><p>Compliance-ready gateway</p></td><td><p>Almost all discussion is company-authored</p></td><td><p>Partial, enterprise features gated by plan (20 min)</p></td><td><p>Basic onboarding works, but core compliance differentiators couldn't be evaluated without Enterprise access</p></td></tr></tbody></table>

<h2><strong>Which MCP gateway should you choose for each failure mode?</strong></h2>
<table style="min-width:433px"><colgroup><col style="min-width:25px"></col><col style="width:106px"></col><col style="width:302px"></col></colgroup><tbody><tr><td><p><strong>If this is what keeps failing</strong></p></td><td><p><strong>Right fit</strong></p></td><td><p><strong>Why</strong></p></td></tr><tr><td><p>Custom multitenant application exposed through MCP</p></td><td><p>Arcade</p></td><td><p>The only tested product that completed the target architecture within 60 minutes</p></td></tr><tr><td><p>Private, self-hosted, or air-gapped MCP deployment with delegated authentication and policy controls</p></td><td><p>Arcade</p></td><td><p>Arcade documents<a target="_self" rel="noopener noreferrer nofollow" class="text-primary underline underline-offset-2 hover:text-primary/80 cursor-pointer" href="https://www.arcade.dev/product/" style="pointer-events:none"> <u>managed, self-hosted, and air-gapped deployment options</u></a>. My hands-on evaluation covered the managed path, not self-hosted or air-gapped operation</p></td></tr><tr><td><p>Local open-source MCP setup on a developer workstation</p></td><td><p>Docker MCP Gateway</p></td><td><p>Well-documented by independent users for local setup and server isolation. Not a substitute for remote multitenant governance without additional infrastructure</p></td></tr><tr><td><p>Existing AWS identity, serverless, and observability estate</p></td><td><p>Amazon Bedrock AgentCore</p></td><td><p>Fits teams already committed to AWS. I found no independent production validation for Gateway, Identity, or Policy</p></td></tr><tr><td><p>Fast managed SaaS toolkit prototype</p></td><td><p>Composio</p></td><td><p>The starter worked quickly, but it didn't become a reusable organizational gateway in my test</p></td></tr><tr><td><p>Broad HRIS and ATS integration maintenance</p></td><td><p>Merge</p></td><td><p>Strongest evidence in standardized B2B integration categories. I found no independent Agent Handler deployment report</p></td></tr><tr><td><p>One self-hosted platform for hosting, registry, and access</p></td><td><p>Obot</p></td><td><p>Combines hosting, registry, and access. My test stopped at identity-provider setup before reaching the gateway</p></td></tr><tr><td><p>MCP support inside an existing Kong deployment</p></td><td><p>Kong</p></td><td><p>Relevant when an organization already operates Kong's licensed data plane. Too complex for my greenfield baseline</p></td></tr></tbody></table>

<h2><strong>What Reddit evidence says about MCP gateways</strong></h2>
<p>Reddit provides implementation reports, not a reliable measure of independent community sentiment. Disclosed founders, employees, and affiliates can be identified, but undisclosed commercial relationships can't.</p>
<p>Vendor participation is common across this category. Composio has <a href="https://www.reddit.com/r/developersIndia/comments/1eyjfi2/i_am_working_on_composio_framework_for/">company-authored posts</a> alongside <a href="https://www.reddit.com/r/opencodeCLI/comments/1tljmqi/beware_of_stealth_marketing_for_composio_being/">community accusations of stealth marketing</a>. Nango's founder participates frequently in discussions about <a href="https://www.reddit.com/r/SaaS/comments/1jxhny1/questions_on_ipaasproduct_integration_platforms/">Nango's product boundaries</a> and <a href="https://www.reddit.com/r/mcp/comments/1nshviw/mcp_vs_tool_calls/">MCP's production readiness</a>.</p>
<p>Founder participation isn't inherently misleading, and affiliated posts can contain accurate technical information. But they don't establish independent adoption or satisfaction.</p>
<p>Reports carry the most weight when they describe a concrete architecture, configuration, error, workload, or operational outcome. Repeated patterns, current versions, documentation, and hands-on results increase confidence. Unsupported recommendations and sentiment-only comments carry little weight.</p>
<p>Version and product boundaries change several conclusions:</p>
<p>First, <a href="https://www.reddit.com/r/mcp/comments/1oq7khh/best_ready_to_use_mcp_gateway/">older ContextForge warnings</a> describing it as alpha or unsupported don't represent the current post-1.0 project. Its documented feature set has expanded substantially. No cited report covers current high availability, performance, or operating burden.</p>
<p>Second, AgentCore Gateway isn't interchangeable with AgentCore Runtime, Memory, Policy, Identity, or the older Bedrock Agents product. The reported AgentCore "memory leak" concerns <a href="https://www.reddit.com/r/aws/comments/1sh0324/agentcore_memory_leak/">Runtime session lifecycle and billing behavior</a>, not the AgentCore Memory service. One company's use of AgentCore for <a href="https://www.reddit.com/r/aws/comments/1t5c4vf/comment/okfhi4t/">MCP deployments and agent sandboxes</a> validates a narrow production use case, not every AgentCore service.</p>
<p>Third, the <a href="https://github.com/advisories/GHSA-vw82-7fv8-r6gp">Obot gateway authorization bypass</a> and <a href="https://www.reddit.com/r/AgentAuthorization/comments/1uf208w/obots_ssrf_fired_during_oauth_metadata_sync/">OAuth metadata SSRF</a> were fixed. Use patched versions and test API authorization and outbound network controls.</p>
<p>Fourth, the Composio security incident isn't Reddit speculation. <a href="https://composio.dev/blog/composio-may-2026-security-incident">Composio confirms</a> unauthorized access, 5,001 compromised GitHub connections, about 0.3 percent of active connections leaked, and 5,241 API keys sitting in an auxiliary cache the attacker likely accessed. These incident facts come from Composio's official report.</p>
<p>Fifth, Reddit discussions frequently collapse Kong's traditional API gateway, AI Gateway, and MCP-specific plugins into a single product reputation. The corpus contains no MCP-specific production validation.</p>
<p>Finally, open source doesn't mean operationally free. ContextForge, Obot, Lunar MCPX, Docker's headless gateway, and self-hosted Nango still require some combination of databases, Kubernetes, upgrades, monitoring, security hardening, and incident ownership. No software-license fee doesn't mean no platform-engineering cost.</p>
<h2><strong>Common mistakes when choosing an MCP gateway</strong></h2>
<ul>
<li><p>Choosing integration count instead of measuring whether an agent can actually use the tool schema reliably.</p>
</li>
<li><p>Treating server authentication as if it solved downstream per-user authorization.</p>
</li>
<li><p>Selecting a desktop abstraction for a remote, multi-user production topology.</p>
</li>
<li><p>Assuming open source removes database, Kubernetes, upgrade, and incident ownership.</p>
</li>
<li><p>Waiting until security review to add credential isolation, tool-level policy, and attributable audit logs.</p>
</li>
<li><p>Ignoring migration until hundreds of customers must reconnect OAuth accounts.</p>
</li>
<li><p>Accepting vendor latency, token, or detection benchmarks without reproducing the workload.</p>
</li>
<li><p>Buying an integrated agent platform when a direct MCP connection or a single-purpose gateway would solve the problem with fewer IAM, networking, observability, and billing surfaces.</p>
</li>
<li><p>Treating apparently unaffiliated Reddit comments as verified independent evidence.</p>
</li>
</ul>
<h2><strong>MCP gateway research limitations and disclosures</strong></h2>
<p>Reddit overrepresents failures and underrepresents quiet enterprise deployments. Search coverage is incomplete, and names like Lunar, Merge, and ContextForge generate false positives.</p>
<p>The ten hands-on evaluations measured onboarding and architectural fit, not production load, failover, token expiry, revocation, cost at scale, audit completeness, or security. Of the ten, only <a href="https://www.arcade.dev/product/">Arcade</a> actually connected to Claude Code. I stopped Merge, Nango, Kong, and Obot when their setup or architecture diverged from the target, while TrueFoundry's identity provider setup failed with configuration errors after the basic test completed. Enterprise pricing tiers gated MintMCP's and Lunar MCPX's identity features, and Docker required a sales form to access. AgentCore and ContextForge fell outside the test’s scope, since they required setting up infrastructure on AWS and self-hosted deployments, respectively.</p>
<p><strong>Commercial disclosure:</strong> My company, Zenith, provides content marketing services to Arcade and previously worked with Composio. The product testing, Reddit research, comparisons, and conclusions are my own.</p>
<p>I'll update this article as products change and as more reproducible hands-on and production results become available. If you've run one of these gateways in production, share the topology, version, traffic level, failure mode, and migration outcome in the comments. That's the evidence this category needs.</p>
<h2><strong>Frequently asked questions about MCP gateways</strong></h2>
<h3><strong>What is an MCP gateway?</strong></h3>
<p>An MCP gateway is a control layer between MCP clients and one or more MCP servers. It centralizes routing, authentication, tool permissions, credentials, observability, and audit logs.</p>
<h3><strong>What is the difference between an MCP gateway and an MCP server?</strong></h3>
<p>An MCP server exposes tools, resources, and prompts to AI applications. An MCP gateway sits between clients and servers to aggregate connections, authenticate users, enforce policy, and record activity.</p>
<h3><strong>Do I need an MCP gateway?</strong></h3>
<p>Use an MCP gateway when multiple users, agents, clients, or servers require shared authentication, permissions, and auditing. A direct MCP server connection is enough for a single-user local workflow.</p>
<h3><strong>What is the best MCP gateway in 2026?</strong></h3>
<p>Arcade is the best MCP gateway for custom, multitenant B2B applications in this comparison. Docker MCP Gateway is the best local development option, while Amazon Bedrock AgentCore fits teams already operating on AWS.</p>
<h3><strong>What is the best open-source MCP gateway?</strong></h3>
<p>Docker MCP Gateway is the best open-source option for local development and shared desktop clients. IBM ContextForge targets self-hosted enterprise federation but requires more infrastructure and platform ownership.</p>
<h3><strong>What is the best MCP gateway for enterprise AI agents?</strong></h3>
<p>Arcade is the strongest fit for delegated authentication, tool-level policy, custom MCP servers, self-hosting, and air-gapped deployment. Amazon Bedrock AgentCore fits enterprises standardized on AWS IAM, CloudTrail, CloudWatch, and Lambda.</p>
<h3><strong>How does an MCP gateway improve security?</strong></h3>
<p>An MCP gateway centralizes user authentication, credential isolation, tool permissions, rate limits, and audit logs. It limits which users and agents can call each tool, but it does not make an insecure MCP server safe.</p>
<h3><strong>Can an MCP gateway be self-hosted?</strong></h3>
<p>Yes. Arcade supports self-hosted and air-gapped deployments. IBM ContextForge, Docker MCP Gateway, Obot, and Lunar MCPX also provide self-hosted options, with different requirements for identity, policy, monitoring, and maintenance.</p>
]]></content:encoded></item></channel></rss>