Catalog PyPI
PACKAGE EXPLORERView in registry

4pda-mcp

PyPI

MCP server exposing the 4PDA forum lofi (text) version: forums tree, topics, posts.

Versions collected1
Direct dependencies2From release 0.2.1
Last observed20 Oct, 16:00 UTC

README

Version 0.2.1 documentation

4PDA MCP

MCP server exposing the 4PDA forum lofi (text) version without a browser. Uses impit to pass Cloudflare's TLS challenge.

Why lofi?

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.

URL conventions (discovered)

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 1
  • lofiversion/index.php?t{topic_id}-{offset}.html — topic page N, step 20
  • index.php?act=idx — full index, used only to enumerate top categories

The pinned header post repeats on every topic page; this server drops it on page ≥ 2.

Tools

  • 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.

Run

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.

Rate limiting

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 rateResult
1 req / 2sclean (10/10)
1 req / sclean (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.

Downloads & popularity

3downloads
1-day window · source-reported counts20 Oct 2026
13567.50
2026-08-24: 135 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-24–2026-08-242026-08-25: 92 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-25–2026-08-252026-08-26: 18 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-26–2026-08-262026-08-27: 12 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-27–2026-08-272026-08-28: 20 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-28–2026-08-282026-08-29: 10 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-29–2026-08-292026-08-30: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-30–2026-08-302026-08-31: 15 · observed 2026-10-21T09:11:25.7297408Z · period 2026-08-31–2026-08-312026-09-01: 13 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-01–2026-09-012026-09-04: 6 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-04–2026-09-042026-09-05: 5 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-05–2026-09-052026-09-07: 4 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-07–2026-09-072026-09-08: 7 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-08–2026-09-082026-09-09: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-09–2026-09-092026-09-10: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-10–2026-09-102026-09-11: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-11–2026-09-112026-09-12: 8 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-12–2026-09-122026-09-13: 5 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-13–2026-09-132026-09-14: 4 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-14–2026-09-142026-09-16: 7 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-16–2026-09-162026-09-17: 5 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-17–2026-09-172026-09-18: 9 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-18–2026-09-182026-09-19: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-19–2026-09-192026-09-20: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-20–2026-09-202026-09-21: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-21–2026-09-212026-09-22: 4 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-22–2026-09-222026-09-23: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-23–2026-09-232026-09-24: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-24–2026-09-242026-09-25: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-25–2026-09-252026-09-26: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-26–2026-09-262026-09-27: 6 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-27–2026-09-272026-09-28: 6 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-28–2026-09-282026-09-29: 8 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-29–2026-09-292026-09-30: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-09-30–2026-09-302026-10-01: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-01–2026-10-012026-10-02: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-02–2026-10-022026-10-04: 5 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-04–2026-10-042026-10-05: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-05–2026-10-052026-10-06: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-06–2026-10-062026-10-07: 6 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-07–2026-10-072026-10-08: 8 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-08–2026-10-082026-10-09: 4 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-09–2026-10-092026-10-10: 7 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-10–2026-10-102026-10-11: 7 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-11–2026-10-112026-10-12: 4 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-12–2026-10-122026-10-13: 6 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-13–2026-10-132026-10-15: 11 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-15–2026-10-152026-10-16: 2 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-16–2026-10-162026-10-17: 6 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-17–2026-10-172026-10-18: 1 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-18–2026-10-182026-10-19: 5 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-19–2026-10-192026-10-20: 3 · observed 2026-10-21T09:11:25.7297408Z · period 2026-10-20–2026-10-20
24 Aug20 Oct

pypistats · 52 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-2032026-10-21T09:11:25.7297408Z
2026-10-19 – 2026-10-1952026-10-21T09:11:25.7297408Z
2026-10-18 – 2026-10-1812026-10-21T09:11:25.7297408Z
2026-10-17 – 2026-10-1762026-10-21T09:11:25.7297408Z
2026-10-16 – 2026-10-1622026-10-21T09:11:25.7297408Z
2026-10-15 – 2026-10-15112026-10-21T09:11:25.7297408Z
2026-10-13 – 2026-10-1362026-10-21T09:11:25.7297408Z
2026-10-12 – 2026-10-1242026-10-21T09:11:25.7297408Z
2026-10-11 – 2026-10-1172026-10-21T09:11:25.7297408Z
2026-10-10 – 2026-10-1072026-10-21T09:11:25.7297408Z
2026-10-09 – 2026-10-0942026-10-21T09:11:25.7297408Z
2026-10-08 – 2026-10-0882026-10-21T09:11:25.7297408Z
2026-10-07 – 2026-10-0762026-10-21T09:11:25.7297408Z
2026-10-06 – 2026-10-0632026-10-21T09:11:25.7297408Z
2026-10-05 – 2026-10-0512026-10-21T09:11:25.7297408Z
2026-10-04 – 2026-10-0452026-10-21T09:11:25.7297408Z
2026-10-02 – 2026-10-0232026-10-21T09:11:25.7297408Z
2026-10-01 – 2026-10-0132026-10-21T09:11:25.7297408Z
2026-09-30 – 2026-09-3032026-10-21T09:11:25.7297408Z
2026-09-29 – 2026-09-2982026-10-21T09:11:25.7297408Z
2026-09-28 – 2026-09-2862026-10-21T09:11:25.7297408Z
2026-09-27 – 2026-09-2762026-10-21T09:11:25.7297408Z
2026-09-26 – 2026-09-2632026-10-21T09:11:25.7297408Z
2026-09-25 – 2026-09-2512026-10-21T09:11:25.7297408Z
2026-09-24 – 2026-09-2412026-10-21T09:11:25.7297408Z
2026-09-23 – 2026-09-2312026-10-21T09:11:25.7297408Z
2026-09-22 – 2026-09-2242026-10-21T09:11:25.7297408Z
2026-09-21 – 2026-09-2132026-10-21T09:11:25.7297408Z
2026-09-20 – 2026-09-2012026-10-21T09:11:25.7297408Z
2026-09-19 – 2026-09-1932026-10-21T09:11:25.7297408Z
2026-09-18 – 2026-09-1892026-10-21T09:11:25.7297408Z
2026-09-17 – 2026-09-1752026-10-21T09:11:25.7297408Z
2026-09-16 – 2026-09-1672026-10-21T09:11:25.7297408Z
2026-09-14 – 2026-09-1442026-10-21T09:11:25.7297408Z
2026-09-13 – 2026-09-1352026-10-21T09:11:25.7297408Z
2026-09-12 – 2026-09-1282026-10-21T09:11:25.7297408Z
2026-09-11 – 2026-09-1132026-10-21T09:11:25.7297408Z
2026-09-10 – 2026-09-1012026-10-21T09:11:25.7297408Z
2026-09-09 – 2026-09-0932026-10-21T09:11:25.7297408Z
2026-09-08 – 2026-09-0872026-10-21T09:11:25.7297408Z
2026-09-07 – 2026-09-0742026-10-21T09:11:25.7297408Z
2026-09-05 – 2026-09-0552026-10-21T09:11:25.7297408Z
2026-09-04 – 2026-09-0462026-10-21T09:11:25.7297408Z
2026-09-01 – 2026-09-01132026-10-21T09:11:25.7297408Z
2026-08-31 – 2026-08-31152026-10-21T09:11:25.7297408Z
2026-08-30 – 2026-08-3012026-10-21T09:11:25.7297408Z
2026-08-29 – 2026-08-29102026-10-21T09:11:25.7297408Z
2026-08-28 – 2026-08-28202026-10-21T09:11:25.7297408Z
2026-08-27 – 2026-08-27122026-10-21T09:11:25.7297408Z
2026-08-26 – 2026-08-26182026-10-21T09:11:25.7297408Z
2026-08-25 – 2026-08-25922026-10-21T09:11:25.7297408Z
2026-08-24 – 2026-08-241352026-10-21T09:11:25.7297408Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.2.125 Aug 20262

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 16:00 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:272714663409f0b61cb99a66254ba0280943140a862394c943ee6eca1a622d7a