4pda-mcp
Read-only, browser-free access to 4PDA's lofi (text) forum through three MCP tools.
List top-level categories —
list_forums()with noforum_idreturns the forum tree roots.Browse a forum —
list_forums(forum_id)returns that forum's subforums plus a topics summary as a flat list the client can nest.List topics in a forum —
list_topics(forum_id)gives topic id, title, reply count, andis_important(pinned) flag.Read topic posts —
list_posts(topic_id, page=1)returns author, date, and HTML body for up to 20 posts per 1-indexed page, with internal links rewritten to lofi equivalents and the repeated pinned header post dropped on page ≥ 2.Handle rate limits gracefully — on a 429, tools return a normal
rate_limitedpayload (retry_after_seconds,retry_at_utc,hint) instead of an error, so an agent can wait rather than retry blindly (cooldown capped at 1h; requests throttled byFOURPDA_MIN_INTERVAL).Run locally or over HTTP — stdio by default, or
--httpat127.0.0.1:8000/mcp(stateless JSON mode), optionally protected byFOURPDA_API_KEYbearer auth; no 4PDA login or browser needed.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@4pda-mcpWhat are the recent topics in the Android firmware section?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
Related MCP server: Reddit MCP Server
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 1lofiversion/index.php?t{topic_id}-{offset}.html— topic page N, step 20index.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 whenforum_idomitted, 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 (default)
4pda-mcp --http # streamable HTTP server at 127.0.0.1:8000/mcpHTTP mode options: --host (default 127.0.0.1), --port (default 8000).
The HTTP endpoint serves stateless JSON-mode MCP at /mcp (GET is not
supported — the server sends no notifications; DELETE/PUT return 405).
No browser, no auth needed (read-only public content). impit impersonates Chrome to clear Cloudflare.
Environment variables
Variable | Default | Meaning |
|
| Minimum seconds between upstream 4PDA requests (proactive throttle). |
| unset | When set, HTTP requests must carry |
FOURPDA_API_KEY applies only to --http mode (stdio has no headers and is
trusted). Without it the HTTP endpoint accepts unauthenticated requests.
Wrong or missing token → 401 with WWW-Authenticate: Bearer realm="4pda-mcp".
Client config example (streamable HTTP + bearer):
{
"mcpServers": {
"4pda": {
"type": "http",
"url": "http://localhost:8000/mcp",
"headers": { "Authorization": "Bearer <your-key>" }
}
}
}Docker
# build locally
docker build -t 4pda-mcp .
# run without auth on port 8000
docker run -p 8000:8000 4pda-mcp
# run with a bearer key
docker run -p 8000:8000 -e FOURPDA_API_KEY=your-secret 4pda-mcpPrebuilt multi-arch images (linux/amd64, linux/arm64) are published to GHCR:
ghcr.io/mishannn/4pda-mcp — tagged latest/1/1.2/1.2.3 on releases
and main on every push to main.
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, |
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.
Available Tools
3 toolslist_forumsA
List 4PDA forum categories/subforums. With no forum_id, returns the top-level categories (the forum tree roots). With a forum_id, returns that forum's subforums and a summary of its topics. IDs are 4PDA forum IDs.
On rate limit, returns a 'rate_limited' payload with retry_after_seconds and retry_at_utc instead of an error — wait that long before calling again.
| Name | Required | Description | Default |
|---|---|---|---|
| forum_id | No | Forum ID. Omit to list top-level categories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It goes beyond a simple 'list' by explaining the rate-limit behavior: a 'rate_limited' payload with retry_after_seconds and retry_at_utc is returned instead of an error, telling the agent exactly what to expect and how long to wait.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficient and front-loaded. The first paragraph states the core behavior, including the optional parameter's impact, and the second paragraph adds the rate-limit detail. No unnecessary words or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description explains what the function returns, how the parameter changes behavior, and how rate limiting is handled. It avoids describing response field names, which could be considered a minor gap without an output schema, but nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter is already documented in the input schema. However, the description adds meaning by clarifying that omitting forum_id returns top-level categories (the forum tree roots) and that IDs are 4PDA forum IDs. This is useful context beyond the schema's terse 'Forum ID. Omit to list top-level categories.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists 4PDA forum categories/subforums, a specific verb and resource, and explains the two modes (with and without forum_id). This separates it from the sibling tools list_topics and list_posts, which deal with topics and posts rather than forum structure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool returns in both modes but does not explicitly name alternatives or say when not to use it. The mention of 'a summary of its topics' implies list_topics might be used for full topic listings, but that guidance is left to inference rather than stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_postsA
List posts on a page of a 4PDA topic (lofi version), with author, date and HTML body. Internal links to the full version are rewritten to their lofi equivalent where one exists. The pinned header post repeats on every page on the site; it is dropped on page >= 2. Pages are 1-indexed; each page has 20 posts.
On rate limit, returns a 'rate_limited' payload with retry_after_seconds and retry_at_utc instead of an error — wait that long before calling again.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number (default 1). | |
| topic_id | Yes | 4PDA topic ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does well. It discloses rate-limit behavior with retry fields, internal link rewriting, and the pinned-header behavior across pages. These are meaningful behavioral traits beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: it front-loads the core purpose, then adds pagination details, and ends with a separate rate-limit notice. Every sentence contributes distinct information without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple paginated read tool, the description covers output content, pagination semantics, page size, and exceptional rate-limit response. No output schema exists, but the description sufficiently describes what the caller receives and how to handle retries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds extra interpretative value: pages are 1-indexed, each page has 20 posts, and rate-limit retry behaviors are tied to calling again. This goes beyond basic type hints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List posts on a page of a 4PDA topic (lofi version)', and it specifies the returned content: author, date, and HTML body. This makes it clearly distinct from the sibling tools list_forums and list_topics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context: pages are 1-indexed, each page has 20 posts, and the pinned header is dropped on later pages. It doesn't explicitly say 'use list_topics instead' or 'don't use for forums', but the scope is concrete enough that an agent can decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_topicsA
List topics in a 4PDA forum (lofi version): id, title, reply count, is_important (pinned/important topics are prefixed with (!) on the site).
On rate limit, returns a 'rate_limited' payload with retry_after_seconds and retry_at_utc instead of an error — wait that long before calling again.
| Name | Required | Description | Default |
|---|---|---|---|
| forum_id | Yes | 4PDA forum ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses meaningful behaviors: it is a 'lofi version' returning a specific lightweight set of fields, it uses a '(!)' prefix convention for important topics, and it returns a 'rate_limited' payload with retry_after_seconds and retry_at_utc instead of erroring on rate limits. It could mention pagination or ordering, but the provided detail is useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core listing action and output fields appear first, followed by the rate-limit exception. The phrase 'lofi version' is slightly ambiguous but does not distract from the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a simple one-parameter tool, the description covers the core semantic (list topics), the return fields, and the only exceptional behavior (rate limiting). It does not mention pagination or ordering, but nothing in the provided schema or complexity suggests those are required for correct basic invocations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter forum_id is 100% covered by its schema description ('4PDA forum ID.'). The description adds some context by specifying the tool lists topics within that forum, but that is already implied, so there is no significant extra semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('List'), resource ('topics in a 4PDA forum'), and the returned fields (id, title, reply count, is_important). It does not explicitly name siblings list_forums or list_posts, but the distinction is evident from the resource term itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the tool for listing topics for a given forum_id, and gives conditional guidance for rate-limit handling ('wait that long before calling again'). However, it does not explicitly state when to choose this over sister tools like list_forums or list_posts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
list_forums - First observed
list_posts - First observed
list_topics
TDQS
Scored across 3 tools
Each tool maps clearly to a different level of the forum hierarchy: forums, topics, and posts. There is minor overlap between list_forums with a forum_id and list_topics, since the former includes a topic summary, but the descriptions make the intended roles distinguishable.
All three tools follow the exact same list_<resource> pattern: list_forums, list_topics, list_posts. This is completely predictable and makes the toolset easy to navigate.
Three tools is an appropriate, lean size for a read-only forum browsing server. Each tool corresponds to a necessary step in the navigation flow: pick a forum, pick a topic, read posts.
The core forum traversal path is complete: forums lead to topics, and topics lead to posts. The main gap is the lack of a search tool or topic detail view, but these are reasonable omissions for a minimal browsing-focused server.
Maintenance
Related MCP Connectors
Remote MCP server for SeenThis AI Hub. Supports browsing, searching, and posting to AI boards.
Read-only MCP: search & read a Traditional Chinese (zh-TW) Taiwan community forum (PTT-style).
Reddit MCP — public Reddit data via JSON endpoints (no auth required)
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Related MCP Servers
- AlicenseAqualityDmaintenanceReddit MCP Server — No API Keys Required. Browse, post, comment, vote, and manage your Reddit account from any MCP client.204MIT
- AlicenseNot gradedqualityDmaintenanceProvides read-only access to Reddit through 8 tools for searching, browsing, and retrieving posts, comments, and user data, compatible with any MCP client.MIT
- AlicenseAqualityAmaintenanceProvides MCP-compatible AI clients with full access to a Flarum forum's API, enabling reading, searching, creating discussions, replying, moderation, and management of users, tags, and groups.152MIT
- FlicenseAqualityCmaintenanceMCP server for the SP-Tarkov Forge API. Exposes Forge endpoints as MCP tools over stdio, letting LLMs search mods, check updates, resolve dependencies, browse addons, and list SPT versions.13-