Pod

Available as Markdown and JSON. Pod is also available over MCP.

Reported issues for faostat-mcp-server

Pod holds 14 of 14 GitHub reports that passed its relevance review. This can include external user reports, maintainer-confirmed bugs, and concrete feature gaps. Treat them as evidence to inspect, not a count of distinct defects.

Back to faostat-mcp-server.

Most discussed

bug(faostat-mirror): synchronous cube reads stall every request, /healthz included, for their full duration

Server version

0.2.2

mcp-ts-core version

0.11.0

Runtime

Bun

Runtime version

Bun 1.3.x

Transport

HTTP (Streamable HTTP)

Description

Every cube read in FaostatMirror (queryObservations, streamObservations, rankAreaTotals, sumByYear, domainDimensionCodes) is a synchronous bun:sqlite / better-sqlite3 call on the process's only JS thread. While one runs, /healthz and every other request wait for it. Ordinary tool calls still read 10⁴–10⁶ scattered…

Read the thread · 2026-06-29 · closed · 5 comments

bug(resolve_codes): under Node, a domain-scoped query match returns codes outside the domain

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Node.js

Runtime version

Node 26.5.0 (better-sqlite3, SQLite 3.53.4)

Transport

stdio

Description

DimensionsStore.resolve (src/services/faostat-mirror/dimensions-store.ts) scopes a query match to a domain with <fts> MATCH ? AND rowid IN (<domain codes>). When the domain has a single code for the dimension, SQLite rewrites the IN list to rowid = ?. FTS5 claims that constraint and applies it through…

Read the thread · 2026-09-30 · closed · 2 comments

bug(commodity_profile): an unselected QCL is reported as a retryable index_not_ready

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.2

Transport

stdio

Description

When QCL is not in FAOSTAT_DOMAINS, faostat_commodity_profile throws index_not_ready, the same reason it uses for a QCL mirror that hasn't finished its initial sync. That reason is declared retryable with the recovery "Wait for the initial sync to finish, or run the mirror init script, then retry shortly." A caller told to wait and retry…

Read the thread · 2026-09-30 · closed · 1 comment

bug(query_observations, commodity_profile): an unknown or expired canvas_id degrades to "staging failed" instead of canvas_not_found

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Node.js

Runtime version

Node 26.5.0

Transport

stdio

Description

When a caller passes canvas_id to faostat_query_observations or faostat_commodity_profile, stageObservations (src/services/canvas-staging.ts) acquires that canvas inside the same try whose catch turns any failure into a degraded, unstaged result. A well-formed id that is unknown or has expired makes the framework throw…

Read the thread · 2026-09-30 · closed · 1 comment

bug(faostat-mirror): multi-item observation reads walk the whole element slice instead of the item index

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.2 (SQLite 3.54.0)

Transport

stdio

Description

streamObservations and queryObservations (src/services/faostat-mirror/faostat-mirror.ts) end in ORDER BY year. With several item codes plus an element filter, SQLite satisfies that ordering from obs_<D>_element_code_year_idx, then walks every row of the element slice and tests item_code per row. On QCL element 5510 that…

Read the thread · 2026-09-30 · closed · 1 comment

bug(commodity_profile): staged query_params record yearStart/yearEnd instead of the input names

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

OS

macOS

Description

faostat_commodity_profile records the staged table's provenance under internal filter names: its query_params read { item_query, item_codes, yearStart, yearEnd } because the handler spreads its camelCase yearRange filter object into them. faostat_query_observations records the input names (year_start, year_end), and…

Read the thread · 2026-09-30 · closed · 1 comment

bug(commodity_profile): a failed canvas staging tells the caller to enable a canvas that is already on

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

OS

macOS

Description

Related: #1, #20

When the canvas is enabled but staging the merged set fails (stageObservations returns undefined, e.g. on a canvas capacity or DuckDB error), faostat_commodity_profile leaves canvas_id unset and format() falls through to its canvas-disabled branch (commodity-profile.tool.ts, the last else of the…

Read the thread · 2026-09-30 · closed · 1 comment

bug(canvas-staging): staged value column is typed from the preview rows, truncating later fractional values

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

OS

macOS

Description

Related: #15

stageObservations() (src/services/canvas-staging.ts) registers observation rows without a schema, so column types come from the framework sniffer over the preview window (the rows inlined before the spill, up to 100,000 characters). Only value depends on that window: all whole numbers types it BIGINT, all null…

Read the thread · 2026-09-30 · closed · 1 comment

Most recent

bug(faostat-mirror): a single-area observation page reads and sorts every row of the area

Server version

0.2.4

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.2 (SQLite 3.54.0)

Transport

stdio

Description

faostat_query_observations with a single area_codes entry and no item filter seeks obs_<D>_area_code_idx, then sorts every row of that area for ORDER BY year before the page returns. TCL area 231 has 101,823 rows scattered through a 4 GB file, so a 201-row page means 101,823 random table reads.

Steps to reproduce

Call…

Read the thread · 2026-09-30 · open · 0 comments

bug(faostat-mirror): bulk-host fetches map every non-2xx to ServiceUnavailable, so a manifest 4xx is retried as an outage

Server version

0.2.3

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

OS

macOS

Description

fetchManifest (src/services/faostat-mirror/manifest.ts:57) and the per-domain ZIP download (ingester.ts:216) throw serviceUnavailable(...) for any !response.ok, so every status reads as an outage. The manifest fetch runs inside withRetry (baseDelayMs: 1500, 3 retries), so a permanent 4xx is retried through the full…

Read the thread · 2026-09-19 · closed · 1 comment

bug(query_observations, commodity_profile): Markdown table rows interpolate values without escaping

Server version

0.2.3

mcp-ts-core version

0.13.6

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

OS

macOS

Description

Related: #26

Two format() functions build Markdown table rows by interpolating mirror values with no escaping: faostat_query_observations (query-observations.tool.ts:373: area, item, element, unit, flag) and the production-trend table of faostat_commodity_profile (commodity-profile.tool.ts:458: unit, flags). A | splits…

Read the thread · 2026-09-19 · closed · 1 comment

bug(faostat_dataframe_query): Markdown table cells escape pipes but not backslashes

Server version

0.2.3

mcp-ts-core version

0.12.3

Runtime

Bun

Transport

Any

Description

The faostat_dataframe_query table formatter (dataframe-query.tool.ts, string and serialized-object cells) escapes | as \| but leaves existing backslashes untouched. When the table renders, a backslash before ASCII punctuation is consumed as an escape, so the content[] text loses characters: x\|y renders as x|y and a\*b as a*b. structuredContent is unaffected.…

Read the thread · 2026-09-16 · closed · 1 comment

bug(query_observations): canvas_id description promises a fresh canvas per call, but omitting it reuses the session canvas

Server version

0.2.3

mcp-ts-core version

0.12.3

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

Description

faostat_query_observations's canvas_id field is described as: "Canvas ID from a prior call to stage onto. Omit to start a fresh canvas (a new id is returned)."

The second sentence is only true for the first spill of a session. After that, omitting canvas_id reuses the stored session canvas — every subsequent staged table lands on the same…

Read the thread · 2026-08-25 · closed · 1 comment

bug(faostat-mirror): ANALYZE runs on the serving thread — a cold domain's first data read stalls every request

Server version

0.2.3

mcp-ts-core version

0.12.3

Runtime

Bun

Runtime version

Bun 1.4.0

Transport

stdio

Description

ANALYZE still runs on the serving thread. #22 took it off the discovery path, but the first data read of a domain with no sqlite_stat1 (openAnalyzedDomain() → ensureQueryStatistics()) still blocks every request for the full pass, which on TCL takes minutes. runDomainSync() → refreshQueryStatistics() also runs it in-process when a…

Read the thread · 2026-08-25 · closed · 1 comment

The remaining reports are on the project's issue tracker.