Skip to main content
Glama
dynmie

foolfuuka-mcp-server

by dynmie

foolfuuka-mcp-server

MCP server for querying 4chan archives (Desuarchive, 4plebs, b4k, archived.moe) via the FoolFuuka API. Enables AI agents to search and retrieve historical archived posts through the Model Context Protocol.

Quick start

# Run directly (no install needed)
npx foolfuuka-mcp-server

# Or install globally
npm install -g foolfuuka-mcp-server
foolfuuka-mcp-server

Add to your MCP client config (Claude Desktop, VS Code, etc.):

{
  "mcpServers": {
    "foolfuuka": {
      "command": "npx",
      "args": ["foolfuuka-mcp-server"]
    }
  }
}

Related MCP server: Substreams Search MCP Server

Configuration

Environment variable

Default

Description

FOOLFUUKA_BASE_URL

https://desuarchive.org

Root URL of a FoolFuuka archive

FOOLFUUKA_USER_AGENT

foolfuuka-mcp-server/1.0

User-Agent header sent with API requests

FOOLFUUKA_BOARDS

none

Comma-separated board shortnames to display (e.g. "a,g,vr"). Overrides the default board list. When unset, desuarchive uses a curated subset matching its mirrors; other archives attempt the API then fall back to a full hardcoded list.

TIP

Desuarchive works out of the box. For Cloudflare-protected archives (4plebs, archived.moe), you may need to run the server on a machine with the archive whitelisted, or use a different base URL.

Tools

search_archive

Full-text search across archived posts with filters.

Parameters: text, boards, subject, username, tripcode, capcode, filename, image, uid, country, deleted, ghost, filter, type, start, end, results, order, page

Returns a markdown table with Board, Thread, Post, Date, Author, Excerpt columns. OP posts are marked with (OP). Use single-board or multi-board mode depending on the boards parameter.

get_thread

Retrieve all posts in a thread.

Parameters: board, num, latest_doc_id (incremental), last_limit (default 100, pass 0 for all)

Returns the OP post and all replies in formatted markdown with author, timestamp, subject, content, and media attachments.

get_post

Retrieve a single post.

Parameters: board, num (supports _ suffix for ghost posts, e.g. "676_1")

Returns post details including author, date, board, thread number, subject, content, media (filename, dimensions, size), and image link when present.

list_boards

List available boards for the configured archive.

Parameters: none

Returns a markdown table of board shortnames and names, plus site name and search-enabled board count. The board list comes from FOOLFUUKA_BOARDS if set, otherwise a desuarchive-curated subset or API response depending on the archive. Boards not in the list still work for search and post lookups.

Examples

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_archive",
     "arguments": { "boards": "a", "text": "kamiina botan", "page": 1 }
  }
}

Response (single-board):

## Search: "kamiina botan" on /a/

Found 25 of 330 matching posts (page 1 of 200, 25 per page)

| Board | Thread | Post | Date | Author | Excerpt |
|-------|--------|------|------|--------|---------|
| /a/ | #288811815 | #288821283 | 2026-06-20 | Anonymous | They say in /au/ that Japanese otakus don't like Kamiina Botan... |
| /a/ | #288749749 | #288763277 | 2026-06-17 | Anonymous | So uh... How about that erm, K-Kamiina Botan? |
| /a/ | #288735782 | #288744910 | 2026-06-16 | Anonymous | Kamiina Botan is the best romance anime of the decade. |
| /a/ | #288692733 | #288705032 | 2026-06-14 | Anonymous | Kamiina Botan the best yuri anime adaptation of all time... |
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_thread",
    "arguments": { "board": "a", "num": 288342508 }
  }
}

Response:

## Thread #288342508 on /a/

**OP** by Anonymous — 2026-05-26 14:38:49 UTC
**Subject:** Marriagetoxin
> Best girl is here.
> 
> Sorry Kinosaki.
šŸ“Ž [SubsPlease] MARRIAGETOXIN - 08 (720p) [50718D73].mkv-2026-05-26-10h38m13s978.jpg (1280Ɨ720, 234 KB)

---

**#288342579** by Anonymous — 2026-05-26 14:42:24 UTC
> why is Gero spending so much time with Mei on the weekend?
šŸ“Ž [SubsPlease] MARRIAGETOXIN - 08 (720p) [50718D73].mkv-2026-05-26-10h42m06s075.jpg (1280Ɨ720, 244 KB)

---

**#288344069** by Anonymous — 2026-05-26 16:06:53 UTC
> Genuinely best girl.

---

**#288345985** by Anonymous — 2026-05-26 17:40:31 UTC
> >>288342508
> In a series of Best Girls, Hamster Lady is absolutely Best Best Girl.
> 
> Her main 'attack' is putting on a Carnivale costume and dancing with hamsters!

How it works

The server runs over stdio transport — it reads JSON-RPC messages from stdin and writes responses to stdout. There is no HTTP server.

LLM  <--MCP stdio-->  foolfuuka-mcp-server  <--HTTP-->  FoolFuuka Archive

All responses are formatted as markdown rather than raw JSON, making them natural for LLMs to consume without extra parsing.

Rate limits

FoolFuuka archives enforce rate limits (e.g., ~5 requests/minute on 4plebs). The server respects Retry-After headers on 429 responses and surfaces the wait time to the caller.

Development

git clone https://github.com/dynmie/foolfuuka-mcp-server.git
cd foolfuuka-mcp-server
npm install
npm run build
npm test

Tests are written with Vitest and live in tests/.

License

MIT

Available Tools

4 tools
get_postA

Retrieve a single post from a 4chan archive by board and post number. Parameters: board (shortname), num (post number, can include _ suffix for ghost posts, e.g. "676_1"). Returns post details including author, date, board, thread number, subject, content, and media (filename, dimensions, size) with image link.

ParametersJSON Schema
NameRequiredDescriptionDefault
numYesPost number. Can include _ suffix for ghost posts, e.g. "676_1"
boardYesBoard shortname, e.g. "a"

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return fields (author, date, board, thread number, subject, content, media) and special num format for ghost posts. No annotations provided, so description carries full burden; it is adequate for a read retrieval tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states purpose, second enumerates return fields. No redundant information, front-loaded with key info.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes return format adequately given no output schema. Could mention error handling (e.g., post not found) but overall sufficient for a simple retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but description adds value by explaining board is shortname and num can include _ suffix for ghost posts. Provides context beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool retrieves a single post from a 4chan archive by board and post number. Distinguishes from siblings like get_thread (whole thread) and search_archive (search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains use of board (shortname) and num (with ghost post suffix) parameters, implying when to use this tool. Does not explicitly state when not to use or contrast with siblings, but sibling names provide enough context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_threadA

Retrieve all posts in a thread from a 4chan archive. Parameters: board (shortname), num (thread OP post number), latest_doc_id (incremental fetch, returns only newer posts), last_limit (max posts to return, default 100, pass 0 for all). Returns formatted thread with OP and replies including author, timestamp, subject, content, and media attachments.

ParametersJSON Schema
NameRequiredDescriptionDefault
numYesThread OP post number
boardYesBoard shortname, e.g. "a"
last_limitNoOnly return the last N posts. Default 100. Pass 0 for all.
latest_doc_idNoFor incremental fetch; returns only posts after this internal doc_id

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses key behaviors: returns OP and replies with fields, supports incremental fetch, and last_limit behavior. However, it omits potential traits like rate limits or authentication, which are not critical for this read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences effectively cover purpose, parameters, and return format with no redundancy or irrelevant details. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 params, no output schema), the description fully explains what the tool does, its parameters, and the return structure, making it self-sufficient for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, providing baseline clarity. The description adds extra context (e.g., 'incremental fetch, returns only newer posts') that goes beyond schema descriptions, enhancing understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states 'Retrieve all posts in a thread from a 4chan archive' with specific parameters and return format, clearly distinguishing it from sibling tools like search_archive, get_post, and list_boards.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains each parameter's purpose and usage (e.g., incremental fetch, last_limit default), but does not explicitly state when to use this tool versus alternatives. However, the purpose is clear enough for an agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_boardsA

List all available boards on the configured 4chan archive. No parameters required. Returns a markdown table with Board and Name columns, plus site name and search-enabled board count.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses behavior: no parameters, returns a markdown table with specific columns (Board, Name) plus site name and search-enabled board count. No mention of side effects, but none expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose: first sentence states action and resource, second sentence clarifies parameters and output format. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no parameters, the description is complete. Specifies output format (markdown table with columns), site name, and count. No output schema, so this description adequately covers what the agent needs to know.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. Description adds no parameter info because none are needed. Baseline for 0 parameters is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all available boards on the configured 4chan archive', specifying the verb (list), resource (boards), and context (4chan archive). It distinguishes from siblings like search_archive, get_thread, and get_post which have different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'No parameters required', indicating when to use (simple list without input). Does not explicitly mention when not to use, but sibling tools (search, get thread/post) provide natural alternatives for different needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_archiveA

Full-text search across archived 4chan posts. Parameters: text (comment search), boards (dot-delimited, e.g. "a" or "adv.trv"), subject, username, tripcode, capcode, filename, image (MD5 hash), uid, country, deleted, ghost, filter (image/text), type (sticky/op/posts), start/end (YYYY-MM-DD), results (thread to group), order (asc/desc), page. Returns a markdown table with Board, Thread, Post, Date, Author, Excerpt columns.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoEnd date in YYYY-MM-DD format
uidNo4chan Pass UID
pageNoPage number (1-indexed, 25 posts per page)
textNoComment text to search for
typeNosticky, op, or posts
ghostNoonly or none
imageNoBase64 MD5 hash of media
orderNoasc or descdesc
startNoStart date in YYYY-MM-DD format
boardsNoDot-delimited board shortnames, e.g. "a" or "adv.trv". Omit to search all boards
filterNoimage or text
capcodeNoOne of: user, mod, admin, dev, manager, founder
countryNo2-letter ISO 3166 country code
deletedNodeleted or not-deleted
resultsNothread to group by thread, otherwise flat
subjectNoOP subject line search
filenameNoOriginal filename search
tripcodeNoTripcode match
usernameNoPoster name match

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fails to disclose behavioral traits beyond listing parameters and output format. It does not mention any side effects, authentication needs, rate limits, or important constraints, leaving agents with minimal behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single paragraph that lists parameters in a run-on sentence; it is not overly long but lacks structured formatting. It is adequate but not highly concise or well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (19 parameters, no output schema), the description provides sufficient context by listing parameters, their meanings, and the return format (markdown table). It is reasonably complete for an agent to understand usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all 19 parameters, so baseline is 3. The description adds meaningful extra context such as dot-delimited boards, date format, page indexing, and output columns, which enhances understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Full-text search across archived 4chan posts' with a specific verb and resource, and the sibling tools get_thread, get_post, and list_boards are distinct, so agents can differentiate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for searching across posts, but does not explicitly state when to use this tool versus alternatives like get_thread or get_post, nor does it provide exclusions or prerequisites.

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.

  1. 4 tool updatesv0.1.3
    • First observedget_post
    • First observedget_thread
    • First observedlist_boards
    • First observedsearch_archive

TDQS

A4.1/5.0

Scored across 4 tools

Disambiguation5/5

Each tool serves a distinct purpose: global search, thread retrieval, single post retrieval, and board listing, with no functional overlap.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (search_archive, get_thread, get_post, list_boards), making them predictable.

Tool Count4/5

With only 4 tools, the set is minimal but well-scoped for a read-only archive viewer; slightly underpopulated but not insufficient.

Completeness4/5

Covers all basic read operations (search, thread, post, board list) for the domain; no obvious missing operations for the intended use case.

Related MCP Connectors

Related MCP Servers