Skip to content

Define the supported user journey for host-local managed MCP servers #8406

Closed as not planned

Description

@jyaunches

Problem statement

A NemoClaw operator can run a custom Model Context Protocol (MCP) server on the host but cannot connect it through managed MCP without another deployment layer.

Managed MCP accepts authenticated public HTTPS endpoints. It rejects loopback, private, and OpenShell host-alias targets. The documentation tells the operator to expose a local MCP server through public HTTPS, but it does not define a durable deployment pattern.

The resulting user journey is predictable:

  1. The operator runs an MCP server on host loopback.
  2. mcp add rejects the local URL.
  3. The operator exposes the server through a Cloudflare Quick Tunnel.
  4. mcp add initially succeeds and records the current public DNS answers in allowed_ips.
  5. Cloudflare later returns an address outside those pins, or a tunnel restart creates a new hostname.
  6. OpenShell correctly fails closed with CONNECT 403.
  7. The operator has no documented durable path that keeps the server host-local and preserves managed credential replacement and MCP policy enforcement.

This is not an agent-specific defect. The same contract applies to OpenClaw, Hermes, and LangChain Deep Agents Code. Scenario authors can also follow this path; a current Remy scenario implementation exposes its host-owned MCP broker through a Quick Tunnel.

History and requirement disposition

Issue #566 began with the host-local requirement:

  • launch or reuse an MCP server on the host;
  • keep its credentials outside the sandbox; and
  • connect the sandbox through a narrow OpenShell policy.

The June 30 design decision accepted native OpenShell MCP integration and explicitly superseded the proposed host proxy, host-launched subprocess, plaintext host route, and secret-bearing restart model.

PR #5876 then implemented authenticated public HTTPS Streamable HTTP endpoints. OpenShell owns the MCP policy and provider-backed credential replacement. NemoClaw runs no host listener, relay, or MCP process.

That decision improved the security boundary. It also narrowed the delivered user journey from "connect a host-local MCP server" to "connect an already hosted HTTPS MCP server." Issue #566 closed without a separate issue that owned the remaining host-local journey.

The current confusion follows from that history. The managed MCP feature name and original request suggest local custom-server support, while the implemented contract supports externally reachable HTTPS services.

Relationship to existing issues

This issue owns the product journey and the disposition of each deployment option. It must not duplicate the implementation owned by these issues:

This issue owns:

Options considered

Option Security and operational result Proposed disposition
Deploy the MCP server as a stable public HTTPS service Preserves the current managed MCP boundary when DNS answers remain within a controlled address set. Current supported path. Document required address stability.
Put a fixed-public-IP TLS gateway in front of a host-local server Preserves current OpenShell policy and credential replacement. The operator owns the gateway, private backhaul, TLS, and availability. Current compatibility path. Provide an implementation-neutral recipe.
Route a stable private HTTPS endpoint through --trusted-private-host Preserves exact address pins, TLS hostname validation, provider-backed credentials, and MCP policy. It still requires a routed address and reverse proxy outside loopback. Recommended near-term product path through #8176 and #8267.
Add an OpenShell-attested host or service identity Replaces DNS trust with gateway-attested destination identity while retaining MCP policy and credential injection. It can support loopback or operator-owned brokers without public ingress. Preferred long-term path for the complete #566 journey. Track as an OpenShell dependency after the service contract is accepted.
Run the MCP server inside the agent sandbox Avoids host networking. The process shares the agent sandbox and cannot safely receive host authority or separate credentials through current managed MCP. Bounded alternative for servers with no additional authority. Do not describe it as managed MCP.
Run the MCP server in a separate OpenShell service sandbox Separates server and agent policy, but current service exposure does not define an authenticated sandbox-to-service managed MCP destination. Future option related to an OpenShell service-identity capability.
Use agent-native local or plain HTTP MCP with a custom network policy Preserves general OpenShell egress audit but bypasses NemoClaw-managed credential replacement and generated MCP policy. Supported only as an explicitly different, lower-assurance integration path where its limits are acceptable.
Use a Cloudflare named tunnel Stabilizes the hostname but does not guarantee that every future DNS answer remains inside the original exact pins. Not sufficient by itself for managed MCP deployment.
Use a Cloudflare Quick Tunnel Creates a random development hostname and has no uptime guarantee. DNS or hostname changes break recorded MCP state. Development experiments only. Do not use for qualification or persistent scenarios.
Run mcp restart after DNS changes Re-resolves and refreshes managed state when an operator authorizes the operation. It introduces downtime and does not fix a changed Quick Tunnel hostname. Recovery operation, not a deployment pattern.
Automatically refresh pins or allow broad CDN ranges Reduces or removes the temporal DNS-rebinding protection and widens a credential-bearing route. Reject.
Restore a NemoClaw-managed host proxy or stdio bridge Adds a second credential and authorization boundary plus persistent host data-plane state. Remains rejected by the #566 decision.

Cloudflare documents Quick Tunnels as development-only and recommends a managed tunnel for production use: https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/

Desired behavior

An operator should be able to determine the supported deployment pattern before exposing a local service.

For the current release, NemoClaw should state that managed MCP requires a stable public HTTPS endpoint with a controlled address set. The documentation should provide a fixed-ingress pattern and reject Quick Tunnel as a persistent deployment recommendation.

After #8176 and #8267, NemoClaw should recommend a stable routed private HTTPS endpoint for host-local MCP servers. The command, lifecycle, diagnostics, and documentation must remain equivalent across OpenClaw, Hermes, and Deep Agents Code.

Loopback-only and broker-pinned hostnames should remain rejected until OpenShell provides an attested route. The diagnostic should name that missing capability rather than recommend another temporary public tunnel.

Recommended delivery sequence

  1. Current documentation and diagnostics
    • State that the existing managed MCP contract targets hosted HTTPS MCP services.
    • Document a stable public endpoint or fixed-ingress gateway as the current path.
    • Warn that Quick Tunnels and rotating CDN address sets are not persistent managed MCP endpoints.
    • Distinguish DNS pin drift, tunnel hostname replacement, TLS failure, upstream reachability, and credential failure.
  2. Routed private endpoints
  3. Complete host-local journey
    • Define the OpenShell service identity or attested host-route requirement.
    • Preserve destination identity, MCP method and tool policy, provider-backed credential replacement, audit, and lifecycle revocation.
    • Add the corresponding NemoClaw lifecycle only after an accepted OpenShell contract exists.
  4. Qualification
    • Require a real authenticated MCP initialize, tool discovery, and bounded tool call from inside each supported agent sandbox.
    • Exercise service restart, host restart, DNS drift, and endpoint replacement.
    • Do not accept a host-side /health request or credential-resolution status as end-to-end MCP evidence.

Constraints and non-goals

  • Do not weaken default-deny networking, server-side request forgery protection, DNS-rebinding protection, credential isolation, or MCP method enforcement.
  • Do not authorize arbitrary loopback, host-network, wildcard, suffix, CIDR, or user-authored allowed_ips access.
  • Do not make NemoClaw a persistent MCP data-plane proxy or credential-bearing process.
  • Do not treat automatic repinning as equivalent to destination identity.
  • Do not create agent-specific trust rules.
  • Do not make scenario-specific infrastructure a canonical NemoClaw behavior without an accepted product decision.

Acceptance criteria

Concrete example

Before:

local MCP server -> Quick Tunnel -> managed MCP add -> later CONNECT 403

After the near-term work:

local MCP server -> stable private HTTPS route -> exact trusted pins -> managed MCP

After an attested OpenShell service route exists:

operator-owned MCP service -> OpenShell service identity -> managed MCP

Checklist

Activity

  1. jyaunches commented on Aug 5, 2026

    @jyaunches
    ContributorAuthor

    Closing as a duplicate of #8176 and its managed MCP implementation issue #8267, both implemented by #8272. The additive #566/#5876 user-journey context has been copied to #8176.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    needs: triageAwaiting maintainer classification

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions