Skip to content

Releases: cyanheads/openstates-mcp-server

v0.3.0: search_bills scope rejection converges onto schema refinement, and drops its typed error

Choose a tag to compare

@cyanheads cyanheads released this 31 Jul 13:12
v0.3.0
eeb7414

search_bills scope rejection converges onto schema refinement, and drops its typed error

  • openstates_search_bills no longer returns a typed missing_scope error for an omitted jurisdiction/q — it fails input validation instead, same as openstates_search_people (#45)
  • empty-string jurisdiction/q now rejects identically on both tools instead of splitting between a schema error and a typed error (#47)
  • openstates_search_people's either/or rejection message now states the recovery guidance directly

CHANGELOG v0.3.0

v0.2.2: search_people id lookup, empty-string field docs

Choose a tag to compare

@cyanheads cyanheads released this 31 Jul 12:02
v0.2.2
5ad9359

search_people id lookup, empty-string field docs

  • openstates_search_people gains an id input (OCD person IDs) to fetch specific people directly — jurisdiction or id is now required (#42)
  • Every output field Open States can send as "" now documents that in its .describe(), across bill, session, person, committee, and event tools (#44)
  • get-bill/get-committee/search-bills/search-committees person ID fields point to the new id lookup

CHANGELOG v0.2.2

v0.2.1: empty-string rendering fixes, party-filter doc correction

Choose a tag to compare

@cyanheads cyanheads released this 31 Jul 11:04
v0.2.1
dbfc4f5

empty-string rendering fixes, party-filter doc correction

  • bill abstracts, versions, documents, vote headings, and action lines no longer render an empty upstream note, date, or start_date as orphaned punctuation (#38, #41, #43)
  • legislative session lines no longer render an empty classification as a bare (), or a missing date endpoint as a dangling separator — renders from /until instead (#43)
  • search_people description, README, and design docs no longer advertise a party filter that doesn't exist upstream; party is still reported on every result (#39)
  • test files mocking openstates-service.ts now spread the real module instead of replacing it, so a future export no longer breaks unrelated tests (#40)

CHANGELOG v0.2.1

v0.2.0: required jurisdiction schema, bill/federal disclosure fixes

Choose a tag to compare

@cyanheads cyanheads released this 31 Jul 09:21
v0.2.0
665cab1

required jurisdiction schema, bill/federal disclosure fixes

  • jurisdiction is now a required input schema field (not just handler-enforced) on openstates_search_people, openstates_search_committees, and openstates_search_events — a breaking change. A call omitting jurisdiction now fails schema validation instead of receiving a typed jurisdiction_required error; that error contract is removed as unreachable. (#35)
  • openstates_get_legislators_by_location discloses the federal delegation (jurisdiction.classification, stateCount/federalCount) it already returned alongside state legislators, and adds given_name/family_name to match openstates_search_people (#36)
  • openstates_search_bills names every filter behind a zero-result answer, including an unrecognized jurisdiction (#32)
  • openstates_get_bill and openstates_search_bills no longer fail output validation on include=other_identifiers — Open States omits scheme on bill records (#31)

CHANGELOG v0.2.0

v0.1.17: Upstream error detail, retry budget cap, empty-note rendering

Choose a tag to compare

@cyanheads cyanheads released this 31 Jul 08:14
v0.1.17
984e069

Upstream error detail, retry budget cap, empty-note rendering

  • Upstream 4xx detail now surfaces in error messages, with an invalid_page contract on the five paginated search/list tools (#33)
  • OPENSTATES_TOTAL_REQUEST_BUDGET_MS caps total retry wall-clock time, replacing an unbounded ~190s worst case (#34)
  • Link/media/document lists no longer render a stray : when the upstream note is empty (#37)
  • deps: @cyanheads/mcp-ts-core ^0.10.17 → ^0.11.0 (+ typescript, biome, @types/node)

CHANGELOG v0.1.17

v0.1.16: CLAUDE.md template reconcile

Choose a tag to compare

@cyanheads cyanheads released this 26 Jul 11:22
v0.1.16
1dc0257

CLAUDE.md template reconcile

  • CLAUDE.md: reconciled with the framework template — adds What's Next? and Server identity and instructions sections, replaces stale ctx.sample with ctx.enrich/ctx.content, documents ctx.state.getMany, z.stringbool(), and the retryable/ctx.recoveryFor() error flow (#30)

CHANGELOG v0.1.16

v0.1.15: fail-fast upstream timeouts, configurable budget, enrichment fields

Choose a tag to compare

@cyanheads cyanheads released this 26 Jul 11:06
v0.1.15
e70953e

fail-fast upstream timeouts, configurable budget, enrichment fields

  • Upstream timeout no longer amplifies into a ~4x wait — a caller-owned deadline fails fast and marks the error non-retryable (#25)
  • OPENSTATES_DAILY_REQUEST_BUDGET and OPENSTATES_REQUEST_TIMEOUT_MS make the request budget and per-attempt deadline configurable (#28, #29)
  • search_people/search_committees reject an omitted jurisdiction before issuing a request that would time out (#26)
  • search_bills, get_bill, search_people, get_legislators_by_location surface sponsor person links, URLs, timestamps, headshots, and OCD division IDs (#27)
  • deps: @cyanheads/mcp-ts-core ^0.10.14 → ^0.10.17, @biomejs/biome 2.5.2 → 2.5.4; bundle strip now also drops platform-specific native bindings

CHANGELOG v0.1.15

v0.1.14: OpenStates request caching and rate-budget guard

Choose a tag to compare

@cyanheads cyanheads released this 17 Jul 00:44
v0.1.14
94a42a8

OpenStates request caching and rate-budget guard

Caches successful fetchJson responses and enforces a daily request budget against the shared free-tier key rate limit; corrects a stale field-name reference in committee-search docs.

Added:

  • Response cache — SHA-256 URL-keyed, per-endpoint TTLs (10 min search, 12 h jurisdiction, 24 h geo) (#23)
  • Daily request-budget guard — fail-fast RateLimiter at the free-tier cap (250 / rolling 24 h) (#23)

Changed:

  • 429 and HTML block-page responses now fail fast (retryable: false) instead of retrying 4x (#23)

Fixed:

  • openstates_search_committees description and README named the stale coverage_note field instead of coverageNote (#24)

272 tests pass; bun run devcheck clean.

CHANGELOG v0.1.14

v0.1.13: include enrichment parity, optional event role, territory correction

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 19:43
v0.1.13
d8d7a4b

include enrichment parity, optional event role, territory correction

Every include-capable tool now surfaces the upstream fields it advertised accepting; event participants without a role no longer fail output validation.

Changed:

  • Coverage copy corrected from "...DC, and Puerto Rico" to "...DC, and 5 US territories" across all identity/config surfaces.

Fixed:

  • All ten tools add the output fields and format() rendering for every previously-dropped include value — other_titles, other_identifiers, sources, versions, documents, votes, related_bills, other_names, links, organizations, latest_runs. (#18)
  • openstates_search_events, openstates_get_event: participant role is now optional, matching upstream sparsity — no more isError on a valid result missing role. (#19)

Dependency bumps:

  • tsc-alias ^1.9.0 → 1.9.1

266 tests pass; bun run devcheck clean.

CHANGELOG v0.1.13

v0.1.12: jurisdiction normalization, inventory merge, resource errors

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 10:24
v0.1.12
3b90c91

jurisdiction normalization, inventory merge, resource errors

Fixes three issues in the jurisdiction subsystem: committee search, jurisdiction listing, and the jurisdiction resource's error handling.

Fixed:

  • openstates_search_committees no longer 500s when a full jurisdiction name is combined with chamber — resolved via a static name-to-abbreviation map. (#17)
  • openstates_list_jurisdictions returns the complete 56-jurisdiction inventory in one call — the default request now merges the upstream pages internally. (#20)
  • The openstates://jurisdiction/{jurisdiction_id} resource adopts a typed not-found error contract instead of leaking the raw upstream 404. (#21)

239 tests pass; bun run devcheck clean.

CHANGELOG v0.1.12