uc-mcp
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., "@uc-mcpsearch UnknownCheats for recent entity list offsets and list dates"
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.
uc-mcp
Search UnknownCheats from Claude Code, with a date on every result.
A read-only MCP server that gives Claude (or any MCP client) search and thread reading on the UnknownCheats forum through your own logged-in session. It marks every result with its age, because on this forum an old answer is usually a wrong one.
Install · Cookies · Usage · Account safety · Troubleshooting
UC search: "entity list" · threads · sorted newest · 23 total · page 1/2 · 3 threads
now=2026-09-30 12:00Z · all dates UTC · (age) after each date
1. 2026-09-28 (2d) [Coding] Entity list walker for the current build
example-game/2000101-entity-list-walker.html · by carol_sdk · 41 replies, 6.2k views · 3pg
2. 2025-11-02 (10mo) [Question] Entity list pointer changed after update
example-game/2000102-entity-list-pointer-changed.html · by erin · 12 replies, 1.9k views
3. 2019-03-14 (7.5y) [Release] Entity list dumper <- ANCIENT
example-game/2000103-entity-list-dumper.html · by frank · 88 replies, 31k views · 5pgWhy
Public docs on game hacking, anti-cheat and reverse engineering are thin, stale or wrong. The current answers are on UnknownCheats, and a model can't read it without an account. This server lets it read the forum with yours, and puts dates first:
Every row carries a date and an age. Dates are converted to UTC from the forum's own timezone.
Stale content is labelled
<- OLD/<- ANCIENT, with a warning line the model can't skim past. Offsets and signatures die on a game patch; a bypass dies when the anti-cheat ships a detection.Long threads point to their last page. Page 1 of a ten-year thread is usually worthless.
Code blocks survive intact (on this forum the code is the answer), and quote chains collapse to one line.
Output is compact text, not JSON, so results cost fewer tokens.
Related MCP server: log-query-mcp
Install
You need Python 3.10+, an UnknownCheats account, and Claude Code (or another MCP client).
1. Clone and install
git clone https://github.com/0111-0222/uc-mcp.git
cd uc-mcpWindows (PowerShell):
.\install.ps1macOS / Linux:
./install.shThe script creates .venv, installs the dependencies, creates cookies.json
from the example, and prints the exact command to register the server.
uv sync
cp cookies.example.json cookies.json
claude mcp add --scope user unknowncheats -- uv run --directory "$PWD" server.py2. Export your cookies
Log into unknowncheats.me in your normal browser.
Install a cookie exporter such as Cookie-Editor, open it on the UC tab and choose Export → Header String.
Paste that string into the
cookiefield ofcookies.json.Copy your browser's User-Agent (search "what is my user agent") into
user_agent.
{
"cookie": "bbsessionhash=…; bbuserid=…; cf_clearance=…; bblastvisit=…",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 …"
}Cookie | Needed | Why |
| yes | The site is behind Cloudflare. It is tied to the IP and User-Agent it was issued to, which is why step 4 matters. |
| yes | Search and most boards require a login. |
| no, delete it | vBulletin's persistent auto-login token. It gives long-lived access to your account, and you don't want that sitting in a file. |
cookies.json is gitignored. To keep it somewhere else, set UC_MCP_COOKIES
to its path.
3. Register with Claude Code
Use the command the install script printed (absolute paths). It looks like:
claude mcp add --scope user unknowncheats -- "/path/to/uc-mcp/.venv/bin/python" "/path/to/uc-mcp/server.py"On Windows the interpreter is .venv\Scripts\python.exe. --scope user makes
the server available in every project. Remove it with
claude mcp remove unknowncheats.
Add this to the client's MCP config (claude_desktop_config.json,
.cursor/mcp.json, …):
{
"mcpServers": {
"unknowncheats": {
"command": "C:\\path\\to\\uc-mcp\\.venv\\Scripts\\python.exe",
"args": ["C:\\path\\to\\uc-mcp\\server.py"]
}
}
}4. Check it
Start Claude Code and ask:
call uc_session with reload=True
You should see session : logged in, Cloudflare passed.
Usage
Just ask. The tool descriptions already tell the model to reach for UC on game-hacking, anti-cheat and RE questions:
What's the current way people are getting the entity list in Rust? Only trust stuff from the last 6 months.
Find the canonical thread on manual mapping and summarize the newest page.
List the Valorant subforum and tell me what's active this week.
Tools
Tool | What it does |
| Keyword search. |
| Read a thread's posts. |
| No slug: every subforum and its slug. With a slug: that board's threads. |
| Fallback: any forum page as cleaned text. |
| Session health, request budget, cache. |
Searching well
vBulletin ORs loose terms and stops counting at 500, so extra words widen the search instead of narrowing it. A long natural-language query just returns the forum's newest posts. Measured on one query:
Query | Result |
| 500 (cap). Top hits were about YOLO mouse input and Arduino colorbots |
| 105 threads, every title on topic |
...plus | 23 |
...plus | 2 |
So: one "quoted phrase", mode="threads" with title_only=True first,
forum= to scope it, and post mode only if that finds nothing. A header
reading 500+ (result cap) means the ranking is meaningless, and the tool
says so.
Making it the first stop
To make "check UC first" a hard rule in a project, add this to its
CLAUDE.md:
## Game hacking / anti-cheat / RE questions
Before answering from memory or searching the web, call `uc_search` first.
Public documentation on these topics is thin, stale, or wrong. Check the dates
on what comes back: anything older than a year is reference-only — the method
may hold, the offsets and signatures will not.Account safety
This server uses your logged-in session, so it's built to behave like a careful human reader and to never put the login at risk.
What it will never do
Write anything. No tool can post, reply, rate, report, subscribe or PM. Account and posting endpoints (
login.php,private.php,newreply.php,profile.php,usercp.php,attachment.php, anything carrying asecuritytokenorlogouthash, …) are refused before a request is made.Send your cookies anywhere but unknowncheats.me. Forum posts are attacker-controlled text, and a post can try to talk the model into fetching a link. Every URL is parsed, not string-matched, so look-alikes such as
https://evil.com?.unknowncheats.me/are rejected. The cookies are also pinned to the.unknowncheats.medomain inside curl itself, so even a redirect can't carry them off-site. Both guarantees are covered by tests.Follow instructions from posts. Every result is marked as untrusted third-party data.
How it keeps traffic human-shaped
Control | Value | Why |
Between searches | 17s + up to 2s jitter | The forum enforces 15s between searches and rejects anything faster. |
Between page reads | 4s + jitter | Reads are cheap; paying the search price would make threads unusable. |
Hourly cap | 150 requests | Keeps sustained use from looking like a scraper. |
Daily cap | 1000 requests | Same. |
Jitter | 0–2s random | Exactly periodic requests are a bot signature. |
TLS | Chrome impersonation | Handshake matches a real browser, with your real User-Agent. |
The limits are process-wide, and the last send time is kept on disk, so a new
Claude Code session can't fire straight into the forum's throttle. Pages are
cached in .cache/uc.sqlite3 (threads and searches 15 min, forum listings 10,
the board index 6 hours), and paging a search re-uses its server-side
searchid, so going back to a result costs one cheap read, not a new search.
What's on you
Never share
cookies.json, and never paste it, aCookie:header or a HAR file into an issue, a chat or Discord. Anyone holding it is you on the forum. Everyone who uses this runs it with their own account.Leave
bbpasswordout of the export (see cookies).uc_sessiontells you if it's there.Know the risk. Automated access to a logged-in account always carries some ban risk, and the forum's rules are the forum's call. The limits above are mitigation, not a guarantee. Use it the way you'd read the forum yourself.
Troubleshooting
Symptom | Fix |
|
|
|
|
| The hourly or daily cap was hit. Wait; the message says which. |
| Another search (maybe from your browser) went out less than 15s ago. Retry shortly. |
| Use the URL segment, not the display name. |
| The query saturated. See Searching well. |
Server not showing up in Claude Code | Register with absolute paths, and check with |
How it works
flowchart LR
C[Claude / MCP client] -- stdio --> S[server.py<br/>5 tools]
S --> P[uc_parse<br/>HTML → records]
S --> R[uc_render<br/>records → dated text]
S --> H[uc_http]
H --> G{URL guard<br/>host + endpoint}
G --> L[rate limiter<br/>+ budget]
L --> K[(sqlite cache)]
L --> U[curl_cffi<br/>Chrome TLS] --> F[unknowncheats.me]Three things are load-bearing, each verified against the live site:
curl_cffiwith Chrome impersonation, nothttpxorrequests. The Cloudflare WAF fingerprints the TLS handshake. A plain Python client gets a hard 403 no matter how correct the cookies are.Search is a POST with a
securitytoken. A GET againstsearch.php?do=processdoesn't run a search on this vBulletin. The token is scraped, cached, and refreshed automatically if rejected.Selectors are confirmed against real authenticated HTML. UC runs a vBulletin 3-era template set:
td[id=f<id>]for boards,td[id=td_threadtitle_<tid>]for thread rows,table[id=post<pid>]+div[id=post_message_<pid>]for posts.
File | Role |
The five MCP tools and their argument handling | |
URL guard, cookie jar, rate limiter, budget, sqlite cache | |
vBulletin HTML → threads, posts, search hits | |
Records → compact, dated, staleness-labelled text | |
Forum date formats → UTC, ages, rot tiers |
Configuration
Env var | Default | Purpose |
|
| Where your exported cookies live |
|
| Page cache and request ledger |
Development
pip install -r requirements.txt pytest ruff
pytest # offline: synthetic fixtures + a loopback server, no forum traffic
ruff check .The test suite never touches the forum. Parsers run against hand-written
fixtures that mirror UC's markup, and the cookie-pinning test points both
www.unknowncheats.me and a look-alike host at a local server to check which
one gets the login.
License
MIT. Not affiliated with UnknownCheats. You are responsible for how you use your account.
Available Tools
5 toolsuc_fetchARead-onlyIdempotent
Fetch any UnknownCheats page as cleaned text. Fallback only.
Use when a structured tool returns nothing parsable, or for a page the other tools do not model (member profiles, wiki pages). Requests to any host other than unknowncheats.me are refused, as are account and posting endpoints, so a link quoted inside a forum post cannot redirect this anywhere.
Args: path: path under /forum/ or a full unknowncheats.me URL. chars: output budget.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, but the description adds genuinely non-derivable behavior: a host allowlist limited to unknowncheats.me, a refusal of account and posting endpoints, and an anti-redirect guarantee. These are precisely the failure modes an agent needs to anticipate before calling.
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?
Front-loaded with purpose, then the fallback trigger, then constraints, then args – a natural decision order with no filler sentences. Every clause earns its place, including the redirect note.
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?
With an output schema present, return shape need not be described, and the description covers the remaining unknowns: when to use it, what it refuses, and what both inputs mean. Nothing required to call it correctly is missing.
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 description coverage is 0%, so the description carries the full burden, and it does define both parameters: path as a /forum/ path or full unknowncheats.me URL, and chars as an output budget. It stops short of stating the error behavior for a malformed path or the unit/token basis of the chars budget, so it is strong but not exhaustive.
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?
States a specific verb (fetch) and resource (any UnknownCheats page, returned as cleaned text), and immediately frames itself as a fallback rather than a primary path. That framing is enough to separate it from the structured siblings uc_thread, uc_forum, and uc_search.
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?
Gives an explicit trigger ('when a structured tool returns nothing parsable') and an explicit scope extension ('a page the other tools do not model – member profiles, wiki pages'), which tells the agent both when to prefer siblings and when this tool is the only option.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uc_forumARead-onlyIdempotent
Browse UnknownCheats by subforum.
With no slug, lists every subforum and its slug — call that once to learn which board a game or topic lives in. With a slug, lists that board's threads newest-activity first, each with its last-post date, so you can see at a glance whether a board is alive and what is current on it.
Args: slug: subforum slug, e.g. "rust", "valorant", "anti-cheat-bypass". page: page of the thread list. limit: threads to render.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| slug | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so safety is covered. The description adds real behavioral context beyond that: results are ordered newest-activity first and include each thread's last-post date, letting an agent judge board liveness.
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 dual-mode behavior is front-loaded in the first paragraph and the args are kept in a compact list. A few phrases are slightly verbose but nothing displaces the important information.
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?
With an output schema present and annotations covering the safety profile, the description needs to supply mode selection, ordering semantics, and param meaning — all of which it does. It stops short of stating pagination boundaries or total thread counts, but that gap is minor.
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 description coverage is 0%, so the description carries the burden, and it does define all three params and their roles. Slug comes with concrete examples ("rust", "valorant", "anti-cheat-bypass"); page and limit are explained only tersely and their default values are left to 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 states a specific verb and resource (browse UnknownCheats by subforum) and clearly splits the two operating modes: no slug = list all subforums, with slug = list that board's threads. It never explicitly names or contrasts a sibling tool (e.g. uc_search or uc_thread), so an agent must infer the division of labor.
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?
It gives actionable usage context — call the no-slug form once to discover which board a topic lives in, then pass a slug to inspect threads. That covers when to use each mode, but there is no explicit when-not guidance or naming of alternative sibling tools for overlapping needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uc_searchARead-onlyIdempotent
Search UnknownCheats — the reference source for game hacking, reverse engineering and anti-cheat work.
Reach for this FIRST, before answering from memory or searching the web, whenever the question touches: game cheat/hack development, anti-cheat (EAC, BattlEye, VAC, Vanguard, FACEIT, ACE), memory reading/writing, offsets, signatures/patterns, structs and RE of a specific game, DMA and hardware cheats, hooking, injection, driver and kernel-mode work, Unity and Unreal internals, ESP/aimbot technique, or bypass and detection-vector questions. Public documentation on these topics is thin, stale or wrong; this forum is where the current answers actually are.
Skip it for anything outside that domain — a call costs ~17s.
Args: query: ONE "quoted phrase", or one or two rare words. The engine ORs loose terms and stops counting at 500, so extra words WIDEN the result set and common words like "detection" or "injection" saturate it — a long natural-language query returns the forum's newest posts, not its best ones. Measured: '"manual mapping"' with mode="threads", title_only=True gives 105 on-topic threads; '"manual map" injection detection' gives 500 of nothing. forum: optional subforum slug (e.g. "rust", "anti-cheat-bypass") to scope the search. Get slugs from uc_forum(). Measured on the same query: 105 hits unscoped, 23 in anti-cheat-bypass, 2 in rust. since: any | week | 2weeks | month | 3months | 6months | year. Use a window when the answer must reflect the game's current build — anything older is likely dead on arrival. sort: newest | oldest | replies | views. Newest is the safe default here because this material rots; sort by replies to find the canonical long-running thread on a topic. mode: "posts" returns individual matching posts with a dated snippet — best for a how-do-I question, but it saturates the 500-result cap easily. "threads" returns one row per thread — pair it with title_only for the sharpest results this forum can give. title_only: match thread titles only. The strongest precision lever here by a wide margin. Start with title_only=True, mode="threads"; fall back to post mode only if that finds nothing. page: results page, 20 per page. limit: rows to render from that page.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | posts | |
| page | No | ||
| sort | No | newest | |
| forum | No | ||
| limit | No | ||
| query | Yes | ||
| since | No | any | |
| title_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered; the description adds valuable non-structured behavior: ~17s call latency, the engine's 500-result saturation cap, OR-based loose term matching, and how mode/title_only interact with that cap. It stops short of describing pagination behavior beyond '20 per page', keeping it below a 5.
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?
Front-loaded with purpose, then usage, then per-argument guidance; nearly every sentence carries concrete evidence rather than filler. It is long, but the length is justified by 8 undocumented parameters — a small trim of the duplicated 'saturation' point would tighten it.
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?
An output schema exists, so return-value explanation is not required, and with 8 params at 0% schema coverage the description supplies exactly what's missing: enum-like value lists, defaults, and the title_only/threads combination that produces the sharpest results.
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 description coverage is 0%, so the description carries the full burden — and it does: every parameter gets meaning, valid values (since windows, sort options, mode values) and, unusually, measured result counts (105 vs 23 vs 2 hits) that tell the agent what scoping actually does.
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?
States a specific verb+resource ('Search UnknownCheats') and immediately defines the domain corpus it searches, naming concrete subject matter (anti-cheat systems, offsets, RE, DMA). It is clearly distinguishable from sibling uc_forum/uc_thread/uc_fetch, which are referenced as separate retrieval steps.
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?
Explicitly says to reach for it FIRST before memory or web, enumerates the topic triggers that select it, and gives an explicit skip condition ('anything outside that domain'). It also names the alternative for slug discovery (uc_forum()). This is textbook when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uc_sessionARead-onlyIdempotent
Session health, request budget and cache state.
Call with reload=True after re-exporting cookies.json — the cf_clearance cookie is short-lived, so a run of Cloudflare errors is normally fixed by refreshing that file and reloading, with no restart needed.
| Name | Required | Description | Default |
|---|---|---|---|
| reload | No | ||
| clear_cache | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, and open-world behavior. The description adds valuable operational context beyond that: the cf_clearance cookie is short-lived, refreshing cookies.json and reloading fixes Cloudflare errors, and no restart is needed. It does not explain what clear_cache changes or what request budget means.
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?
Two short paragraphs, front-loaded with the tool's purpose and followed by focused operational guidance. Every sentence earns its place and there is no 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?
An output schema exists, so return values need not be explained, and rich annotations cover safety and idempotency. However, the description omits any explanation of clear_cache and only names session-health/request-budget concepts without elaborating, leaving a meaningful gap for a two-parameter tool.
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 description coverage is 0%, so the description must carry both parameters. It explains reload=True well by giving the condition and purpose, but it never mentions clear_cache, leaving one of two parameters undocumented beyond its name.
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 first line names the resource (session) and the state it reports (health, request budget, cache), so an agent can identify it as a session diagnostics tool. It is not verb-led, but it is specific enough and clearly distinct from the uc_search/thread/forum/fetch siblings.
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 second paragraph gives a concrete when-to-use scenario for reload=True: after re-exporting cookies.json, when Cloudflare errors occur, and notes no restart is needed. It does not discuss when to call the tool itself, when to use clear_cache, or alternatives, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uc_threadARead-onlyIdempotent
Read the posts of one UnknownCheats thread, each stamped with its date.
Args: path: the thread path or full URL exactly as printed by uc_search or uc_forum, e.g. "rust/164256-rust-reversal-structs-offsets.html". page: page number, or "last" / -1 for the newest posts. On a thread that has run for years the last page is usually the only current part — page 1 can be a decade old. chars: per-post character budget before truncation. Raise it when a single post holds the code or structure you actually need.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| path | Yes | ||
| chars | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive behavior, so the safety bar is low. The description adds real behavioral value beyond them: posts are truncated at a per-post character budget, and pagination semantics on long-lived threads. It does not discuss rate limits or return shape, but the output schema covers the latter.
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?
Front-loaded with the purpose sentence, then a clean per-argument list where every entry earns its place. The prose is slightly verbose but no sentence is wasted or redundant.
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?
An output schema exists so return values need not be described, and all three parameters are fully documented along with page-vs-last tradeoffs. Nothing an agent needs to invoke this correctly is missing.
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 description coverage is 0%, so the description must carry the full burden, and it does: path is defined with a concrete example format and its source tools, page accepts an integer or "last"/-1 with a meaningful default, and chars is explained as a truncation budget with guidance on when to raise it.
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 first sentence states a specific verb and resource — 'Read the posts of one UnknownCheats thread' — and adds the date-stamping scope. It does not explicitly contrast itself with siblings like uc_search or uc_fetch beyond noting where the path format comes from, so it is clear but not fully sibling-differentiating.
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?
It gives actionable context: use page "last" or -1 for current content because page 1 on an old thread is likely stale, and raise chars when a post holds needed code. It stops short of naming alternative tools or when-not-to-use conditions, so it is strong context without explicit routing.
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.
5 tool updates
v1.1.0- First observed
uc_fetch - First observed
uc_forum - First observed
uc_search - First observed
uc_session - First observed
uc_thread
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: session management, search, thread reading, forum browsing, and a fallback fetch. The descriptions explicitly clarify boundaries, such as uc_fetch being a fallback for unmodeled pages. No overlap causes confusion.
All tool names follow a consistent 'uc_' prefix plus a single noun or verb (uc_session, uc_search, uc_thread, uc_forum, uc_fetch). The pattern is predictable and easy to scan.
Five tools are well-scoped for a read-only forum access server. Each tool earns its place: session handling, search, thread reading, forum browsing, and a generic fallback fetch. No bloat or missing essentials.
The surface covers the full read-only lifecycle: authentication/cookie refresh (uc_session), discovery via search (uc_search) and browsing (uc_forum), deep retrieval (uc_thread), and a general fallback (uc_fetch) for unmodeled pages. No obvious gaps for the stated purpose of accessing UnknownCheats content.
Maintenance
Related MCP Connectors
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
Public MCP server for discovering open jobs. Search, filter, and get application links.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Related MCP Servers
- FlicenseBqualityDmaintenanceAn MCP server that provides tools for searching and analyzing Claude Code conversation history.84-
- FlicenseAqualityCmaintenanceMCP server that exposes Discord and Twitch/Chatty chat log query tools to Claude Code, enabling searching messages, channel stats, user messages, and events from chat logs.7-
- AlicenseAqualityCmaintenanceA local MCP server that indexes and searches your past Claude sessions using SQLite FTS5. No cloud, runs entirely on your machine.3MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that enables searching Discord messages using Discord's native search API. Designed for use with Claude Code to find project decisions and communications in Discord.-