Rust MCP server for UnknownCheats + Elitepvpers
Authenticated vBulletin forum tools over stdio, with secrets kept local.
Forum MCP gives AI clients a local, publishable bridge to two vBulletin-style forums:
| Forum | Tool prefix | Auth source | Reads | Writes |
|---|---|---|---|---|
| UnknownCheats | none | UC_COOKIE |
yes | gated |
| Elitepvpers | elitepvpers_ |
EP_COOKIE |
yes | gated |
Write tools never run unless UC_ENABLE_WRITES=true is set in your local .env.
flowchart LR
A[AI client] -->|MCP stdio| B[forum-mcp]
B --> C{tool prefix}
C -->|none| D[UnknownCheats]
C -->|elitepvpers_| E[Elitepvpers]
B --> F[.env cookies]
B --> G[write gate]
G -->|UC_ENABLE_WRITES=false| H[block writes]
G -->|UC_ENABLE_WRITES=true| I[submit forum forms]
git clone https://github.com/yourname/unknowncheats-mcp.git
cd unknowncheats-mcp
cp .env.example .env
# edit .env with your local cookies
cargo build --releaseAdd to your MCP client:
{
"mcpServers": {
"forum-mcp": {
"command": "/absolute/path/to/unknowncheats-mcp/target/release/unknowncheats-mcp",
"cwd": "/absolute/path/to/unknowncheats-mcp"
}
}
}.env is intentionally ignored by git.
UC_BASE_URL=https://www.unknowncheats.me/forum/
UC_COOKIE="bbsessionhash=...; bbuserid=...; bbpassword=...; darktheme_enabled=1"
UC_USERNAME=
UC_PASSWORD=
EP_BASE_URL=https://www.elitepvpers.com/forum/
EP_COOKIE="bbsessionhash=...; bbuserid=...; bbpassword=...; vbseo_loggedin=yes"
EP_USERNAME=
EP_PASSWORD=
UC_ENABLE_WRITES=false| Variable | Required | Purpose |
|---|---|---|
UC_COOKIE |
yes | UnknownCheats authenticated cookie header |
EP_COOKIE |
no | Elitepvpers authenticated cookie header |
UC_ENABLE_WRITES |
no | Enables all write/form tools when true |
*_BASE_URL |
no | Override forum URL for forks/mirrors |
*_USERNAME, *_PASSWORD |
no | Stored for future auth workflows; cookies are used now |
Both UnknownCheats and Elitepvpers may present Cloudflare challenges.
Automatic:
- First, the MCP uses authenticated
reqwestwith your forum cookies. - If a response is a Cloudflare challenge, it tries FlareSolverr through
antibot-rs. - If FlareSolverr is unavailable or fails, set
UC_FETCH_CMDorFORUM_FETCH_CMDto a local stealth fetch command. The command receives the URL as argv[1], receives cookies inFORUM_COOKIE, and must print HTML to stdout.
Local tested fetch command:
UC_FETCH_CMD=/tmp/unknowncheats-mcp/tools/uc-fetch.pyManual cookie refresh:
- Visit the forum in a browser.
- Complete the Cloudflare check.
- Export all cookies from browser devtools (Application > Cookies).
- Include
cf_clearancein the matching*_COOKIEvalue if present.
The server aims for practical full normal-user coverage through three layers:
- Named tools for common forum actions.
- Generic
get_page+submit_formfor any text-only form your account can access. - Generic
submit_multipart_formfor uploads/attachments and file-backed forms.
flowchart TD
A[Capability] --> B[Named read tools]
A --> C[Named write tools]
A --> D[Generic escape hatch]
B --> B1[list forums]
B --> B2[read threads]
B --> B3[private messages]
C --> C1[reply/create/edit/delete/report]
D --> D1[get_page]
D --> D2[submit_form]
D --> D3[submit_multipart_form]
| UnknownCheats | Elitepvpers | Description |
|---|---|---|
list_forums |
elitepvpers_list_forums |
List forum categories |
search_forum |
elitepvpers_search_forum |
Search threads |
list_threads |
elitepvpers_list_threads |
List threads in a forum |
read_thread |
elitepvpers_read_thread |
Read posts in a thread |
get_profile |
elitepvpers_get_profile |
Fetch user profile page |
get_logged_in_user |
elitepvpers_get_logged_in_user |
Fetch account page |
list_private_messages |
elitepvpers_list_private_messages |
Fetch PM page |
user_cp |
elitepvpers_user_cp |
Fetch user control panel |
subscribed_threads |
elitepvpers_subscribed_threads |
Fetch subscriptions |
attachments |
elitepvpers_attachments |
Fetch attachment manager |
get_page |
elitepvpers_get_page |
Fetch any forum-relative page |
All tools below require UC_ENABLE_WRITES=true.
| UnknownCheats | Elitepvpers | Description |
|---|---|---|
reply_to_thread |
elitepvpers_reply_to_thread |
Reply to a thread |
create_thread |
elitepvpers_create_thread |
Create a thread |
send_private_message |
elitepvpers_send_private_message |
Send PM |
edit_post |
elitepvpers_edit_post |
Edit post if permitted |
delete_post |
elitepvpers_delete_post |
Delete post if permitted |
report_post |
elitepvpers_report_post |
Report post |
submit_form |
elitepvpers_submit_form |
Submit any form path with fields |
submit_multipart_form |
elitepvpers_submit_multipart_form |
Submit multipart forms with local files |
Use this when a site feature has no named tool.
sequenceDiagram
participant AI as AI client
participant MCP as forum-mcp
participant Site as Forum
AI->>MCP: get_page(path)
MCP->>Site: GET path with cookies
Site-->>MCP: HTML form + hidden fields
MCP-->>AI: raw page HTML
AI->>MCP: submit_form(path, fields)
AI->>MCP: or submit_multipart_form(path, fields, files)
MCP->>MCP: check UC_ENABLE_WRITES
MCP->>Site: POST form/multipart with cookies
Site-->>MCP: result page
MCP-->>AI: result HTML
Example:
{
"path": "profile.php?do=updateprofile",
"fields": {
"field_name": "value",
"securitytoken": "token-from-get_page"
}
}Multipart upload:
{
"path": "newattachment.php?do=manageattach",
"fields": {
"securitytoken": "token-from-get_page"
},
"files": [
{
"field": "upload",
"path": "/absolute/path/to/file.zip"
}
]
}.envexists locally only.env.examplecontains placeholders only- no real cookies in README, tests, CI, or docs
- writes disabled by default
- CI runs fmt, clippy, tests
Quick local check:
cargo fmt --check
cargo clippy --all-targets -- -D warnings
cargo test
cargo build --releasecargo test
cargo fmt
cargo clippy --all-targets -- -D warningsProject layout:
src/
cloudflare.rs # Byparr/FlareSolverr integration for EPVP
config.rs # .env loading and secret redaction
forum_client.rs # authenticated vBulletin HTTP client
mcp.rs # MCP JSON-RPC tool dispatch
parser.rs # small HTML parsers
- HTML parsing is template-dependent. If either forum changes markup, update
parser.rsand tests. - Generic
get_page+submit_formcovers account-level capabilities without hardcoding every forum form. - Admin/mod-only actions still depend on the permissions of the cookies you provide.