koala73/worldmonitor · error · McpProxySsrfError

serverUrl DNS resolution returned no addresses

Error message

serverUrl DNS resolution returned no addresses

What it means

Thrown by assertServerUrlSafe in the MCP proxy when the serverUrl hostname resolves via DNS but the resolver returns an empty address list. This is an SSRF-guard precondition: the proxy refuses to fetch a target whose DNS name has no usable addresses, so it fires for misconfigured/placeholder hostnames or transient resolver empty answers, before any request is sent.

Solutions

  1. Verify the serverUrl hostname is correct and publicly resolvable before configuring the MCP client
  2. Test the hostname with an external DNS query (e.g. dig/nslookup) to confirm it returns addresses
  3. If the failure is intermittent, retry or restart the MCP proxy operation after DNS propagation
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at api/mcp-proxy.ts:172 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of koala73/worldmonitor@7d06c8633d (2026-08-21). Data as JSON: /api/errors/77c5f2e62b87f0c9. Report an issue: GitHub.

Appendix: source

Thrown at api/mcp-proxy.ts:174

function emitProxyUsage(req, status: number, durationMs: number, ctx, callerIdentity = null): void {
  if (!ctx) return;
  try {
    const usageIdentity = proxyUsageIdentityFor(req, callerIdentity);
    emitUsageEvents(ctx, [buildRequestEvent({
      requestId: deriveRequestId(req),
      domain: 'mcp',
      route: '/api/mcp-proxy',
      method: req.method,
      status,
      // Measured from handler entry, so this INCLUDES the auth/rate-limit
      // gates — unlike logProxyCall's `started`, which begins after auth.
      // The usage row is the end-to-end caller-visible latency.
      durationMs,
      reqBytes: deriveReqBytes(req),
      // Not tracked: the proxy streams upstream bodies through bounded readers
      // and jsonResponse sets no content-length, so there is no byte count to
      // report without buffering a second time. Size questions belong to
      // MAX_MCP_PROXY_RESPONSE_BYTES, not to this row.
      resBytes: 0,
      customerId: usageIdentity.customer_id,
      principalId: usageIdentity.principal_id,
      authKind: usageIdentity.auth_kind,
      tier: usageIdentity.tier,
      planKey: usageIdentity.plan_key,
      country: deriveCountry(req),
      ipCity: deriveIpCity(req),
      ipRegion: deriveIpRegion(req),
      executionRegion: deriveExecutionRegion(req),
      executionPlane: 'vercel-edge',
      originKind: 'mcp',
      cacheTier: 'no-store',
      ip: deriveIp(req),
      userAgent: deriveUserAgent(req),
      uaHash: null,
      referer: deriveReferer(req),
      acceptLanguage: deriveAcceptLanguage(req),

View on GitHub (pinned to 7d06c8633d)