@pipeworx/illinois-code
Connect: https://pipeworx.io/mcp — every tool in the catalog, including @pipeworx/illinois-code’s. Install: one-click buttons
Connect to just the @pipeworx/illinois-code pack
https://gateway.pipeworx.io/illinois-code/mcp — only @pipeworx/illinois-code’s own tools, nothing else in the catalog.
No MCP client? Skip the connection: POST https://gateway.pipeworx.io/v1/tools/search_packs {"query":"..."} to find a tool below, GET /v1/tools/<name> for its schema, POST the same URL with arguments for the data — see For AI agents.
Tools: 2
Keyless. 720 ILCS 5/9-1 is first degree murder.
The encoding is derivable
720 ILCS 5/9-1 -> ?DocName=072000050K9-1
^^^^chapter ^^^^act 0 K+section
Chapter and act zero-padded to four. The site navigates by internal ChapterID and ActID, but none of that is needed — the citation carries everything.
Why the live path was rejected twice first
Earlier probes used the OLD path (fulltext.asp, now 404 after a site
restructure) and a needle that does not appear in the statute. Two independent
mistakes producing the same “no”, which read as “Illinois is unreachable”
rather than “you asked wrong”.
Coverage (fleet #2505)
The live site’s FullText endpoint is unreachable from a Cloudflare Worker for
a different, unfixable reason: ilga.gov serves an incomplete TLS certificate
chain (its own leaf certificate with no intermediate). curl on a machine
whose OS trust store already has the missing Sectigo intermediate succeeds;
fetch() — Cloudflare’s or plain Node’s, both strict — fails outright (HTTP
526 at the gateway; fetch failed from Node directly). No retry fixes a
certificate chain, which is why illinois-code read upstream_down every day
for 14 straight days before this shipped.
ILGA’s own “Access Denied” page for automated traffic to ilga.gov names the fix:
a public, nightly-synced file repository at ftp.ilga.gov explicitly meant for
bulk/automated consumption (“Automated systems should retrieve files from the
repository rather than scraping ILGA.gov”). scripts/ingest-il-statutes.mjs
walks it — outside Workers, where curl still works — and writes one JSON
bundle per CHAPTER (68 objects, not 72,000 — one per act or per section would
cost the same per-write and there is no reason to pay for it) into the shared
pipeworx-datasets R2 bucket at statutes/il/<chapter>.json.
il_compiled_statute tries the local bundle first. If the chapter/act has
been crawled and the section simply is not in it, that is authoritative — no
point retrying a live path that currently fails for every citation regardless
of validity — and the tool says section_not_found directly. If the
chapter/act has not been crawled at all, it falls back to the live fetch.
data_as_of on every response says whether it came from the pre-fetched text (the
crawl’s ingested_at) or a live fetch (now).
Topic search
il_statute_search answers questions no citation lookup can — “currency
exchange license fee”, “concealed carry reciprocity” — via FTS5 in the shared
SEARCH_SHARD Durable Object (workers/gateway/src/search-shard.ts, shard name
il-statutes; reused, not a new Cloudflare binding — the gateway sits at its
text-binding ceiling). The FTS body is the section’s heading + full text, not
just the heading: the DO’s contentless design exists to avoid duplicating
opinion text at case-law’s 46 GB scale, which does not apply at this corpus’s
size, and a topic query’s words are far more often in a section’s body than in
its short heading. Hit ids resolve back to citations via
statutes/il/_index.json. Search hits carry a citation and heading; call
il_compiled_statute with the chapter/act/section from a result for the full
text.
Miss behaviour
Live fallback: 200 with no Sec. heading — detected structurally, unchanged
from the original pack. Pre-fetched: the chapter/act bundle exists but the
section is not in its sections array.
Refresh
node scripts/ingest-il-statutes.mjs — re-run periodically (Illinois’s
legislative session runs annually; there is no daily-freshness need here). No
schedule is wired up: dispatch it by hand, or via gh workflow run if/when a
workflow is added — GitHub’s own schedule: trigger has been unreliable since
~2026-09-09 (see CLAUDE.md), so a recurring refresh should follow the
monitor-dispatch pattern rather than a bare cron trigger.
Data source
Illinois General Assembly (ftp.ilga.gov public file repository, and
ilga.gov for the live fallback). Illinois statutes are public record; no
reuse restriction was found on the bulk file repository.
Tools
- il_compiled_statute — Get the FULL TEXT of a section of the Illinois Compiled Statutes — Illinois state law — by citation. “720 ILCS 5/9-1” is first degree murder; “625 ILCS 5/11-501” is DUI. Pass the full citation as `cit
- il_statute_search — Search Illinois Compiled Statutes BY TOPIC or keyword rather than citation — “currency exchange license fee”, “concealed carry reciprocity”, “landlord retaliation”. Returns ranked sections with their
Tools
il_compiled_statute— Get the FULL TEXT of a section of the Illinois Compiled Statutes — Illinois state law — by citation. 720 ILCS 5/9-1 is first degree murder; 625 ILCS 5/11-501 is DUI. Pass the full citation as `citatioil_statute_search— Search Illinois Compiled Statutes BY TOPIC or keyword rather than citation — currency exchange license fee , concealed carry reciprocity , landlord retaliation . Returns ranked sections with their cit