koala73/worldmonitor · error · McpSourceUnavailableError

No digest input feeds are available

Error message

No digest input feeds are available

What it means

Thrown by requireAnyInput() inside the get_alert_digest MCP tool. This tool sweeps seven seeded domain caches (CII risk scores, military surges, cable health, infra outages, temporal anomalies, thermal escalation, shipping stress) and if ALL seven returned null the digest has no data to report, so it throws McpSourceUnavailableError. The weekly view also reads military:surges:history:v1 but that does not participate in the requireAnyInput gate. This is a total-source-outage signal, not a quiet day — a quiet day has data with no threshold trips.

Source

Thrown at api/mcp/registry/analysis-tools.ts:178

    items: { type: 'string' },
    description: 'Required cache keys that were missing or unreadable; their contribution is not treated as quiet.',
  },
  failed_inputs: {
    type: 'array',
    items: { type: 'string' },
    description: 'Subset of unavailable_inputs whose Redis read failed rather than returning a genuine miss.',
  },
} as const;

type AnalysisFreshness = Awaited<ReturnType<typeof readCachesWithFreshness>>['freshness'];

function requireAnyInput(
  payloads: unknown[],
  freshness: AnalysisFreshness,
  message: string,
): void {
  if (payloads.every((value) => value === null)) {
    throw new McpSourceUnavailableError(
      message,
      freshness.unavailable_inputs,
      freshness.failed_inputs,
    );
  }
}

function resolveLimit(raw: unknown, fallback: number): number {
  if (raw === undefined || raw === null) return fallback;
  const parsed = Math.round(Number(raw));
  if (!Number.isFinite(parsed)) return fallback;
  if (parsed <= 0) return Number.POSITIVE_INFINITY;
  return parsed;
}

export const ANALYSIS_TOOLS: ToolDef[] = [
  {
    name: 'get_signal_convergence',

View on GitHub (pinned to ffec79ac33)

Solutions

  1. Check GET /api/health and confirm the seven seed-meta keys are present and recent: seed-meta:intelligence:risk-scores, seed-meta:military-surges, seed-meta:cable-health, seed-meta:infra:outages, seed-meta:temporal:anomalies, seed-meta:thermal:escalation, seed-meta:supply_chain:shipping_stress.
  2. Retry after the seeder cadence elapses (most feeds seed on a 30-45 minute cycle); transient stampedes resolve on TTL refresh.
  3. If persistent, run the relevant seed scripts manually and verify they write seed-meta:* keys.
  4. Verify Redis connectivity and that the Upstash REST URL/token env vars are correct for the edge runtime.
Defensive patterns

Strategy: retry

Validate before calling

// Check all seven digest feed health before calling get_alert_digest
const health = await fetch('/api/health').then(r => r.json());
const feeds = ['intelligence:risk-scores','military-surges','cable-health','infra:outages','temporal:anomalies','thermal:escalation','supply_chain:shipping_stress'];
const seeded = feeds.filter(k => health.seedMeta?.[`seed-meta:${k}`]);
if (seeded.length === 0) {
  throw new Error('All alert-digest feeds unseeded; retry after seeder cycle');
}

Type guard

function isMcpSourceUnavailableError(e: unknown): e is { unavailableInputs: string[]; failedInputs: string[] } & Error {
  return e instanceof Error && (e as any).name === 'McpSourceUnavailableError';
}

Try / catch

try {
  const digest = await callMcpTool('get_alert_digest', {});
} catch (e) {
  if (isMcpSourceUnavailableError(e)) {
    // Total outage across 7 feeds — retry after seeder cadence
    await backoffRetry(60_000);
  } else throw e;
}

Prevention

When it happens

Trigger: Calling get_alert_digest (either view) when every one of the seven domain caches is null in Redis — a total seeder outage, a Redis flush, or a multi-region Redis failure. Distinguished from a legitimately quiet day because quiet days still have populated caches with zero trips; this error means the caches themselves are absent.

Common situations: Post-deploy cold start before any of the seven seeders has run; Redis data eviction (memory pressure evicting all volatile keys); a misconfigured REDIS_URL pointing at an empty instance; a cascading seeder failure where the seed pipeline is entirely stopped.

Related errors


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