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
- Verify the serverUrl hostname is correct and publicly resolvable before configuring the MCP client
- Test the hostname with an external DNS query (e.g. dig/nslookup) to confirm it returns addresses
- 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
- DNS resolution errors: ENOTFOUND and getaddrinfo failures — how hostname lookups fail and how to debug them.
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)