koala73/worldmonitor · error

No result found in SSE response

Error message

No result found in SSE response

What it means

Thrown by parseJsonRpcResponse when an upstream MCP server answered with content-type text/event-stream but none of the parsed data lines contained a JSON-RPC object with a result or error field. The transport worked; the SSE payload simply never carried a JSON-RPC response (for example only keep-alive/comments, malformed data lines that were skipped, or a stream closed before the response frame).

Solutions

  1. Confirm the remote endpoint actually implements the MCP Streamable HTTP/SSE protocol and sends a JSON-RPC response frame
  2. Capture the raw SSE body to inspect which data lines were skipped by the JSON.parse guard
  3. Retry once: servers that flush events slowly can close the stream before the response frame
Defensive patterns

Strategy: validation

When it happens

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

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at api/mcp-proxy.ts:294

// Generic message surfaced to the caller when a serverUrl resolves to a
// private/reserved address. The specific blocked IP is deliberately NOT echoed
// back: returning it turns the proxy into an address oracle (the caller could
// enumerate internal IPs by observing which hostnames get blocked). SSRF review
// finding — log the concrete IP server-side for debugging, tell the caller only
// that the host is disallowed.
const SSRF_BLOCKED_PUBLIC_MESSAGE = 'serverUrl host is not allowed';

function throwBlockedAddress(blockedAddress) {
  // Server-side audit/debug log with the concrete blocked address. This is the
  // only place the resolved internal IP appears; it never reaches the response.
  console.error('[mcp-proxy]', {
    event: 'mcp_proxy_ssrf_blocked',
    ts: new Date().toISOString(),
    blocked_address: blockedAddress,
  });
  throw new McpProxySsrfError(SSRF_BLOCKED_PUBLIC_MESSAGE);
}

async function resolveDnsJson(hostname, recordType, signal) {
  const url = new URL(DNS_JSON_ENDPOINT);
  url.searchParams.set('name', hostname);
  url.searchParams.set('type', recordType);
  const dnsTimeout = AbortSignal.timeout(DNS_RESOLUTION_TIMEOUT_MS);
  const response = await fetch(url.toString(), {
    headers: {
      Accept: 'application/dns-json',
      'User-Agent': 'WorldMonitor-MCP-Proxy/1.0',
    },
    signal: signal ? AbortSignal.any([signal, dnsTimeout]) : dnsTimeout,
  });
  if (!response.ok) {
    throw new Error(`DNS ${recordType} lookup failed: HTTP ${response.status}`);
  }
  const data = await response.json();
  if (data?.Status !== 0) {
    throw new Error(`DNS ${recordType} lookup failed: status ${data?.Status}`);

View on GitHub (pinned to e586b8b4b8)