koala73/worldmonitor · error · McpSourceUnavailableError
No focal-point input feeds are available
Error message
No focal-point input feeds are available
What it means
McpSourceUnavailableError thrown by requireAnyInput (api/mcp/registry/analysis-tools.ts:173) for the focal-point analysis tool: every input cache payload was null after readCachesWithFreshness, so no focal-point feed is computable. Carries unavailable_inputs (genuine misses) and failed_inputs (Redis read failures) in the typed fields for dispatch to re-emit in JSON-RPC error.data.
Source
Thrown at api/mcp/registry/analysis-tools.ts:179
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;
}
// Keep the analysis schemas aligned with cacheEnvelope(). Content age is not a
// universal rule: evaluateFreshness() applies it only to checks that explicitly
// declare honorContentAge.View on GitHub (pinned to 9361220cc0)
Solutions
- Read error.data.failed_inputs — non-empty means fix Redis; empty means wait for/re-run the producer
- Verify the focal-point input keys appear fresh on /api/health
- Retry once the producer's publish cadence has elapsed
- Run the matching seed script if the keys have never been written in this environment
Defensive patterns
Strategy: retry
Validate before calling
const health = await fetch('https://<host>/api/health').then(r => r.json());
if (focalPointInputKeys.some(k => !health?.datasets?.[k]?.fresh)) {
defer('focal-point inputs not fresh yet');
} Type guard
function isSourceUnavailable(e) {
return e?.name === 'McpSourceUnavailableError'
|| (Array.isArray(e?.data?.unavailable_inputs));
} Try / catch
try {
await client.callTool(focalPointTool, args);
} catch (e) {
if (isSourceUnavailable(e)) {
return e.data?.failed_inputs?.length ? retryWithBackoff(call, 3) : retryAfter(producerCadence);
}
throw e;
} Prevention
- Distinguish failed_inputs (retry now) from unavailable_inputs (wait for producer) on every catch
- Track producer cadence so scheduled analyses run after publish cycles, not during gaps
- Alert on repeated unavailable_inputs — that is a producer/seed regression, not transient
When it happens
Trigger: Calling the focal-point analysis tool when all of its input cache keys return null: producer outage, TTL expiry between publish cycles, unseeded environment, or Redis read failures on every input at once.
Common situations: Fresh deploy before producers cycle. Upstash eviction or outage. Upstream data pipeline (geopolitical event writers) paused. Wrong Upstash database configured for the MCP edge.
Related errors
- No convergence input feeds are available
- No primary military feeds are available
- No event feeds are available for exposure enrichment
- No digest input feeds are available
- No hotspot-escalation input feeds are available
AI-assisted analysis of koala73/worldmonitor@9361220cc0 (2026-08-21).
Data as JSON: /api/errors/59f0c5f8f05e9339.
Report an issue: GitHub.