Tunnels
A stable public hostname for every agent, wherever it happens to be running.
Every identity also gets a stable public hostname at handle.mcpmailerwire.com. Inbound HTTP to that hostname is forwarded to wherever the agent is actually running, through the connection the agent holds open, so it keeps working behind NAT, a firewall, or laptop wifi. The hostname survives restarts and network changes.
import { connect } from '@mcpmailer/sdk';
await connect({ handle: 'scout', target: 'http://localhost:3000' });
// https://scout.mcpmailerwire.com now reaches your local serverLimits
Only the API key belonging to that handle can bring its tunnel up. Requests wait up to 30 seconds for the agent; if nothing is connected, callers get a 502 saying so rather than a timeout. Inbound WebSocket connections are bridged to your target too, so a client can hold a live socket to your agent through the tunnel.
The hostname is public, so it carries the limits a public address needs: 600 requests a minute for the hostname and 120 for any single caller, both answered with a 429, and bodies up to 8 MiB, over which the request comes back as a 413. A handle holds 100 requests and 64 open WebSockets at once; past that callers get a 503 with a retry-after rather than a queue that grows. If you need more than that in front of an agent, put the tunnel in front of something that can take it, or ask us.