Skip to main content

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

4pda_mcp-0.2.0.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

4pda_mcp-0.2.0-py3-none-any.whl (9.3 kB view details)

Uploaded Python 3

File details

Details for the file 4pda_mcp-0.2.0.tar.gz.

File metadata

  • Download URL: 4pda_mcp-0.2.0.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for 4pda_mcp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9cf42569dd7af4f53296aecbd430a728e98b2e3e00f182fc8f429f97367eff2b
MD5 192e2132330947e7fc0ae127f9257387
BLAKE2b-256 9a0c0fb97d887fd13d2c4aa4e045fa0007b554b92cd686ad8b049f582b14cf5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for 4pda_mcp-0.2.0.tar.gz:

Publisher: publish.yml on mishannn/4pda-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file 4pda_mcp-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: 4pda_mcp-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 9.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for 4pda_mcp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c8c8a6c55b5ddfdbbd2e7d8c0d00b8b31b64f089aed6dd39da3d21d9619678e7
MD5 88763a38387a850e547273a9a23c9949
BLAKE2b-256 935518090c0322f275a7bb4e53f6b492e33ba0e2a2c4e55f7db31ce223f2e9c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for 4pda_mcp-0.2.0-py3-none-any.whl:

Publisher: publish.yml on mishannn/4pda-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.2.1

2 files

This release

0.2.0 This release

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page