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
- 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.
- Retry after the seeder cadence elapses (most feeds seed on a 30-45 minute cycle); transient stampedes resolve on TTL refresh.
- If persistent, run the relevant seed scripts manually and verify they write seed-meta:* keys.
- 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
- Set up health-check alerts on GET /api/health for the seven digest seed-meta keys.
- Do not treat this error as a quiet day — quiet days return 200 with empty tripped arrays, not this throw.
- Cache the last successful digest response as a fallback during transient outages.
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
- No event feeds are available for exposure enrichment
- No hotspot-escalation input feeds are available
- The submarine-cable catalog is unavailable
- Feed digest unavailable for ${variant}/en
- cache_all_null
AI-assisted analysis of koala73/worldmonitor@ffec79ac33 (2026-08-12).
Data as JSON: /api/errors/e4df8b4aa190f224.
Report an issue: GitHub.