The short answer.
If you call the API or the MCP server with offset, change it: pass the next_cursor of the previous reply as cursor. offset now answers 400 on the API and a tool error on MCP, and both say what to send. On the website, lists show Newer and Older, and page numbers are gone. A page costs the same at any depth: 0.1 to 0.7 ms on a copy of the data.
A crawler found the slow pages.
On 6 November our response-time alert fired at 3,108 ms. A crawler on Alibaba Cloud, with browser user agents and no regard for robots.txt, was walking the list of laws from page 1,035 to page 2,511. Each page took 2 to 9 seconds.
Why page 2,000 was slow.
An offset tells the database to produce every earlier row and throw it away. Page 2,000 of the laws list read 80,000 laws to show one page: 835 ms on our test machine. A first fix the same day picked the page's ids before reading the costly columns, which made deep pages about six times faster. The second removed offset.
How a cursor works.
A cursor holds the sort key of the last row you saw. The next page is the rows after that key, which an index answers directly. We added 13 indexes, one for each list order. The cursor is an opaque token: pass it back unchanged.
What changes for you.
API: /api/v1/laws/, /api/v1/gazette/ and /api/v1/search/ take cursor and return next_cursor while more follows. MCP 2.0.0: get_law_texts, get_links, list_legislation and list_gazette_issues do the same. To jump to a period, use since and until. Old numbered addresses such as ?page=7 redirect to the list's first page, and every document is still in a sitemap. A code's list of articles keeps its numbered pages, which are ranges of article positions.
Proof: no gaps, no repeats.
We walked whole lists by cursor on the real data and compared each walk with one unpaged query: all 103,102 laws in both orders (1,032 pages), 6,848 Gazette issues and 5,421 links between texts. No row was missing and none came twice.
Tools that say they only read.
The same day, MCP 1.2.0 marked all 10 tools as read-only. ChatGPT asks the user to confirm every call to a tool that is not marked that way. The registry entry also got an icon, so directories no longer show a blank square.