# Reported issues for openaq-mcp-server

Pod holds 18 of 21 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 [openaq-mcp-server](/mcp/openaq-mcp-server).

## Most discussed

### bug(definitions): id inputs accept non-positive values — raw 422 on locationId, false no-coverage on parametersId

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

Six numeric id inputs are `z.number().int()` with no lower bound, and `tools/list` advertises `"minimum": -9007199254740991` on each: `locationId` and `parametersId` on `openaq_get_measurements` and `openaq_get_readings`, and `parametersId` on `openaq_find_locations` and `openaq_list_countries`.

A non-positive…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/33) · 2026-08-13 · closed · 3 comments

### feat(outputs): add station provider to get_readings, and provider plus timezone to get_measurements

### Use case

Before citing a reading, a practitioner needs to know who operated the monitor, and they need the station timezone to read hourly and daily periods. Today `openaq_get_readings` returns `timezone` but no provider, and `openaq_get_measurements` returns neither, so each call needs a follow-up `openaq://location/{id}` read. The README's data-use section says `openaq_get_readings` returns `provider`, which isn't true yet.

### Proposed behavior

Add the station's provider to `location`…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/30) · 2026-08-11 · closed · 3 comments

### bug(openaq_get_measurements): date-only ranges clip station-local daily buckets and drop the last hour; missing intervals go unreported

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

OpenAQ computes `daily` rollups over each station's local calendar day ([docs](https://docs.openaq.org/resources/measurements)). `openaq_get_measurements` expands a date-only range to UTC bounds instead (`T00:00:00Z` to `T23:59:59Z`), so any station off UTC gets a partial-day bucket at each edge. That bucket's…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/29) · 2026-08-11 · closed · 3 comments

### bug(openaq_dataframe_query): a capped result reports the cap as the full count and drops the truncation flag

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun 1.3.14

### Transport

stdio

### OS

macOS 26.1

### Description

`openaq_dataframe_query` bounds its result only at the canvas `defaultRowLimit` of 10,000 rows, and
tells the caller nothing when it hits that bound.

Three defects at one call site. The handler runs `instance.query(sql, { signal })` with no
`rowLimit` or `preview`, so 10,000 rows of an arbitrary projection can land in one response. The
DuckDB provider…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/25) · 2026-08-11 · closed · 3 comments

### bug(format): content and structuredContent expose different row sets

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun 1.3.14

### Transport

stdio

### OS

macOS 26.1

### Description

`openaq_get_measurements` and `openaq_dataframe_query` put more rows in `structuredContent` than in
`content[]`. #15 made the measurements text state the split honestly, but a text-only client and a
structured-content client still reason over different samples of the same call. The omitted rows are
response data, not display metadata.

Related: #15,…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/24) · 2026-08-11 · closed · 3 comments

### bug(docker): multiarch install crashes in emulated scanner

### Server version

0.4.0

### mcp-ts-core version

0.13.9

### Runtime

Bun

### Runtime version

1.4.2

### Transport

HTTP (Streamable HTTP)

### OS

Docker Buildx on an arm64 host, targeting Linux amd64 and arm64.

### Description

The Dockerfile runs the production dependency install on the target platform. For amd64 on an arm64 builder, [Bun](https://bun.sh)'s Socket scanner subprocess aborts under QEMU, preventing the multiarch image from building. Native compilation succeeds.

### Steps…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/47) · 2026-09-26 · closed · 2 comments

### bug(openaq_get_measurements): canvas inference truncates fractional measurements

### Server version

0.3.0

### mcp-ts-core version

0.13.9

### Runtime

Bun

### Runtime version

Bun 1.4.2

### Transport

stdio

### Description

`openaq_get_measurements` stages measurements without an explicit schema. Inference from the first 100 rows can truncate later fractions or return numbers as strings, changing SQL results.

### Steps to reproduce

1. Supply 101 OpenAQ-shaped hourly buckets through a stub service: the first 100 have `value` and summary statistics `0`, the last…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/45) · 2026-09-26 · closed · 2 comments

### bug(outputs): missing coordinates, country, and provider are rendered as 0,0, XX, and Unknown

### Server version

0.1.10

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

Two output shapers replace missing upstream location data with made-up values:

- `openaq_find_locations` (`shapeLocation`) turns a null latitude or longitude into `0`, a null `country` into `{ code: "XX", name: "Unknown" }`, and a null `provider` into `"Unknown"`.
- `openaq_get_readings` turns a null latitude or longitude into…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/40) · 2026-09-24 · closed · 1 comment

## Most recent

### bug(openaq_get_measurements): first matching sensor wins even when it is a dormant duplicate

### Server version

0.2.0

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

`openaq_get_measurements` resolves the station's sensor with the first entry whose parameter id matches (`location.sensors.find(...)` in `get-measurements.tool.ts`). Some stations carry more than one sensor for the same parameter, and the first can be dormant. The tool then pulls the dormant sensor's series and reports no data…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/43) · 2026-09-24 · open · 0 comments

### bug(openaq_find_locations): coordinate search pages in id order, so page 1 is not the nearest stations

### Server version

0.2.0

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

`openaq_find_locations` with `coordinates` returns OpenAQ's pages as they come and sorts each page by distance. OpenAQ's `/v3/locations` can only order by `id`, so page 1 is the lowest-id matching stations, not the nearest ones. The `page` description tells callers that "a near-me coordinates search should stay on page 1", which…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/42) · 2026-09-24 · open · 0 comments

### bug(openaq_find_locations): iso rejects the -99 code openaq_list_countries returns for Dhekelia

### Server version

0.1.10

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

`openaq_list_countries` relays every country OpenAQ lists, and its `code` field tells callers to pass it as `iso` to `openaq_find_locations`. OpenAQ lists Dhekelia (country id 7) with the placeholder code `-99`, which `find_locations` rejects because `iso` must be two characters. OpenAQ serves that code as a filter:…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/39) · 2026-09-24 · closed · 1 comment

### bug(openaq_get_measurements): a limit that does not divide 5000 overshoots the pull ceiling the cap notice states

### Server version

0.1.10

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

The pager checks `allRows.length < MAX_ROWS` before each fetch, then appends a whole page. So when `limit` does not divide 5,000, the pull ends above the ceiling. The staged canvas table and `pulledCount` report the true count, while the cap notice says `Pull capped at 5000 rows`, which contradicts them. The default `limit:…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/38) · 2026-09-22 · closed · 1 comment

### bug(openaq_get_measurements): re-staging the same sensor on a reused canvas silently replaces the earlier table

### Server version

0.1.9

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

The staged table is named `measurements_<sensorId>` with no aggregation or range component, and the handler drops that name before registering. Reusing a `canvas_id` for the same sensor at a different aggregation or window therefore replaces the earlier series, while README and `docs/design.md` describe reuse as additive…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/36) · 2026-09-22 · closed · 1 comment

### bug(openaq_get_measurements): a supplied canvas_id is ignored when the result does not spill

### Server version

0.1.9

### mcp-ts-core version

0.13.6

### Runtime

Bun

### Runtime version

Bun 1.4.0

### Transport

stdio

### OS

macOS 27.0

### Description

`openaq_get_measurements` accepts a `canvas_id` to stage a second series onto an existing canvas,
but only reads it when the pull is large enough to spill — `canvas.acquire` sits inside the overflow
branch. On a range that fits the inline preview, the id is discarded silently: the call succeeds
with no notice, no error, and no…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/35) · 2026-09-20 · closed · 1 comment

### bug(openaq_get_measurements): a staged canvas returns no runtime pointer to the dataframe tools

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

stdio

### Description

`openaq_get_measurements` is the only tool that mints a DataCanvas handle, and the response that
mints one names no tool that can read it. An agent holding an opaque `canvasId` has to already know
this server registers `openaq_dataframe_describe` and `openaq_dataframe_query`; one that doesn't
reports the truncation and stops, or re-calls with a…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/32) · 2026-08-13 · closed · 1 comment

### feat(openaq_find_locations): expose monitor, mobile, and provider filters

### Use case

An air-quality practitioner often needs one station class rather than every sensor in an area: reference monitors for regulatory comparison, fixed stations for a stable series, or one provider's network for consistent methods. `openaq_find_locations` returns `isMonitor`, `isMobile`, and `provider` but cannot filter on them, and filtering a 100-row page client-side misses matches on later pages.

### Proposed behavior

Add three optional filters to `openaq_find_locations`,…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/31) · 2026-08-11 · closed · 1 comment

### bug(openaq_list_countries): no limit or page — unfiltered and common-pollutant calls return the whole catalog

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`openaq_list_countries` takes no `limit` or `page`. A call without filters returns the whole [OpenAQ](https://openaq.org/) country catalog on both MCP surfaces, with each country's nested parameter list. `parametersId` doesn't bound it for common pollutants: `parametersId: 2` (PM2.5) matches 156 of 158…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/28) · 2026-08-11 · closed · 1 comment

### bug(openaq_find_locations): meta.found is a per-page count, so exhausted pages report no coverage and later pages misreport totals

### Server version

0.1.7

### mcp-ts-core version

0.11.0

### Runtime

Bun

### Runtime version

Bun 1.3.14

### Transport

HTTP (Streamable HTTP)

### OS

macOS 26.1

### Description

`openaq_find_locations` reads OpenAQ's `meta.found` as a total, but on `/v3/locations` it counts only the page just returned: the row count on a partial page, and `">limit"` on any full page, even when nothing follows. So a page past the end throws `no_locations_found` with coverage recovery, a full last page…

[Read the thread](https://github.com/cyanheads/openaq-mcp-server/issues/27) · 2026-08-11 · closed · 1 comment

The remaining reports are on [the project's issue tracker](https://github.com/cyanheads/openaq-mcp-server/issues).
