---
summary: "pubchem_search_compounds turns PubChem's rejected queries and unreadable identifiers into typed errors, keeps the rest of an identifier batch, and drops CID 0 matches; a cancelled tool call or resource read now stops its PubChem requests."
breaking: false
security: false
---

# 0.6.5 — 2026-09-24

## Added

- **Caller cancellation reaches PubChem** ([#54](https://github.com/cyanheads/pubchem-mcp-server/issues/54)) — all 10 tools and 6 resources pass `ctx.signal` to `PubChemClient`, which stops the request whether it is queued for a rate-limiter slot, in flight, reading its body, in a retry backoff, or between ListKey polls. The call fails as `RequestCancelled` (-32011), with no retry and no failed-request `warning`; a cancelled `pubchem_get_compound_interactions` call fails whole instead of listing its kinds as failed.

## Changed

- **An identifier batch where PubChem rejects every input fails as `identifier_rejected`** ([#55](https://github.com/cyanheads/pubchem-mcp-server/issues/55)) — a declared `ValidationError` (-32007) with a recovery hint, replacing the untyped -32602 "PubChem returned HTTP 400.".

## Fixed

- **`search_query_rejected` for queries PubChem cannot search on** ([#52](https://github.com/cyanheads/pubchem-mcp-server/issues/52)) — the HTTP 500 `PUGREST.ServerError: Search status indicates failure` on a formula, substructure, superstructure, or similarity search (malformed SMILES or formula, a `*` wildcard atom, a CID with no record) is no longer retried and returns a `ValidationError` whose hint names the query form to fix.
- **One unreadable identifier no longer fails a `pubchem_search_compounds` identifier batch** ([#55](https://github.com/cyanheads/pubchem-mcp-server/issues/55)) — an HTTP 400 on one input lists it in `unresolvedIdentifiers` with its own notice, and the rest of the batch resolves. A 5xx, rate limit, timeout, or cancellation on any input still fails the call.
- **CID 0 is never a match** ([#56](https://github.com/cyanheads/pubchem-mcp-server/issues/56)) — PubChem's `CID: [0]` answer for a SMILES not in its database is dropped from every CID list, so the input lands in `unresolvedIdentifiers` instead of `results`.
- **`publish-mcp` script** logs in to `mcp-publisher` with the GitHub PAT from the macOS Keychain before publishing.
