Observed since 20 Oct, 16:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
MCP server exposing the 4PDA forum lofi (text) version: forums tree, topics, posts.
MCP server exposing the 4PDA forum lofi (text) version without a
browser. Uses impit to pass Cloudflare's TLS
challenge.
The lofi/text version is ~50x smaller than the full page and has stable, simple
markup — ideal for LLM consumption. The full version (?act=idx, ?showforum=,
?showtopic=) is JS-heavy and Cloudflare-gated.
4PDA changed the lofi entry. lofiversion/index.php?index.html now 404s. The
live format is:
lofiversion/index.php?f{forum_id}.html — a forum page (subforums + topics list)lofiversion/index.php?t{topic_id}.html — topic page 1lofiversion/index.php?t{topic_id}-{offset}.html — topic page N, step 20index.php?act=idx — full index, used only to enumerate top categoriesThe pinned header post repeats on every topic page; this server drops it on page ≥ 2.
list_forums(forum_id?) — top categories when forum_id omitted, else the subforums
(and topics summary) of a forum as a flat list. Returns a tree the client can nest.list_topics(forum_id) — topics in a forum: id, title, replies, is_important.list_posts(topic_id, page=1) — posts on a page: author, date, html (with internal
links rewritten to lofi where possible). Header post dropped on page ≥ 2.pip install -e .
4pda-mcp # stdio MCP server
# or: mcp run src/fourpda_mcp/server.py
No browser, no auth needed (read-only public content). impit impersonates Chrome to clear Cloudflare.
4PDA fronts the lofi endpoint with Cloudflare; it is uncached, so every request hits origin and Cloudflare rate-limits it. The limit is not published; measured empirically (Aug 2026):
| Request rate | Result |
|---|---|
| 1 req / 2s | clean (10/10) |
| 1 req / s | clean (20/20) |
| 2 req / s (0.5s gap) | clean (30/30) |
| 5 req / s (0.2s gap) | 429 on ~20th request, Retry-After: 3600 (1h block) |
The server stays well below the trip point by enforcing a minimum interval
between requests (FOURPDA_MIN_INTERVAL, default 1.0 — i.e. 1 req/s, a 2x
margin under the confirmed-safe 2 req/s). If a 429 still occurs, the server
records the Retry-After cooldown and, without sending further requests,
returns a structured rate_limited payload from every tool call:
{"rate_limited": true, "retry_after_seconds": 3600,
"retry_at_utc": "2026-08-24T23:00:00Z",
"hint": "4PDA is rate-limiting requests. Retry after 3600s."}
This is returned as a normal (non-error) result, so the agent can read
retry_after_seconds and wait rather than hammering a blocked endpoint. The
cooldown is capped at one hour so an anomalous Retry-After can't freeze the
process.
pypistats · 52 observations shown. Missing days are unknown. Source category: overall: without mirrors.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-20 – 2026-10-20 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-19 – 2026-10-19 | 5 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-18 – 2026-10-18 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-17 – 2026-10-17 | 6 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-16 – 2026-10-16 | 2 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-15 – 2026-10-15 | 11 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-13 – 2026-10-13 | 6 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-12 – 2026-10-12 | 4 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-11 – 2026-10-11 | 7 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-10 – 2026-10-10 | 7 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-09 – 2026-10-09 | 4 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-08 – 2026-10-08 | 8 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-07 – 2026-10-07 | 6 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-06 – 2026-10-06 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-05 – 2026-10-05 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-04 – 2026-10-04 | 5 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-02 – 2026-10-02 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-10-01 – 2026-10-01 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-30 – 2026-09-30 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-29 – 2026-09-29 | 8 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-28 – 2026-09-28 | 6 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-27 – 2026-09-27 | 6 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-26 – 2026-09-26 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-25 – 2026-09-25 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-24 – 2026-09-24 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-23 – 2026-09-23 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-22 – 2026-09-22 | 4 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-21 – 2026-09-21 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-20 – 2026-09-20 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-19 – 2026-09-19 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-18 – 2026-09-18 | 9 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-17 – 2026-09-17 | 5 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-16 – 2026-09-16 | 7 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-14 – 2026-09-14 | 4 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-13 – 2026-09-13 | 5 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-12 – 2026-09-12 | 8 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-11 – 2026-09-11 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-09 – 2026-09-09 | 3 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-08 – 2026-09-08 | 7 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-07 – 2026-09-07 | 4 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-05 – 2026-09-05 | 5 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-04 – 2026-09-04 | 6 | 2026-10-21T09:11:25.7297408Z |
| 2026-09-01 – 2026-09-01 | 13 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-31 – 2026-08-31 | 15 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-30 – 2026-08-30 | 1 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-29 – 2026-08-29 | 10 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-28 – 2026-08-28 | 20 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-27 – 2026-08-27 | 12 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-26 – 2026-08-26 | 18 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-25 – 2026-08-25 | 92 | 2026-10-21T09:11:25.7297408Z |
| 2026-08-24 – 2026-08-24 | 135 | 2026-10-21T09:11:25.7297408Z |
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.2.1 | 25 Aug 2026 | 2 |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 16:00 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:272714663409f0b61cb99a66254ba0280943140a862394c943ee6eca1a622d7a